函数调用信息-程序如何运行

乐活   2025-01-31 21:22   内蒙古  
函数调用涉及多个步骤,主要包括:
  1. 传递参数
  2. 保存返回地址
  3. 分配栈帧
  4. 执行函数体
  5. 返回调用者(恢复栈帧)

’我们来看一个简单的函数

研究一下调用 add(5,10):

调用栈是 LIFO(后进先出)数据结构,每次函数调用都会创建新的栈帧,执行完毕后释放栈帧。
栈帧(Stack Frame)
每个函数调用都会分配一个栈帧,包含:
  1. 函数参数
  2. 局部变量
  3. 返回地址
  4. 寄存器保存(用于恢复调用者环境)

看一个套一套的

看这个情况,先main后B再A

也就是执行的时候是按照一个单独的个体来运行的,运行完转到下一个函数。

我们知道这个函数运行的时候很多时候会传入参数。而这个函数参数可以通过 寄存器传递栈传递

ARM 处理器
  1. R0-R3(前 4 个参数)
  2. 超过 4 个参数时,使用栈传递

调用 add(5,10) 时:
  1. R0 = 5, R1 = 10
  2. ADD R0, R0, R1 计算结果,存入 R0
  3. BX LR 跳转到返回地址
看一下使用栈的使用情况,
  1. x86(32-bit) 主要通过栈传递参数(push 指令)。
  2. 参数从右到左入栈,然后 call 进入函数。

举个栗子

三步走

+的数字是栈上面的指针

有栈就会有溢出的情况:
  1. 无限递归
  2. 局部变量过大
  3. 过深的函数调用

这就是出事的代码

优化方案

大的可以使用堆

再总结一下

云深之无迹
纵是相见,亦如不见,潇湘泪雨,执念何苦。
 最新文章