函数调用约定
2017-08-31 15:30
337 查看
cdecl
cdecl调用约定又称为C调用约定,是c/c++语言缺省的调用约定。参数按照从右至左的方式入栈,函数本身不清理栈,此工作有调用者负责,返回值在eax中。由于由调用者清理栈,所以允许可变参数函数存在。
stdcall
stdcall很多时候被称为pascal调用约定。pascal语言是早期很常见的一种教学用计算机程序设计语言,其语法严谨,参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在eax中。
fastcall
fastcall的调用方式运行相对快,因为它通过寄存器来传递参数。它使用ecx和edx传送两个双字或更小的参数,剩下的参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在eax中。
naked
naked是一个很少见的调用约定,一般不建议使用。编译器不会给这种函数增加初始化的清理代码,更特殊的是,你不能用return返回返回值,只能用插入汇编返回结果,此调用约定必须跟declspec同时使用,例如声明一个函数,如_declspec(naked) int add(int a,int b);
pascal
这是pascal语言的调用约定,跟stdcall一样,参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在 eax中,vc已经废弃了这种调用方式,因此在写vc程序时,建议使用stdcall。
thiscall
这是c++语言特有的一种调用方式,用于类成员函数的调用约定。如果参数确定,this指针存放于ecx寄存器,函数自身清理堆栈;如果参数不确定,this指针在所有参数入栈后再入栈,调用者清理栈。Thiscall不是关键字,程序员不能使用。参数按照从右至左的方式r入栈。
相关文章推荐
- 函数调用约定区别
- 函数调用约定
- (转)函数调用约定和函数名修饰规则
- 函数调用约定
- 函数调用约定
- 函数调用约定_stdcall[转]
- C/C++:函数的编译方式与调用约定以及extern “C”的使用
- 函数调用约定和堆栈
- dll的输出函数使用__stdcall调用约定后,客户端用GetProcAddress出现的问题!
- 汇编学习第五课之函数调用约定:cdecl,stdcall,fastcall
- C/C++中函数的调用约定(__cdecl, __stdcall)以及extern, extern “C"的详细解释
- C++编译时 函数调用约定 与 函数名修饰约定规则
- 函数命名规则及调用约定:__stdcall,__cdecl,__fastcall,thiscall,naked call
- (转)函数调用约定和函数名修饰规则
- 函数调用约定
- 函数调用约定
- 函数调用约定
- 函数调用约定 stdcall,cdecl,fastcall,thiscall,naked call
- 函数调用约定_stdcall[转]
- 函数调用约定和堆栈