call conventions 是在调用函数时要遵守的一系列的约定,包括怎样传参数,怎样返回值,怎样管理栈及帧指针等。主流的约定有三种:stdcall,cdecl,fastcall。c++中的thiscall。
1.cdecl
- c语言的默认调用约定
- 参数用栈,以从右到左传递,返回值用eax来传递。
- 调用者负责清理堆栈,这使得cdecl支持可变参数,同时也不会把参数的数目附加到函数名后面,汇编器和连接器便不能确定参数的数目
2.stdcall
- Win32 API的调用约定,因为stdcall被Microsoft严格的定义,所以所有编译器的实现方式相同。
- 参数从右到左传递,返回值在eax中。
- 被调用者负责清理堆栈,因此stdcall不支持变长参数,但是在函数名后面会附加参数的字节数。
3.fastcall
- 前2个或3个 32-bit(或更小)的参数用寄存器来传递,经常使用edx,ecx,eax,其他的参数或大于4 Byte的参数用栈来传递,通常也是按从右到左方向传递。
- 如果使用了堆栈的话,通常是调用函数负责清理堆栈。
- 建议只有参数是1到3个32bit的参数,并且对速度要求较高的情景下使用。
4.thiscall
- 指向类的指针用ecx来传递,参数按从右向左压入堆栈,返回值在eax中。