几种调用协议的区别__pascal __cdecl __msfastcall __fastcall __stdcall
2015-06-11 17:33
477 查看
几种调用协议的区别__pascal __cdecl __msfastcall __fastcall __stdcall
参考
下表内容整理自:ms-help://embarcadero.rs2010/rad/C++_Compiler.html
下表内容整理自:http://blog.csdn.net/jia_xiaoxin/article/details/2868216
参考
下表内容整理自:ms-help://embarcadero.rs2010/rad/C++_Compiler.html
__pascal Pascal(-p) | __cdecl C(-pc) | __msfastcall __msfastcall(-pm) | __fastcall Fastcall(register)(-pr) | __stdcall Stdcall(-ps) | |
Generate underbars | no | yes | no | ||
Case sensitive | All uppercase | yes | Preserve case | ||
Who cleans stack | Calling function | Called function | |||
Push parameters | Left to right | Right to left | Passed in registers | Right to left | |
Must pass the correct number and type of arguments | yes | yes | |||
Take varible parameter list | yes |
__pascal | __cdecl | __fastcall | __stdcall | __thiscall | |
生成修饰名 | 输出函数名前加上一个下划线前缀,格式为_functionname | 在输出函数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,格式为@functionname@number | 在输出函数名前加上一个下划线前缀,后面加上一个“@”符号和其参数的字节数,格式为_functionname@number。如函数int func(int a, double b)的修饰名是_func@12 | ||
Who cleans stack | 由被调用者清除 | 由调用者把参数弹出栈 | 被调用的函数在返回前清理传送参数的内存栈 | 由被调用者把参数弹出栈 | |
Push parameters | 从左向右传递参数 | 从右至左的顺序压参数入栈 | 实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,第一个参数进ECX,第2个进EDX,剩下的参数仍旧自右向左压栈 | 从右至左的顺序压参数入栈 | 参数从右到左压 |
返回值 | 通过EAX返回 | 在EAX中 | 在EAX中 | 在EAX中 | |
备注 | 主要特点就是快 | 是Pascal程序的缺省调用方式 | 仅仅应用于"C++"成员函数。this指针存放于CX寄存器,thiscall不是关键词,因此不能被程序员指定 | ||
C编译时函数名修饰约定规则 | _functionname | @functionname@number | _functionname@number | ||
C++编译时函数名修饰约定规则 | 规则同_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YA"。 | 规则同_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YI" | 1)、以"?"标识函数名的开始,后跟函数名; 2)、函数名后面以"@@YG"标识参数表的开始,后跟参数表; 3)、参数表以代号表示: X--void , D--char, E--unsigned char, F--short, H--int, I--unsigned int, J--long, K--unsigned long, M--float, N--double, _N--bool, PA--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以"0"代替,一个"0"代表一次重复; 4)、参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前; 5)、参数表后以"@Z"标识整个名字的结束,如果该函数无参数,则以"Z"标识结束。 其格式为"?functionname@@YG*****@Z"或"?functionname@@YG*XZ",例如 int Test1(char *var1,unsigned long)-----“?Test1@@YGHPADK@Z” void Test2() -----“?Test2@@YGXXZ” |
相关文章推荐
- iOS Mail.app inject kit
- SVN版本控制与分支设置
- Java5
- 用三种不同的方法访问Linux系统上的FTP服务过程详解 推荐
- LPC1788--SYSTEM--启动文件记录
- Auto Layout 使用心得(四)—— 22 行代码实现拖动回弹
- 模块[LCD]_LCD 调试总结
- Webservice SOAP传输序列化总结(转)
- Cocoa Touch的3种类的交流方式delegate/target/notification
- json解析的几种方式
- 「違憲」法制―また砂川とは驚きだ
- programming-challenges Crypt Kicker (110204) 题解
- Masonry介绍与使用实践 - iOS移动开发周报(转)
- linux 源码网站
- Auto Layout 使用心得(三)—— 自定义 cell 并使用 Auto Layout
- Auto Layout 使用心得(二)—— 实现三等分
- Android 软件开发之如何使用Eclipse Debug调试程序详解
- ADB---Command
- 三白话经典算法系列 Shell排序实现
- mysql主从:主键冲突问题