检索x64 masm程序集过程的参数

UmN*_*obe 6 c++ 64-bit assembly masm visual-studio-2010

我有一个带签名的功能:

extern "C" int foo(int a, int b, int c, int d, int e);
Run Code Online (Sandbox Code Playgroud)

实际上是用汇编语言写的.

使用ml(32位),使用标准调用约定,你几乎可以编写

.code
foo PROC a: DWORD, b: DWORD ,c: DWORD, d: DWORD, e: DWORD

     mov eax, d
     mov ebx, e
Run Code Online (Sandbox Code Playgroud)

并开始使用这些标签来访问您的参数

使用ml64(64位),fastcall是唯一可用的约定.我可以轻松访问存储在寄存器中的第一个参数,但访问堆栈中的参数(e在本例中):我尝试过

.code
foo PROC a: DWORD, b: DWORD ,c: DWORD, d: DWORD, e: DWORD
Run Code Online (Sandbox Code Playgroud)

.code
foo PROC  e: DWORD
Run Code Online (Sandbox Code Playgroud)

但价值e是垃圾.

我发现如果我直接使用堆栈地址,我会找到值.

.code
foo PROC  e: DWORD

     mov eax, r9                  ; d
     mov ebx, DWORD PTR[rbp + 48] ; e
Run Code Online (Sandbox Code Playgroud)

还有另外一种方法吗?

Gun*_*ner 5

文档说明了一切......在Windows中,前四个整数参数在寄存器中传递RCXRDXR8R9和浮点中XMM0XMM1XMM2XMM3,任何超过四个参数阴影上方的空间栈上传递。对于 Unix 类型的操作系统,它有点不同。

所以,你的例子是正确的 - mov ebx, DWORD PTR[rbp + 48] ; e

阴影空间 = 32 + 保存的 rbp = 40 + 第 5 个参数 = 48