簡體   English   中英

x86匯編程序不執行

[英]x86 assembly program does not execute

我是組裝的新手,告訴我這是怎么回事,我不知道如何解決此問題。

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     ;

如前所述,您的程序顯然缺少系統調用。

在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位Windows(或在64位Windows中運行的32位程序)中,基本上有兩種類型的函數:stdcall(= WINAPI,CALLBACK,PASCAL)和cdecl。

對於這兩種類型的函數,參數必須位於堆棧上(第一個參數必須位於ESP + 0上,第二個參數必須位於ESP + 4上,依此類推),以便您在最后一個先推入時“推”參數示例“ 1”是第一個,“ len”是最后一個)。 函數的結果(如果有的話)將在EAX寄存器中返回(只要它不是浮點值)。

然后調用在DLL中定義的函數。 最后,該函數將進行系統調用,但是該系統調用可能是特定於版本的! 您不必擔心。

對於“ stdcall”函數,該函數將從堆棧中刪除參數。 (對於參數數量可變的函數(例如wsprintf),僅刪除必需的參數。)在匯編器中,此類函數被命名為:

_Name@nnn

而“名稱”是C語言中已知的函數名稱,而nnn是將從堆棧中刪除的字節數。 大多數底層Windows函數是stdcall函數。 請注意,使用字符串的函數通常以“ A”結尾以指示ASCII或以“ W”結尾以指示UNICODE字符串。 通常使用“ A”變體。 示例:調用函數“ MessageBox”:

(push 4 arguments)
call _MessageBoxA@16

大多數C標准庫函數都是“ cdecl”-請參見上面的“ write”示例。 Cdecl函數不會調整堆棧指針,因此您必須在“調用”指令之后添加“ add esp,nnn”。 通過在下划線后面添加C函數名稱即可簡單地形成名稱(例如,“ write()”->“ call _write”)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM