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,所以必须这样

最后

调用约定是调用方与被调用方之间的一个合约,大家约定好了如何保存(与恢复)寄存器(与堆栈),不守约定程序就会崩溃

posted on 2020-03-19 19:50  ConfuciusPei  阅读(265)  评论(0编辑  收藏  举报