为什么 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 从来都不是暂存寄存器。
参考
| 归档时间: |
|
| 查看次数: |
1647 次 |
| 最近记录: |