據我了解,在 x86-64 匯編中完成作業的最佳方法不是自己編程。相反,讓 windows 為你做這件事。就像打開一個新的控制臺或將文本列印到控制臺視窗一樣。但是,您不能直接呼叫 Windows 系統呼叫,因為這些呼叫可能會在 Microsoft 的彈指之間發生變化。因此,您通過呼叫命令呼叫 Windows API。
因此,我希望能夠在 Windows 10 上以 x86-64 程式集撰寫完整的應用程式,但我很難找到有關 Windows API 的資訊。具體來說,在呼叫 Windows API 函式之前,要向 RCX、RDX、R8 和 R9 傳遞哪些資訊/資料/數字?例如,我在 Internet 上找到的一個 Hello World 程式同時使用了“GetStdHandle”和“WriteConsoleA”。我了解這些做什么,但我不知道所有數字和暫存器操作的含義或它如何影響 Windows API。這是代碼:
extern GetStdHandle
extern WriteConsoleA
section .data
msg: db "HelloWorld"
msglen: equ $-msg
section .bss
section .text
start:
mov ECX, -11
call GetStdHandle
mov RCX, RAX
mov RDX, msg
mov R8, msglen
lea R9, [RSP-16]
call WriteConsoleA
mov EAX, 0
ret
這是用 NASM 編譯并與 Golink 鏈接的。這是制作檔案:
{NasmPath} -f win64 HelloWorld.asm
{GoLinkPath} HelloWorld.obj /console kernel32.dll
為了澄清起見,我沒有通過控制臺運行 {NasmPath} 或 {GoLinkPath},我只是對其進行了編輯,因為實際路徑中有我的名字。
TLDR:我在哪里可以找到有關哪些資料通過暫存器 RCX、RDX、R8 和 R9 傳遞到 Windows API 函式的資訊?
uj5u.com熱心網友回復:
Microsoft Docs中記錄了 Windows x64 呼叫約定。
呼叫GetStdHandle非常簡單:將STD_OUTPUT_HANDLE(-11) 作為使用 ECX 的第一個引數傳遞;回傳值在 RAX 中。
呼叫WriteConsoleA有點棘手。從技術上講,該函式接受 5 個引數,最后一個被保留,但代碼只傳遞了 4 個。
請記住,由于需要例外展開資訊,因此撰寫完全“正確”的 Windows x64 程式集非常棘手。有一些 MASM 宏,但不知道 NASM。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/519510.html
