winapi - 如何向MASM64中的过程传递参数?

标签 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

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

最佳答案

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/

相关文章:

tfs - Team Foundation和64位Windows,无法安装?

winapi - 将 `Ex`添加到函数/方法名称是什么意思?

c++ - 获取正确的案例工作目录?

在 Unix 系统上使用时,Python Ctypes 函数调用段错误

c++ - 64位系统的优点

visual-studio - WSE 客户端项目不断将 WebServicesClientProtocol 恢复为 SoapHttpClientProtocol

c++ - MFC中如何获取可见显示器的宽度?

c# - SetFilePointer 不会失败,也不会移动指针

计算机之间的 C 目标文件兼容性

c++ - 保护可执行文件免受逆向工程?