函数堆栈调用

函数堆栈调用

 

在了解函数堆栈调用之前我们先来看看这5个问题

  1. 形参是由谁开辟的?在哪里开辟?

   形参是由调用方开辟的

  1. 形参的入栈顺序?

   自右向左(支持可变参 从左至右不知道实参的个数大小 而自右向左 能跑到后面 证明已经知道了参数的个数)

  1. 函数的返回值由谁带出来?

   由寄存器带出来

  1. 为什么回退到了调用方栈桢
  2. 怎么控制函数沿着函数调用点继续执行?

Call函数在调用之前 把下一行指令地址压栈了 当ret出栈时 把出栈的元素赋给了cpu的pc寄存器 pc寄存器放的cpu下一行指令的地址

 

定义一个函数void add(int a, int b),这里的a和b就是形参
当进行函数调用的时候add(1, 2),这里的1和2就是实参

 

一.函数堆栈调用过程如下:

  1. 开辟形参内存并初始化
  2. 压入下一行指令地址
  3. 压入调用方栈底指针的值
  4. 开辟局部变量所需要的栈空间并初始化

 

清栈过程刚好相反

 

二.函数非类类型(内置int char double 指针 结构体)返回值的返回方式:

  1. 0< <4字节:通过1个eax将返回值带出来
  2. 4< <=8字节:由eax,edx将返回值带出来
  3. >8字节:由临时量带回来

 

三.函数的调用约定

_cdecl  C标准调用约定

_stdcall  windows标准的调用约定

_fastcall  快速调用约定

_thiscall  类成员方法的调用约定

约定内容:

  1. 函数符号的生成
  2. 实参的入栈顺序(从右向左)
  3. 形参的开辟和清理方式

   _cdecl:形参 由调用方开辟 调用方清理;

   _stdcall:形参由调用方开辟,被调用方清理;

   _fastcall:形参由 内置类型 <= 4 字节 前两个形参不开辟 由寄存器带入

                 其他情况 形参由调用方开辟 被调用方清理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值