我正在学习使用 MASM64 的 x64 汇编。我读到前 4 个参数通过寄存器传递给过程:RCX
、RDX
、R9
和 R8
>。如果有更多参数,我们通过堆栈传递它们。
但是有一些令人困惑的事情。
为什么这段代码不起作用:
sub rsp, 40h
push 0
push FILE_ATTRIBUTE_NORMAL
push CREATE_ALWAYS
xor r8, r8
xor r9, r9
mov rdx, GENERIC_READ or GENERIC_WRITE
mov rcx, offset szSavePath
call CreateFileA
add rsp, 40h
但是这段代码有效:
sub rsp, 40h
mov qword ptr [rsp+30h], 0
mov qword ptr [rsp+28h], FILE_ATTRIBUTE_NORMAL
mov qword ptr [rsp+20h], CREATE_ALWAYS
xor r8, r8
xor r9, r9
mov rdx, GENERIC_READ or GENERIC_WRITE
mov rcx, offset szSavePath
call CreateFileA
add rsp, 40h
请帮我解释一下。
此致,大卫
最佳答案
sub rsp, 40h push 0 push FILE_ATTRIBUTE_NORMAL push CREATE_ALWAYS
在这里,您将 3 条信息放入堆栈的保留空间下方。
sub rsp, 40h
mov qword ptr [rsp+30h], 0
mov qword ptr [rsp+28h], FILE_ATTRIBUTE_NORMAL
mov qword ptr [rsp+20h], CREATE_ALWAYS
但在这里,您将这些数据放在堆栈上的保留空间内。
接下来会发生的情况是,由于您仅使用 add rsp, 40h
释放了保留数量,因此您最终会在第一个代码段中得到一个不平衡堆栈。
相同的代码,但使用推送:
push 0
push FILE_ATTRIBUTE_NORMAL
push CREATE_ALWAYS
sub rsp, 20h
xor r8, r8
xor r9, r9
mov rdx, GENERIC_READ or GENERIC_WRITE
mov rcx, offset szSavePath
call CreateFileA
add rsp, 20h + 18h
关于winapi - 如何向MASM64中的过程传递参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46129460/