vc++的调用约定
32-bit x86 调用约定
本文只讨论微软编译器用到的调用约定,不讨论windows以外的操作系统,也不讨论vc++以外的编译器
说到调用约定,大家应该知道c++成员函数的第一个参数是this指针。
开始
32位的x86 的调用约定都会保存EDI, ESI, EBP, EBX这几个寄存器, 返回值使用EDX:EAX对
C (__cdecl)
参数入栈顺序:从右到左
参数退栈:调用方
函数名修饰:名字后加个下划线
__stdcall
Win32在用的调用约定,变参函数(variadic functions)除外(变参函数必须使用__cdecl)。
参数入栈顺序:从右到左
参数退栈:被调用方
函数名修饰:名字前加下划线,后加@,加参数所占字节数的大小(the number of bytes of parameters taken)
__fastcall
前两个参数送到ECX,EDX,剩下的参数入栈同__stdcall
参数入栈顺序:从右到左
参数退栈:被调用方
函数名修饰:名字前后加@,后面再加参数所占字节数的大小(the number of bytes of parameters taken)
thiscall
第一个参数(this)送到ECX,剩下的参数入栈同__stdcall
参数入栈顺序:从右到左
参数退栈:被调用方
函数名修饰:复杂的c++的名字修饰规则,包含每个参数的类型,因为支持overloading,所以必须这样
最后
调用约定是调用方与被调用方之间的一个合约,大家约定好了如何保存(与恢复)寄存器(与堆栈),不守约定程序就会崩溃