x86汇编程序不执行

时间:2013-10-24 09:52:50

标签: windows assembly x86

我是大会新手告诉我这有什么问题,我不知道如何解决这个问题。

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     ;

1 个答案:

答案 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")。