调用约定

调用约定

概念

调用约定是关于被调用方和调用方的参数传递顺序、参数传递方式和堆栈的平衡方式

参数传递顺序:函数中的参数以何顺序存入堆栈或寄存器中

参数传递方式:将函数的参数压入堆栈或寄存器中存储

堆栈的平衡方式:调用方或被调用方谁将堆栈或寄存器中数据复制出来,然后清空堆栈或寄存器中的数据,以及在函数调用完成后还原堆栈或寄存器中的数据

常见的调用约定及其特性

常见的调用约定有:__cdecl、__fastcall、__stdcall、__thiscall

约定传参顺序传参方式清理者参数数量
__cdecl由右到左压栈调用方支持可变参数
__fastcall由右到左寄存器/压栈被调用方不支持可变参数
__stdcall由右到左压栈被调用方不支持可变参数
__thiscall由右到左寄存器调用方支持可变参数

__cdecl

__cdecl是C语言默认的函数调用方法。 被调用函数在编译阶段对参数的数量无任何要求限制,并且由调用方来清理堆栈,所以实现了可变参数。

__fastcall

__fastcall将在尽可能的情况下使用寄存器传参,即将前两个参数(最大为DWORD型)通过寄存器传参。不同的编译器使用的寄存器不同,所以无法实现跨寄存器的接口。

__stdcall

__stdcall是绝大多数winapi所使用的调用约定。

__thiscall

__thiscall只由C++成员函数调用,__thiscall实际上是一个关于类的调用方式,是将类的每一个函数都加上一个this类指针,将这个this指针存放在ECX寄存器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值