我正在学习使用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
请解释一下。帮助我 此致,大卫
答案 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