据我所知,在x86-64汇编中完成工作的最好方法不是自己编写程序。相反,让windows为你做这些。比如打开一个新的控制台或将文本打印到控制台窗口。但是,你不能直接调用windows系统调用,因为这些系统调用在微软的弹指之间就会发生变化。所以,你通过调用命令调用Windows API。
所以,我希望能够在Windows 10上用x86-64汇编语言编写完整的应用程序,但我很难找到关于Windows API的信息。具体来说,在调用Windows API函数之前,需要将哪些信息/数据/数字传递到RCX、RDX、R8和R9中?例如,我在互联网上找到一个HelloWorld程序,它同时使用了“GetStdHandle”和“WriteConsoleA,”我知道这两个程序的作用,但我不知道所有的数字和寄存器操作意味着什么,也不知道它如何影响WindowsAPI。
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。下面是make文件:
{NasmPath} -f win64 HelloWorld.asm
{GoLinkPath} HelloWorld.obj /console kernel32.dll
澄清一下,我没有通过控制台运行{NasmPath}或{GoLinkPath},我只是编辑了它,因为实际路径中有我的名字。
TLDR:我可以在哪里找到有关哪些数据通过寄存器RCX、RDX、R8和R9传递到Windows API函数的信息?
1条答案
按热度按时间hsvhsicv1#
Windows x64调用约定记录在Microsoft Docs中。
对
GetStdHandle
的调用非常简单:它将STD_OUTPUT_HANDLE
(-11)作为使用ECX的第一个参数进行传递;返回值以RAX为单位对
WriteConsoleA
的调用有点棘手。从技术上讲,该函数有5个参数,最后一个参数是保留的,但代码只传递了4个参数。请记住,编写完全“正确”的Windows x64程序集是相当棘手的,因为需要异常展开信息。有一些MASM宏,但不知道NASM。