Articles of 组装

从c调用汇编函数

我想从一个C项目中调用一个汇编中的函数。 这个函数应该调用一个libc函数,让我们说printf() ,但是我一直得到一个分段错误。 在.c文件中,我有这个函数的声明 int do_shit_in_asm() 在.asm文件中我有 .extern printf .section .data printtext: .ascii "test" .section .text .global do_shit_in_asm .type do_shit_in_asm, @function do_shit_in_asm: pushl %ebp movl %esp, %ebp push printtext call printf movl %ebp, %esp pop %ebp ret 任何指针评论将不胜感激。 as func.asm -o func.o gcc prog.c func.o -o prog

x86 Linux汇编程序从_start获取程序参数

我试图创build一个程序,只是写在屏幕上的参数。 我创build了一些程序来获取C函数参数,或者我用C将参数发送到我的asm程序。 有没有办法只使用汇编程序来获取程序参数 EX: ./Program "text" 我正在使用(Gnu汇编) 通常我使用这些参数 [esp+4] 因为esp是程序/函数调用指针,但是在纯粹的asm中却没有得到命令行参数。 有没有办法做到这一点? 我GOOGLE了,但我无法find很多信息

在64位ubuntu编译32位汇编程序

我有用32位汇编语言编写的程序…现在我只是不能在64位操作系统上编译它。 在我们的学校他们是具体的,程序必须写在32位版本。 这是我的程序: bits 32 extern _printf global _start section .data message db "Hello world!!", 10, 0 section .text _start: pushad push dword message call _printf add esp, 4 popad ret 任何想法? 我已经尝试了很多方法来编译它。 编译后输出错误: nasm -f elf64 vaja4.asm ld vaja4.o -o vaja4 ./vaja4 输出: vaja4.o: In function `_start': vaja4.asm:(.text+0x7): undefined reference to `_printf'

在Linux x86 GAS程序集中是否可以创build没有系统调用的线程?

在学习“汇编语言”的时候(在x86架构上,使用GNU作为汇编语言),其中一个时刻就是使用系统调用的可能性。 这些系统调用非常方便,有时甚至是必要的,因为程序在用户空间中运行 。 然而,系统调用在性能方面相当昂贵,因为它们需要中断(当然还有一个系统调用),这意味着上下文切换必须从用户空间中的当前活动程序切换到在内核空间中运行的系统。 我想说的是:我正在实现一个编译器(用于大学项目),我想添加的额外function之一是支持multithreading代码,以提高编译的程序的性能。 因为一些multithreading的代码会由编译器自动生成,所以这几乎可以保证multithreading代码中会有一小部分。 为了取得胜利,我必须确定使用线程会使这种情况发生。 然而,我的恐惧是,为了使用线程,我必须进行系统调用和必要的中断。 微小的(自动生成的)线程将因此受到进行这些系统调用所花费的时间的高度影响,甚至可能导致性能下降。 因此,我的问题是双重的(下面有一个额外的奖励问题): 是否有可能编写可以同时在多个内核上同时运行多个线程的汇编代码, 而不需要系统调用? 如果我有非常小的线程(线程总执行时间很小),性能会有所下降,还是不值得花费精力,我会获得性能上的提升吗? 我的猜测是multithreading汇编代码不可能没有系统调用。 即使是这样的情况,你是否有build议(甚至更好:一些真正的代码)尽可能高效地执行线程?

从C程序加载原始代码

我正在写一个程序,加载和执行代码从文件。 但我有一个问题:“写”系统调用不起作用。 代码成功加载并执行,但不在屏幕上显示任何文本。 加载代码的程序: #include < stdio.h > #include < stdlib.h > int main(int argc,char* argv[]) { unsigned int f_size = 0; unsigned char* code_buf = NULL; void (*func_call)(void) = NULL; if(argc < 2) { printf("Usage: %s <FILE>\n",argv[0]); return 1; } FILE* fp = fopen(argv[1],"rb"); if(!fp) { printf("Error while opening this file: %s\n",argv[1]); return 1; […]

