C语言的4种调用约定

调用约定

约定类型__cdecl(c规范)pascalstdcallFastcall
参数传递顺序从右到左从左到右从右到左使用寄存器和栈
平衡栈者调用者子程序子程序子程序
允许使用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调用输出的函数名不能有任何修饰且全部为大写;

收藏:

虚函数
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aaronpack

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值