为什么要有调用约定?
1、当参数个数多于一个时,按什么顺序把参数压入栈?
2、函数调用后,由谁来把堆栈恢复原装。
_cdecl C标准调用约定
int fun(char *a,unsigned long) -----"?fun@@YAHPADK@Z"
YA
函数采用从右到左的压栈方式
_stdeall windows标准调用约定
int fun(char *a,unsigned long) -----"?fun@@YGHPADK@Z"
YG
函数采用从右到左的压栈方式
_fastcall 快速调用约定
YI
int fun(char *a,unsigned long) -----"?fun@@YIHPADK@Z"
它通过寄存器来传送参数,实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈。
_thiscall 类成员方法的调用约定
- 符号的生成
- 实参的入栈顺序
- 形参的开辟和清理方式
_cdecl 开辟:调用方 清理:调用方
_stdeall 开辟:调用方 清理:被调用方
_fastcall 开辟:调用方 清理:被调用方