为什么ARM将返回地址保存在链接寄存器中而不是堆栈中?

时间:2019-05-20 03:56:00

标签: arm processor

我一直在寻找这个答案超过一个星期,没有运气。到目前为止,我了解到函数嵌套或中断发生时堆栈会保存返回地址,但是最近我了解到现代处理器使用链接寄存器来实现相同的目标。经过一番研究,我发现该堆栈确实用于在较旧的处理器中保存返回地址。但是,对于我来说,为什么当较旧的实现工作时,现代处理器为何使用整个单独的寄存器(LR)来保存返回地址,这对我来说没有意义?与基于堆栈的实现相比,LR有什么好处?

提前谢谢!

1 个答案:

答案 0 :(得分:2)

RISC体系结构倾向于具有较少的特殊指令或行为-而是将标准指令用于堆栈管理。这通常意味着程序更大,CPU本身更简单,并且编译器有望更难地进行优化

考虑:

invalid column name PrimitiveID

在这里,int bar(int a) { return a * a; } void foo() { bar(22); } foo(); 是一个叶函数-不会继续进行进一步的函数调用。因此,bar()中的返回地址将永远不会被覆盖。结果,根本不需要将其写入堆栈。这样可以从内存中进行保存和加载以及存储。

另一方面,

LR将使foo()发生突变,因为它进行了函数调用,因此需要将调用者的返回地址存储在堆栈中。

将此与体系结构进行对比,在该体系结构中,进行函数调用会自动将返回地址推入堆栈-这种优化是不可能的。

所有版本的ARM过程调用标准都定义了用于函数调用的被调用者保存寄存器-调用者可以期望通过函数调用对其进行维护的寄存器。如果该函数是微不足道的,它将再次导致没有内存访问。

在中断中,定时通常更为关键。 ARM CPU具有一组影子寄存器,这些影子寄存器只能在中断状态下访问。这意味着可以编写不需要内存访问的琐碎中断处理程序。