我一直在学习 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。