arm寄存器
ARM 处理器拥有 37 个寄存器。 这些寄存器按部分重叠组方式加以排列。 每个处理器模式都有一个不同的寄存器组。 编组的寄存器为处理处理器异常和特权操作提供了快速的上下文切换。
提供了下列寄存器:三十个 32 位通用寄存器、程序计数器 (pc)、应用程序状态寄存器 (APSR)、保存的程序状态寄存器 (SPSR)
- 三十个 32 位通用寄存器
在任一时刻都存在十五个通用寄存器,它们分别是 r0-r12、sp、lr。
sp (或 r13)是堆栈指针。 C 和 C++ 编译器始终将 sp 用作堆栈指针。 建议您不要将 sp 用作通用寄存器。
在用户模式下, lr (或 r14)用作链接寄存器 (lr),用于存储调用子例程时的返回地址。 如果返回地址存储在堆栈上,则也可将 r14 用作通用寄存器。
在异常处理模式下, lr 存放异常的返回地址;如果在一个异常内执行了子例程调用,则 lr 存放子例程的返回地址。如果返回地址存储在堆栈上,则可将 lr 用作通用寄存器。
其中:未备份寄存器(The unbanked registers) , R0~R7。当处理器模式切换时, 未备份寄存器指的是同一个物理寄存器, 所有可能造成寄存器中数据被破坏.
备份寄存器(The banked registers) , R8~R14。
对于R8~R12, 每个寄存器对应2个不同的物理寄存器。如:快速模式下,R8对应R8_fiq;用户模式下,R8对应R8_usr. 这两种情况下, 使用的是不同的物理寄存器.
对于R13,R14, 每个寄存器对应6个不同的物理寄存器。其中用户模式和系统模式下是共用一个物理寄存器。其它5种处理器模式分别使用: R13_<mode>, R14_<mode>来表式.
R13在ARM中常用作栈指针. 每一种异常模式拥有自己的物理R13. 应用程序去初始化该R13, 使其指向该异常模式专用的栈地址.
R14又称连接寄存器(Link Register, LR), 在ARM中有以下2个作用
1) 每种模式有自己的物理R14, 存放当前子程序的返回地址. 当通过BL或BLX指令调用子程序时, R14被设置成该子程序的返回地址. 子程序中, 当把R14的值复制到程序计数器PC中时, 子程序返回.
例:
MOV PC , LR #把R14的值复制到程序计数器PC中
BX LR #
STMFD SP! , { <registers>,LR } #在子程序入口将PC保存到栈中
LDMFD SP!, { <registers>,PC } #子程序返回
2) 异常中断发生时, 该异常模式特定的物理R14被设置成该异常模式将要返回的地址.
- 程序计数器 (pc)
程序计数器被当作 pc (或 r15)进行访问。 在 ARM 状态下,它对每个指令以一个字(四字节)为增量递增,在 Thumb 状态下则按所执行指令的大小递增。 跳转指令将目标地址加载到 pc 中。 您也可以使用数据操作指令来直接加载 PC。
例如,若要从子例程返回,可以使用以下指令将链接寄存器复制到 PC 中:
MOV pc,lr
在执行期间, pc 不包含当前执行的指令的地址。 在 ARM 状态下,当前执行的指令的地址通常是 pc–8,而在 Thumb 状态下通常是 pc–4。
- 应用程序状态寄存器 (APSR)
APSR 存放算术逻辑单元 (ALU) 状态标记的副本。 这些标记用于确定是否执行条件指令。可在所有模式下使用 MSR 和 MRS 指令访问这些标记。
- 当前程序状态寄存器 (CPSR)
CPSR 存放下列内容:
• APSR 标记
• 当前处理器模式
• 中断禁用标记
• 当前处理器状态(ARM、Thumb、ThumbEE 或 Jazelle)
• IT 块的执行状态位
执行状态位控制 IT 块中的条件执行(请参阅第4-114 页的IT),并且仅可用于ARMv6T2 及更高版本。
在所有模式下均可访问的标记只有 APSR 标记。 对于 CPSR 的其余位,只能在特权模式下使用 MSR 和 MRS 指令访问它们。
- 保存的程序状态寄存器 (SPSR)
当发生异常时,使用 SPSR 来存储 CPSR。 在每种异常处理模式下,可访问一个SPSR。 用户模式和系统模式没有 SPSR,因为二者不是异常处理模式。