函数调用约定
2013-06-09 00:22
295 查看
【概念】
1, __cdecl(C调用约定.The C default calling convention)C/C++ 缺省调用方式
1)压栈顺序:函数参数从右到左
2)参数栈维护:由调用函数把参数弹出栈,传送参数的内存栈由调用函数来维护
3)函数修饰名约定:VC将函数编译后会在函数名前面加上下划线前缀
4)每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大
2, __stdcall (Pascal方式清理C方式压栈,通常用于Win32 Api中)
1)压栈顺序:函数参数从右到左的压栈顺序
2)参数栈维护:被调用函数把参数弹出栈(在退出时清空堆栈)
3)函数修饰名约定:VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数
ex. VC: int f(void *p) (编译后)-> (在外部汇编语言里可以用这个名字引用这个函数)
3, __fastcall (快速调用约定,通过寄存器来传送参数)
1)压栈顺序:用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送
2)参数栈维护:被调用函数在返回前清理传送参数的内存栈
3)函数修饰名约定:VC将函数编译后会在函数名前面加上"@"前缀,在函数名后加上"@"和参数的字节数
4, thiscall (本身调用,仅用于“C++”成员函数)
1)压栈顺序:this指针存放于CX/ECX寄存器中,参数从右到左的压栈顺序
2)thiscall不是关键词,因此不能被程序员指定
【注意点】
1,在设计可变参数函数的时候,只能使用__cdecl。
2,在导出DLL的函数时,最好在 __declspec(dllexport)后面指定调用约定。同时,在调用DLL的时候,在定义DLL入口函数的时候,确定你的调用约定是正确的。
1, __cdecl(C调用约定.The C default calling convention)C/C++ 缺省调用方式
1)压栈顺序:函数参数从右到左
2)参数栈维护:由调用函数把参数弹出栈,传送参数的内存栈由调用函数来维护
3)函数修饰名约定:VC将函数编译后会在函数名前面加上下划线前缀
4)每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大
2, __stdcall (Pascal方式清理C方式压栈,通常用于Win32 Api中)
1)压栈顺序:函数参数从右到左的压栈顺序
2)参数栈维护:被调用函数把参数弹出栈(在退出时清空堆栈)
3)函数修饰名约定:VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数
ex. VC: int f(void *p) (编译后)-> (在外部汇编语言里可以用这个名字引用这个函数)
3, __fastcall (快速调用约定,通过寄存器来传送参数)
1)压栈顺序:用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送
2)参数栈维护:被调用函数在返回前清理传送参数的内存栈
3)函数修饰名约定:VC将函数编译后会在函数名前面加上"@"前缀,在函数名后加上"@"和参数的字节数
4, thiscall (本身调用,仅用于“C++”成员函数)
1)压栈顺序:this指针存放于CX/ECX寄存器中,参数从右到左的压栈顺序
2)thiscall不是关键词,因此不能被程序员指定
【注意点】
1,在设计可变参数函数的时候,只能使用__cdecl。
2,在导出DLL的函数时,最好在 __declspec(dllexport)后面指定调用约定。同时,在调用DLL的时候,在定义DLL入口函数的时候,确定你的调用约定是正确的。
相关文章推荐
- 函数调用约定stdcall cdecl fastcall thiscall naked call
- 对几种函数调用约定的总结
- 关于函数调用约定的理解
- 函数调用约定
- 函数调用约定区别
- 函数调用约定
- C/C++:函数的编译方式与调用约定以及extern “C”的使用
- c++中的几种函数调用约定
- 函数调用约定
- 函数调用约定和堆栈
- 调用约定和函数导出名
- 函数调用约定
- 函数调用约定学习(一)
- [转载]论函数调用约定
- DLL中导出函数(函数名及其调用约定)??
- 函数的调用约定(__cdecl,__stdcall,__fastcall,__pascal)
- c++中的几种函数调用约定
- (转)函数调用约定和函数名修饰规则
- __cdecl __stdcall __fastcall之函数调用约定讲解
- 函数调用约定