0

cpu如何从调用者函数推送的堆栈中获取返回地址。他怎么知道这是一个退货地址而不是别的什么?

4

1 回答 1

0

我不得不查一下,但在维基百科上已经充分解释了

所以被调用者(被称为子程序)本身负责从堆栈中弹出所有内容(自己的局部变量)并执行跳转到调用者函数提供的返回地址。

返回地址是例如来自被调用者的局部变量被弹出后的堆栈条目(至少在维基百科示例中 - 在不同的体系结构上可能存在差异)。

帧指针将是返回地址位置的提示,但可以省略以提高性能,因此您不能依赖它。

我不知道被调用者是否负责删除从调用者传递的参数——这可能取决于架构。

更新:组装示例

在函数(被调用者)结束时,保存在堆栈中的变量(即一些寄存器值和调用者的返回地址)被弹回到相应的寄存器中:

pop    {r4, r5, r6, pc}

在 ARM 上,这会将堆栈中的下一个四个字放入这些寄存器中。一种是弹出到 $PC(程序计数器)中的返回地址。因此,执行将继续执行返回地址处的指令,该地址弹出到 $PC 中。

我不能确切地说链接寄存器是如何工作的。它应该包含一个返回地址(但是对于嵌套函数调用,我们当然仍然需要堆栈来存储多个返回地址)。

于 2019-12-02T07:40:08.053 回答