你好世界在Windows程序集中使用nasm

我正在使用nasm来编译下面的程序集。 但是,代码在Windows下的控制台崩溃。 C:\> nasm -f win32 test.asm -o test.o C:\> ld test.o -o test.exe section .data msg db 'Hello world!', 0AH len equ $-msg section .text global _WinMain@16 _WinMain@16: mov edx, len mov ecx, msg mov ebx, 1 mov eax, 4 int 80h mov ebx, 0 mov eax, 1 int 80h 根据这个post 。 mainfunction在Windows下不可用,必须由WinMainreplace。 因此,如果您的入口点是_start或main […]

如何用汇编语言打印彩色string?

Jan db " January$ " string db "Sun Mon Tue Wed Thu Fri Sat$" string1 db " 1 2 3$" string2 db " 4 5 6 7 8 9 10$" string3 db "11 12 13 14 15 16 17$" string4 db "18 19 20 21 22 23 24$" string5 db "25 26 27 28 29 […]

系统调用窗口和原生API?

最近我在* NIX操作系统中使用了很多汇编语言。 我想知道的Windows域。 在linux中调用约定: mov $SYS_Call_NUM, %eax mov $param1 , %ebx mov $param2 , %ecx int $0x80 而已。 这就是我们应该如何在Linux中进行系统调用。 在Linux中引用所有的系统调用: 关于哪个$ SYS_Call_NUM&我们可以使用这个参考: http ://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html 官方参考: http : //kernel.org/doc/man-pages/online/dir_section_2.html 在Windows中调用约定: ??? 在Windows中引用所有系统调用: ??? 非官方的: http : //www.metasploit.com/users/opcode/syscalls.html ,但我怎样才能在汇编中使用这些,除非我知道调用约定。 官方:??? 如果你说,他们没有logging。 那么如何在不知道系统调用的情况下为Windows编写libc? 如何做一个Windows汇编程序devise? 至less在驱动程序编程中需要知道这些。 对? 现在,所谓的Native API呢? 本Native API和System calls for windows都是不同的术语是指同一件事情? 为了证实我比较了这两个非官方来源 系统调用: http : //www.metasploit.com/users/opcode/syscalls.html […]

Windows系统调用

我对Linux上使用系统调用(我使用GNU汇编程序)的汇编有一个(非常)基本的理解。 在Windows 7上,我使用GCC编译器套件的MinGW(32位)端口来生成汇编程序。 在Linux上,我经常在我的汇编程序中使用C库进行一些操作系统交互,而在我的Windows平台上,使用MinGW也能很好地工作。 然而,有时候,我想要使用底层的系统调用 – 主要是为了让我的可执行文件尽可能小。 在Linux上,我知道如何做到这一点: movl $0, %ebx movl $1, %eax int $0x80 ; exit with code 0 我还使用这些系统调用来读写terminal上的字符(例如在EAX中用4写入系统调用)。 我想知道如何在Windows NT平台上做到这一点。 可能吗? 我看了看这个表 ,但是我不太了解系统调用的名字。 任何帮助是受欢迎的。

如何在16位MASM程序集x86中创build睡眠function?

我正在试图在16位MASM程序集x86中创build一个睡眠/延迟程序,比如每500ms在屏幕上打印一个字符。 从我所做的研究,似乎有三种方法来实现这一点 – 我想使用CPU时钟滴答。 请注意我在Mac OS X Snow Leopard上通过VMWare Fusion运行Windows XP – 我不确定这是否会影响任何内容。 有人可以请我指出正确的方向,或者提供一个我可以调整的工作代码? 谢谢! 我find的代码应该每秒在屏幕上打印“A”,但不起作用(无论如何我都要使用毫秒)。 TOP: MOV AH,2C INT 21 MOV BH,DH ; DH has current second GETSEC: ; Loops until the current second is not equal to the last, in BH MOV AH,2C INT 21 CMP BH,DH ; Here is the comparison to […]