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

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

问题描述:

我正在学习与MASM64的x64程序集。我已经读过,前4个参数通过寄存器传递给过程:RCX,RDX,R9R8。如果有更多的参数,我们通过堆栈传递它们。如何将参数传递给MASM64中的过程?

但有一些令人困惑。

为什么这个代码不工作:

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

5个参数必须* [RSP + 20H] *,6个在* [RSP + 28H] *等。也* *之前致电* rsp *必须是多个10h – RbMm

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 
+0

谢谢!但是有没有正确的方法来使用'push'?如何使用'push'修复代码? – Dave