簡體   English   中英

Windows 8 x64上的匯編代碼

[英]assembly code on Windows 8 x64

我是接近使用匯編代碼編程的硬件新手。 所以我讀了一本關於它的書,並找到了NASM匯編程序的示例代碼:

segment .text                               ;code segment
global main                                 ;must be declared for linker
main:                                       ;tell linker entry point
mov edx,len                                 ;message length
mov ecx,msg                                 ;message to write
mov ebx,1                                   ;file descriptor (stdout)
mov eax,4                                   ;system call number (sys_write)
int 0x80                                    ;call kernel
mov eax,1                                   ;system call number (sys_exit)
int 0x80                                    ;call kernel

segment .data                               ;data segment
msg db 'Hello, world!',0xa                  ;our dear string
len equ $ - msg                             ;length of our dear string

所以我用以下命令編譯它:

nasm -f elf64 helloworld.asm
ld -s -o helloworld.exe helloworld.o

匯編程序組裝它沒有問題,沒有錯誤,但程序立即崩潰。 我讀到了不同的匯編語言,但重點是匯編代碼因不同的編譯器而不同,操作系統不同,所以我的錯誤在哪里?

您要顯示的代碼是x86_32 linux代碼。
你可以告訴,因為它使用Windows沒有的int調用和這行:

nasm -f elf64 helloworld.asm

ELF格式生成輸出,這是一個linux可執行文件。
Windows使用PE (可移植可執行文件) ,它是COFF的MS EEE變體。

x64代碼使用RAXRBX ....雖然32位變體寄存器EAX等也很重要。

在學習如何編寫匯編之前。
您需要知道ABI(調用約定)和系統的API。

對於ABI,請查看: 呼叫約定 - PDF

如果你想知道如何在Windows中進行API調用,編寫一個簡單的C程序來完成這項工作,然后獲得一個反匯編程序並查看x86代碼。
有關API調用的更多信息,請查看MSDN,具體如下:

x64調用約定概述
Windows控制台功能
ExitProcess函數

在PE格式上組裝您的可執行文件,並將int 0x80更改為call ExecuteInterrupt128 你可以給它一個相同的名字。 您可以學習如何在NASM上編寫PE可執行文件。 只需轉到Stack Overflow的主頁。

ExecuteInterrupt128函數必須如下所示:

push ebp
mov ebp, esp
cmp eax, byte +1
je SleepSystem
cmp eax, byte +4
je PrintString
...
SleepSystem:
push byte -1
call Sleep
leave
ret
PrintString:
push -11
call GetStdHandle
push byte +0
push byte +6
lea esi, [ebp-4]
push edx
push ecx
push eax
call WriteConsoleA
leave
ret

或者嘗試以下命令:

    nasm -f win32 -o executable.o executable.asm
    ld -o executable.exe executable.o

暫無
暫無

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

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