Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ARM中的Scratch寄存器的用例是什么?_Arm_Abi - Fatal编程技术网

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

ARM中的Scratch寄存器的用例是什么?,arm,abi,Arm,Abi,为什么我们在ARM架构中有一个暂存器?处理器如何使用它,我的意思是这个寄存器的用途是什么 暂存寄存器/临时寄存器在计算过程中用于保存中间值的寄存器(通常,此类值不在程序源中命名,并且具有有限的生存期) 如果调用函数,则在函数调用后,临时注册表中的值可能已更改。因此,函数的调用方必须确保在仍然需要这些值时保存这些值。与被叫方安全寄存器不同,它们也称为呼叫方安全寄存器。这些由被调用的函数保存。因此,如果值必须临时存储,则首先使用暂存寄存器,因为它们不必事先保存 为什么我们在ARM体系结构中有一个临时

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

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

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

为什么我们在ARM体系结构中有一个临时寄存器?
我是说这个登记册的目的是什么

它是有效的,因为在使用前不需要保存暂存寄存器。您需要至少一个暂存寄存器来执行许多函数开场白和尾声活动

处理器如何使用它

它只是处理器的一个常规寄存器


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

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

r12或
ip
通常不是汇编程序的专用寄存器,也可以作为暂存寄存器处理<代码>r12是一个划痕,但原因与r0-r3不同
r12
未用作参数寄存器,因此可由序言代码(例程的开始)使用

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

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

注意:一些系统将使用专用r9,但这种情况很少见。一个例子可能是u-boot。r9从来不是一个临时寄存器

参考资料

  • -对于当前AAPCS回溯记录道
这个问题的读者可能也会感兴趣。