【发布时间】:2013-01-07 11:46:35
【问题描述】:
我一直在学习 IA-32 汇编编程。所以我想在汇编中编写一个函数并从 C++ 中调用它。
我所关注的教程实际上是针对 x64 汇编的。但我正在研究 IA-32。 在 x64 中,它表示函数参数存储在 RCX、RDX、R8、R9 等寄存器中。
但是稍微搜索一下,我可以理解在 IA-32 中,参数存储在堆栈中,而不是寄存器中。
以下是我的 C++ 代码:
#include <iostream>
#include <conio.h>
using namespace std;
extern "C" int PassParam(int a,int b);
int main()
{
cout << "z is " << PassParam(15,13) << endl;
_getch();
return 0;
}
下面是 PassParam() 函数的汇编代码(它只是添加了两个参数,仅此而已。仅用于学习目的):
程序集中的PassParam():
.model C,flat
.code
PassParam proc
mov eax,[ebp-212]
add eax,[ebp-216]
ret
PassParam endp
end
在我的汇编代码中,您可以看到我将第一个参数从 [ebp-212] 移至 eax。该值的获得如下:
我用 C++ 本身编写了 PassParam() 函数并将其反汇编。然后检查 ebp 在哪里以及第二个参数存储在哪里(参数从右到左存储)。我可以看到有 212 的差异,所以这就是我获得该值的方式。然后像往常一样,第一个参数在 4 个字节后存储。而且效果很好。
问题:
这是从程序集中访问参数的正确方法吗?我的意思是,是否总是 [ebp-212] 存储参数?
如果没有,谁能解释将参数从 C++ 传递到程序集的正确方法?
注意:
我在 Windows 7 机器上使用 Visual C++ 2010。
【问题讨论】:
-
我认为它通常类似于 esp+4,但我不是这方面的专家,尤其是涉及 VC++ 时。
-
看起来你已经复制粘贴了程序集。这不是它的工作原理。
-
@Tinctorius:不是复制粘贴的。这是我经过大量谷歌搜索后达到的最终工作解决方案。但我自己觉得这是错误的方法(嗯,ebp-212 对我来说没有任何意义)。
标签: c++ function assembly x86 64-bit