函数执行流程

函数执行流程
1.1 常见的调用约定
__cdecl : c语言标准约定,默认
传参顺序:从右往左
参数的存储媒介:栈
调用方负责释放参数空间返回值的存放位置在寄存器
_stdcall :windows操作系统标准约定
传参顺序:从右往左
参数的存储媒介:栈
被调方负责释放参数空间返回值的存放位置在寄存器
_fastcall :快速调用约定
传参顺序:从右往左
参数的存储媒介:左起前两个参数通过寄存器传递,其余参数通过栈传递被调方负责释放参数空间
返回值的存放位置在寄存器
2,将返回地址在栈顶保存(压栈),返回地址是函数调用后的指令地址
3,保存调用方的栈底
每个函数有独立的栈空间,当进入新函数的时候,会规划新的栈空间。
为了便于结束调用后返回到调用方继续执行代码,必须能重新设回调用方的栈空间,所以执行新函数前,需要保存调用方的栈底
4,更新当前栈底位置到当前栈顶
5,预留局部变量的空间
A,Debug选项组:预留空间大于等于所需变量空间之和
B,Release选项组(优化版/02)︰预留空间小于等于所需变量空间之和
6,使用栈保存寄存器环境
*7,Debug选项组(ZI+0D):将局部变量的空间初始化为0xcccccccc(烫)A,容易发现引用了未初始化的变量
B,间接访问未初始化指针的时候,保证报错
8,执行函数体

9,恢复寄存器环境
10,释放局部变量空间
11,恢复调用方栈底
12A,如果约定被调方负责清理参数空间,则先清理参数空间后,流程返回到调用方
12B,如果约定调用方负责清理参数空间,则先回到调用方的代码处,由调用方负责清理参数空间

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值