在ARM中使用r9寄存器

时间:2015-09-09 10:52:10

标签: arm u-boot

我正在尝试了解U-boot源(2014.07)。我可以在arch / arm / cpu / armv7 / lowlevel_init.S文件中看到以下代码。

#ifdef CONFIG_SPL_BUILD
        ldr     r9, =gdata
#else
        sub     sp, sp, #GD_SIZE
        bic     sp, sp, #7
        mov     r9, sp
#endif
        push    {ip, lr}
        bl      s_init
        pop     {ip, pc}

你能否告诉为什么sp被移动到r9寄存器 - “mov r9,sp”(对于SPL build gdata加载到r9寄存器 - “ldr r9,= gdata”)。 r9寄存器是否有特定用途,因此我们将sp值存储到r9。

1 个答案:

答案 0 :(得分:3)

ARM在Procedure Call Standard中提出的一般ABI将r9指定为"平台注册":

  

虚拟平台可以将任何角色分配给此注册表,并且必须记录此用法。例如,它可以将其指定为与位置无关的数据模型中的静态基础(SB),或者可以在具有线程本地存储的环境中将其指定为线程寄存器(TR)。该寄存器的使用可能要求所持有的值在所有调用中都是持久的。不需要这种特殊寄存器的虚拟平台可以将r9指定为附加的被调用者保存的变量寄存器v6。

在这种情况下,U-Boot ABI似乎将其用于全局数据指针(另请参阅 arch / arm / lib / crt0.S arch / arm / include / asm / global_data.h ),但可能是"必须记录此用法"点...