本文主要是介绍几种调用协议的区别__pascal __cdecl __msfastcall __fastcall __stdcall,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
几种调用协议的区别__pascal __cdecl __msfastcall __fastcall __stdcall
参考
下表内容整理自: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 |
|
|
下表内容整理自:http://blog.csdn.net/jia_xiaoxin/article/details/2868216
| __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)、以"?"标识函数名的开始,后跟函数名; |
|
这篇关于几种调用协议的区别__pascal __cdecl __msfastcall __fastcall __stdcall的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!