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

Posted

技术标签:

【中文标题】如何将参数传递给 MASM64 中的程序?【英文标题】:How to pass parameters to procedure in MASM64? 【发布时间】:2017-09-09 10:04:23 【问题描述】:

我正在使用 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

请帮我解释一下。 问候,大卫

【问题讨论】:

第 5 个参数必须在 [rsp+20h] 中,第 6 个参数必须在 [rsp+28h] 中,以此类推。同样在调用 rsp 之前必须是多个 10h 【参考方案1】:
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

但在这里,您将这些数据放在堆栈上的保留空间中。

然后发生的情况是,您在第一个 sn-p 中最终得到一个不平衡堆栈,因为您只使用 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

【讨论】:

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

以上是关于如何将参数传递给 MASM64 中的程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SwiftUI 将参数传递给 Button 的操作

如何将命令行参数传递给 WinForms 应用程序?

TCL/Expect 相当于 Bash $@ 或如何将参数传递给 TCL/Expect 中的衍生进程

如何通过 JCL 将参数传递给 REXX 程序

如何将可选参数传递给 C++ 中的方法?

如何将参数传递给 Play 中的 Jobs!框架 1.2.x?