我是 asm x86 的新手,我一直在寻找为什么在 x86/visual C++ 2010 上会出现这样的函数调用:
void test()
{
vector2f vec;
vec.x = 1.f;
vec.y = 1.f;
vec = something_on_vector2f(vec);
}
给定:
struct vector2f
{
vector2f() {}
float x;
float y;
};
vector2f something_on_vector2f(vector2f vec)
{
return vec;
}
生成具有如此大的堆栈分配(224 字节)和 3 个“推送”而不是预期的 2 个(推送“x”+推送“y”)的汇编代码
...
00FBB780 55 push ebp
00FBB781 8B EC mov ebp,esp
00FBB783 81 EC E0 00 00 00 sub esp,0E0h (???)
...
002DB7B0 8B 45 F8 mov eax,dword ptr [ebp-8] (push 'x')
002DB7B3 50 push eax
002DB7B4 8B 4D F4 mov ecx,dword ptr [vec] (push 'y')
002DB7B7 51 push ecx
002DB7B8 8D 95 24 FF FF FF lea edx,[ebp-0DCh] (push '???')
002DB7BE 52 push edx
002DB7BF E8 4B E7 FF FF call normalize_vector2f (2D9F0Fh)
...
什么是额外的推送和额外的堆栈分配?
我正在使用 libjit 并且只生成了 2 个 push =>,这会在从 JIT 代码调用函数时创建一个错误,因为本机代码不期望堆栈中的参数具有相同的 EBP 偏移量。