首先,比较C++ 中的三种函数调用方式。
测试代码:
int _stdcall Add1(int x1, int x2, int x3)
{
return x1 + x2 + x3;
}
int __cdecl Add2(int x1, int x2, int x3)
{
return x1 + x2 + x3;
}
int __fastcall Add3(int x1, int x2, int x3)
{
return x1 + x2 + x3;
}
void FTest2()
{
int x[] = {1, 2, 3};
int ret;
ret = Add1(x[0], x[1], x[2]);
ret = Add2(x[0], x[1], x[2]);
ret = Add3(x[0], x[1], x[2]);
}
先看看在调用这些函数时调用者作些什么工作
__cdecl |
_stdcall |
__fastcall |
ret = Add2(x[0], x[1], x[2]); |
ret = Add1(x[0], x[1], x[2]); |
ret = Add3(x[0], x[1], x[2]); |
0040179F mov eax,dword ptr [ebp-4] 004017A2 push eax 004017A3 mov ecx,dword ptr [ebp-8] 004017A6 push ecx 004017A7 mov edx,dword ptr [x] 004017AA push edx 004017AB call Add2 (401750h) 004017B0 add esp,0Ch 004017B3 mov dword ptr [ret],eax |
0040178B mov eax,dword ptr [ebp-4] 0040178E push eax 0040178F mov ecx,dword ptr [ebp-8] 00401792 push ecx 00401793 mov edx,dword ptr [x] 00401796 push edx 00401797 call Add1 (401760h)
0040179C mov dword ptr [ret],eax |
004017B6 mov eax,dword ptr [ebp-4] 004017B9 push eax 004017BA mov edx,dword ptr [ebp-8] |