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)
还有另外一种方法吗?
文档说明了一切......在Windows中,前四个整数参数在寄存器中传递RCX,RDX,R8,R9和浮点中XMM0,XMM1,XMM2,XMM3,任何超过四个参数阴影上方的空间栈上传递。对于 Unix 类型的操作系统,它有点不同。
所以,你的例子是正确的 - mov ebx, DWORD PTR[rbp + 48] ; e
阴影空间 = 32 + 保存的 rbp = 40 + 第 5 个参数 = 48