ARM寄存器(ARM state)

一、总体概括:

        ARM处理器共有37个寄存器。其中包括:31个通用寄存器,包括程序计数器(PC)在内。这些寄存器都是32位寄存器。以及6个32位状态寄存器。ARM处理器共有7种不同的处理器模式:用户模式(User)、快速中断模式(FIQ)、普通中断模(IRQ)、管理模式(Svc)、数据访问中止模式(Abort)、未定义指令中止模式(Und)、系统模式(Sys),在每一种处理器模式中有一组相应的寄存器组。任意的处理器模式下,可见的寄存器包括15个通用寄存器(R0~R14)、一个或两个状态寄存器及程序计数器(PC)。在所有的寄存器中,有些是各模式共用的同一个物理寄存器;有一些寄存器是各模式自己拥有的独立的物理寄存器。

ARM寄存器(ARM state)
ARM寄存器组

ARM寄存器(ARM state)

ARM寄存器(ARM state)
不同模式下寄存器组对比

 

         在Thumb模式下,主要使用低数字寄存器(R0-R7)以及功能性的寄存器。

二、寄存器介绍

2.1 通用寄存器

         通用寄存器为R0-R15,其中R0-R7为无影子寄存器,R8-R14为有影子寄存器,R15(PC)为程序计数器。

         1)R0-R7为真正意义上的通用寄存器,在进入不同模式下,都要对这一组寄存器进行保护。其中r0~r3 主要用于子程序间传递参数,在thumb程序中,通常只能使用 r4~r7 来保存局部变量。
         2)R8-R14访问的物理寄存器取决于当前的处理器模式,或者使用规定的名字来访问。其中,R8-R12各有两个物理寄存器,分别属于FIQ模式与非FIQ模式, r12 用作子程序间scratch 寄存器,R13、R14各有6个物理寄存器,用户模式与系统模式共用,其他5个寄存器则用于各异常模式,r13 (sp)通常用做栈指针,通常在系统初始化时需要对所有模式下的SP指针赋值,CPU会自动切换成相应模式下的值,R14 (LR)寄存器又被称为链接寄存器,用于保存子进程返回地址或异常返回地址。

        3) 程序计数器R15又被记作PC。由于ARM采用了流水线机制,当正确读取了PC的值时,该值为当前指令地址值加8个字节。对于ARM指令集来说,PC指向当前指令的下两条指令的地址。由于ARM指令是字对齐的,PC值的第0位和第1位总为0。需要注意的是,当使用指令STR/STM保存R15时,保存的可能是当前指令地址值加8字节,也可能保存的是当前指令地址加12字节。到底是哪种方式,取决于芯片具体设计方式

         tips:

               影子寄存器:晴子寄存器是指该寄存器在不同模式下对应的物理寄存器。

2.2 程序状态寄存器

         程序状态寄存器包括所有的CPSR和SPSR,其中CPSR(当前状态寄存器)在所有模式下都是可读写的,SPSR时CPSR的备份,二者格式相同。

CPSR格式
31 30 29 28 27 26-8 7 6 5 4 3 2 1 0
N Z C V Q DNM(AZ) I F T M4 M3 M2 M1 M0

其中:

        1)28-31为条件标志位

              ①,N(Negative)复数:本位设置当前指令运算结果最高位的值,例如:当两个补码表示的有符号整数运算时,N=I表示运算的结果为负数;N=0表示结果为正数或零

              ②,Z(zero)零:Z=1表示运算的结果为零;Z=0表示运算的结果不为零。

              ③,C(carry)进位或者结尾:表示当前的运算过程中出现了进位或者借位

        2)Q标志位:在ARMv5的E系列处理器中,CPSR的bit[27]称为Q标志位,主要用于指示增强的DSP指令是否发生了溢出。

        3)CPSR的低8位I、F、T及M[4:0]统称为控制位。其中I、F为中断标志,T为状态控制标志,M[4:0]为模式控制位。

           ①I=1,禁止IRQ中断;I=0,允许IRQ中断。

           ②F=1,禁止FIQ中断;F=0,允许FIQ中断。

           ③T=1,Thumb状态;T=0,ARM状态。

           ④M控制位

ARM寄存器(ARM state)
模控制位的值对应的相关寄存器列表