我是大会新手告诉我这有什么问题,我不知道如何解决这个问题。
section .text
global _start
_start:
mov edx,len
mov ecx,msg
mov ebx,1
mov eax,4
mov eax,1
section .data
msg db 'Hello, world!', 0xa ;
len equ $ - msg ;
答案 0 :(得分:3)
如前所述,您的程序显然错过了系统调用。
在Windows下(就生成Windows的.EXE文件而言),没有直接的系统调用。相反,您必须调用Windows附带的DLL中的函数。
示例:
mov ecx,len
push ecx
mov ecx,msg
push ecx
mov ecx,1
push ecx
call _write
add esp,12
在32位窗口(或在64位窗口中运行的32位程序)中,基本上有两种类型的函数:stdcall(= WINAPI,CALLBACK,PASCAL)和cdecl。
对于这两种类型的函数,参数必须在堆栈上(第一个参数必须在ESP + 0,第二个参数在ESP + 4,依此类推)所以你" push"最后一个被推送的参数(在示例中" 1"是第一个和" len"是最后一个)。函数的结果(如果有的话)在EAX寄存器中返回(只要它不是浮点值)。
然后调用DLL中定义的函数。最后该函数将执行系统调用,但此系统调用可能是特定于版本的!你不必关心它。
在" stdcall"函数函数将从堆栈中删除参数。 (对于具有可变数量参数的函数 - 如wsprintf - 仅删除必需参数。)在汇编程序中,此类函数名为:
_Name@nnn
while"姓名"是C语言中已知函数的名称,nnn是将从堆栈中删除的字节数。大多数低级Windows功能都是stdcall功能。请注意,使用字符串的函数通常以" A"表示ASCII或" W"表示UNICODE字符串。您通常使用" A"变种。示例:调用函数" MessageBox":
(push 4 arguments)
call _MessageBoxA@16
大多数C标准库函数都是" cdecl" - 看"写"的例子以上。 Cdecl函数不会调整堆栈指针,因此您必须添加一个"添加esp,nnn"在"呼叫"之后指令。通过在下划线后添加C函数名称来简单地形成名称(例如" write()" - >" call _write")。