ARM 中暂存寄存器的用例是什么?

Jig*_*wal 2 arm abi

为什么我们在 ARM 架构中有一个临时寄存器?处理器如何使用它,我的意思是这个寄存器的目的是什么?

art*_*ise 6

为什么 ARM 架构中有暂存寄存器?
我的意思是这个寄存器的目的是什么?

它非常高效,因为暂存寄存器在使用前不需要保存。您至少需要一个暂存寄存器来执行许多函数序言和尾声活动。

处理器如何使用它

它只是处理器的常规寄存器。


ARM 中没有“临时寄存器”。您可以将其称为“调用者”保存的寄存器;但这是 EABI/AAPCS 或您可能遵守的任何内容。它不在“架构”内部。它是用于代码互操作的约定。这可以包括操作系统调用、库调用和工具互操作(跨语言调用)。根据您使用的软件基础设施/工具,不同但非常相似的标准可能会有效。

对于传统的 ARM,有四个“调用者”保存的寄存器。它们是r0-r3。它们也是函数的参数和返回值。互操作的例程可以将 r0-r3 用于任何目的,即使它们不是参数列表的一部分。例如,像这样的例程void foo(void)甚至不需要 r0,但例程可以使用 r0 而不保存它。如果 r0 很重要,则调用 的例程foo()必须保存它。在这种情况下,r0-r3 是短期寄存器或暂存寄存器。与寄存器 r4-r11 相比,请注意如果要使用它们,则必须将其保存(在堆栈上)。

r12 或 r12ip通常对于汇编程序来说并不特殊,也可以被视为暂存寄存器。r12是一个划痕,但原因与 r0-r3 不同。 r12不用作参数寄存器,因此可以由序言代码(例程的开始)使用。

如果您希望在“回溯”中使用您的例程,可能还有其他限制。您可以使用伪操作将您的例程标记为“不可追踪”,以进行堆栈回溯.cantunwind。这不是 ARM 汇编程序,而是 ELF 文件中的“元数据”。这种情况下,可以使用r14(lr)作为保存寄存器;没有一点划痕

在纯汇编项目中,所有寄存器都可以是暂存寄存器。例如,启动处理器的初始代码通常不需要保存任何内容,并且所有寄存器都是临时的。堆栈指针可能是一个例外。

注意: 有些系统会专门使用r9,但很少见。u-boot 就是一个例子。r9 从来都不是暂存寄存器。

参考


fcd*_*cdt 5

来自Arm 架构过程调用标准

暂存寄存器/临时寄存器用于在计算过程中保存中间值的寄存器(通常,此类值在程序源中未命名并且具有有限的生命周期)。

如果调用函数,则临时寄存器中的值可能在函数调用后已更改。因此,函数的调用者必须确保在仍需要这些值时保存这些值。与被调用者安全寄存器相比,它们也称为调用者安全寄存器。这些由被调用的函数保存。因此,如果必须临时存储值,则首先使用临时寄存器,因为它们不必事先保存。