gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:14:48 30 4
gpt4 key购买 nike

我一直在寻找这个答案一个多星期了,但没有运气。到目前为止,我已经了解到堆栈会在函数嵌套或中断发生时保存返回地址,但最近我了解到现代处理器使用链接寄存器来实现相同的目标。经过一些研究,我开始知道堆栈确实被用来保存旧处理器中的返回地址。但是,我不明白为什么现代处理器在旧的实现工作时使用整个单独的寄存器( LR )来保存返回地址? LR 相对于基于堆栈的实现有什么好处?

提前致谢!!!

最佳答案

RISC 架构往往具有较少的特殊指令或行为——而是使用标准指令进行堆栈管理。这通常意味着程序更大,CPU 本身更简单,并且预计编译器会更难优化

考虑:

int bar(int a)
{
return a * a;
}

void foo()
{
bar(22);
}


foo();

在这里, bar()是一个叶函数 - 一个不会继续进行进一步函数调用的函数。因此,返回地址在 LR永远不会被覆盖。因此,根本不需要将其写入堆栈。这将保存和加载以及从/到内存的存储。
foo()另一方面会变异 LR因为它进行函数调用,所以它需要在堆栈上存储调用者的返回地址。

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

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

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

关于arm - 为什么ARM将返回地址保存在链接寄存器而不是堆栈中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56214122/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com