assembly 在哪里可以找到要传递给Windows API函数的数据

zkure5ic  于 2022-11-13  发布在  Windows
关注(0)|答案(1)|浏览(136)

据我所知,在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函数的信息?

hsvhsicv

hsvhsicv1#

Windows x64调用约定记录在Microsoft Docs中。
GetStdHandle的调用非常简单:它将STD_OUTPUT_HANDLE(-11)作为使用ECX的第一个参数进行传递;返回值以RAX为单位
WriteConsoleA的调用有点棘手。从技术上讲,该函数有5个参数,最后一个参数是保留的,但代码只传递了4个参数。
请记住,编写完全“正确”的Windows x64程序集是相当棘手的,因为需要异常展开信息。有一些MASM宏,但不知道NASM。

相关问题