函数调用惯例

函数调用惯例

  1. 函数的调用者必须知道函数的调用惯例才能正确地调用函数

  2. 常见的调用惯例有

    1. __cdecl
    2. __stdcall
    3. __fastcall
    4. __thiscall
  3. 调用惯例之间的区别在于函数参数的入栈顺序、函数执行完毕后由谁来清理堆栈、以及函数编译后的符号名

    调用惯例参数入栈顺序堆栈清理方备注
    __cdecl从右到左的顺序入栈调用者由于是调用者清理栈,所以可以实现可变参数函数,是C/C++默认的调用惯例
    __stdcall从右到左的顺序入栈被调用者由于是被调用者清理栈,所以不可以实现可变参数函数,是WINDOWS API的调用惯例
    __fastcall函数的第一个和第二个DWORD参数(或者尺寸更小的)通过ecxedx传递, 其他参数通过从右向左的顺序入栈被调用者由于是被调用者清理栈,所以不可以实现可变参数函数
    __thiscall从右到左的顺序入栈如果参数个数确定,this指针通过ecx传递给被调用者, 如果参数个数不确定, this指针在所有参数压栈后被压入堆栈对参数个数不定的, 调用者清理堆栈, 否则函数自己清理堆栈

    注意:ecxedx是寄存器

  4. 如果函数的调用者使用了跟函数本身的调用惯例不一致的调用惯例来调用函数的话,栈就会被破坏

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值