调用约定 | 参数压栈顺序 | 平衡堆栈 |
---|
__cdecl | 从右至左入栈 | 调用者清理栈 |
__stdcall | 从右至左入栈 | 自身清理堆栈 |
__fastcall | ECX/EDX传送前两个; 剩下:从右至左入栈 | 自身清理堆栈 |
1、__cdecl
int __cdecl Plus(int a, int b)
{
return a+b;
}
push 2
push 1
call @ILT+15(Plus) (00401014)
add esp,8 //外平栈
2、 __stdcall
int __stdcall Plus(int a, int b)
{
return a+b;
}
push 2
push 1
call @ILT+10(Plus) (0040100f)
函数内部:
ret 8 //内平栈
3、__fastcall
int __fastcall Plus(int a, int b)
{
return a+b;
}
mov edx,2
mov ecx,1
call @ILT+0(Plus) (00401005)
函数内部:
ret //因为使用寄存器,所以不需要平衡堆栈
4、__fastcall
int __fastcall Plus(int a, int b)
{
return a+b+c+d;
}
push 4
push 3
mov edx,2
mov ecx,1
call @ILT+5(Plus) (0040100a)
函数内部:
ret 8 //因为压栈了4和3,所以需要内平栈