如何将参数传递给MASM64中的过程?

时间:2017-09-09 10:04:24

标签: winapi assembly 64-bit parameter-passing masm

我正在学习使用MASM64的x64程序集。我已经读过前4个参数通过寄存器传递给过程:RCXRDXR9R8。如果有更多参数,我们通过堆栈传递它们。

但是有些令人困惑。

为什么此代码不起作用:

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

请解释一下。帮助我 此致,大卫

1 个答案:

答案 0 :(得分:2)

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