如何将参数传递给 MASM64 中的过程?
How to pass parameters to procedure in MASM64?
我正在使用 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 条信息放在 保留space 堆栈的下面。
sub rsp, 40h
mov qword ptr [rsp+30h], 0
mov qword ptr [rsp+28h], FILE_ATTRIBUTE_NORMAL
mov qword ptr [rsp+20h], CREATE_ALWAYS
但是在这里,您将这些数据 放在 保留的 space 堆栈中。
然后发生的事情是您在第一个代码段中得到 不平衡堆栈 ,因为您仅使用 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
我正在使用 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 条信息放在 保留space 堆栈的下面。
sub rsp, 40h
mov qword ptr [rsp+30h], 0
mov qword ptr [rsp+28h], FILE_ATTRIBUTE_NORMAL
mov qword ptr [rsp+20h], CREATE_ALWAYS
但是在这里,您将这些数据 放在 保留的 space 堆栈中。
然后发生的事情是您在第一个代码段中得到 不平衡堆栈 ,因为您仅使用 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