调用约定
约定类型 | __cdecl(c规范) | pascal | stdcall | Fastcall |
---|---|---|---|---|
参数传递顺序 | 从右到左 | 从左到右 | 从右到左 | 使用寄存器和栈 |
平衡栈者 | 调用者 | 子程序 | 子程序 | 子程序 |
允许使用VARARG | 是 | 否 | 是 | ——— |
- 注:VARARG表示参数个数可以是不确定的,stdcall如果使用VARARG参数类型,就是调用程序平衡栈,否则就是被调用程序平衡栈;
另一个调用规范thiscall也用到了寄存器穿参,thiscall是C++中的非静态类成员函数的默认调用约定,对象的每个函数隐含接收this参数,采用thiscall约定时,函数的参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,仅通过ecx寄存器传说红一个额外的参数——this指针;
-
stdcall
调用约定在输出函数名前加一个下画线前缀,在后面加一个"@“符号及其参数的字节数,格式为”_functionname@number"。 -
__cdecl调用约定仅在输出函数名前面加一个下画线前缀,格式为"_functionname".
-
Fastcall调用约定在输出函数名前面加一个"@“符号,在后面加一个”@“符号及其参数的字节数,格式为”@functionname@namber"。
fastcall:在X86和X64平台的调用约定是不一样的,区别:
1,会比X86多俩个寄存器。
2,函数的4个参数虽然存放在相应的寄存器中,但是栈上还是会预留4个空间。
3,调用者来负责堆栈平衡。为了支持便参参数。
他们均不改变输出函数名中的字符大小写,这和pascal调用约定不同,pascal调用输出的函数名不能有任何修饰且全部为大写;
收藏:
虚函数