cpu如何从堆栈中获取返回地址

时间:2016-10-06 03:08:30

标签: stack procedure machine-language

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

1 个答案:

答案 0 :(得分:0)

我不得不查一下,但是on Wikipedia

有足够的解释

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

返回地址例如弹出来自被调用方的局部变量之后的堆栈堆栈条目(至少在Wikipedia示例中-在不同的体系结构上可能有所不同)。

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

我不知道被调用方是否负责删除从调用方传递的参数-这可能取决于体系结构。

更新:程序集示例

在函数(被调用方)的末尾,已保存到堆栈中的变量(即某些寄存器值和调用方的返回地址)会弹出到相应的寄存器中:

pop    {r4, r5, r6, pc}

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

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