ARM状态下的寄存器组织
ARM状态下的寄存器组织见图2.3。ARM有37个32位长的寄存器,包括31个通用寄存器、1个当前程序状态寄存器CPSR(current program status register)、5个备份的程序状态寄存器SPSR(saved program status register)。这37个寄存器并不都是同时可见的。在任意时刻,只有16个通用寄存器(R0~R15)和一个或者两个状态寄存器(CPSR和SPSR)对处理器来讲是可见的。1. 通用寄存器
31个通用寄存器用R0~R15表示,可以分为三类:
●未分组寄存器R0~R7。
●分组寄存器R8~R14。
●程序计数器PC(R15)。
(1)未分组寄存器R0~R7
在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,它们未被系统用作特殊的用途,因此,在中断或异常处理进行运行模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计时应引起注意。
(2)分组寄存器R8~R14
对于分组寄存器,它们每一次所访问的物理寄存器与处理器当前的运行模式有关。
对于R8~R12来说,每个寄存器对应两个不同的物理寄存器,当使用FIQ模式时,访问寄存器R8_fiq~R12_fiq;当使用除FIQ模式以外的其他模式时,均访问寄存器R8_usr~R12_usr。
对于R13、R14这两个寄存器来说,每个寄存器各有6个不同的物理寄存器,其中的一个是用户模式与系统模式共用的,另外5个物理寄存器分别用于5种异常模式。
采用以下的记号来区分不同的物理寄存器:
R13_<mode>
R14_<mode>
其中,mode为以下几种模式之一:USR、FIQ、IRQ、SVC、ABT和UND。
寄存器R13通常用作堆栈指针SP(stack pointer),但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。
在实际使用中,一般会在存储器中分配一些空间作为堆栈,由于处理器的每种运行模式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间。这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复寄存器的内容,采用这种方式可以保证异常发生后程序的正常执行。
R14也称作子程序连接寄存器(subroutine link register)或连接寄存器LR,当执行分支指令BL时,R14中得到R15(程序计数器PC)的备份。其他情况下,R14用作通用寄存器。类似地,当发生中断或异常时,或当程序执行BL指令时,对应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15(PC)的返回值。
寄存器R14常用在如下的情况:在每一种运行模式下,都可用R14保存子程序的返回地址,当用BL或BLX指令调用子程序时,将子程序的返回地址(在PC中)复制给R14,执行完子程序后,又将R14的值复制回PC,即可完成子程序的调用返回。典型的做法如下:
●执行以下任意一条指令:
MOV PC,LR ;R14复制到PC,实现子程序的返回
BX LR ;跳到LR指的地址处执行程序,实现子程序的返回
●在子程序入口处使用以下指令将R14存入堆栈:
STMFD SP!,{<Regs>,LR}
对应的,使用以下指令可以完成子程序返回:
LDMFD SP!,{<Regs>,PC}
图2.4是这种方法的一个实现。
(3)程序计数器PC(R15)
寄存器R15用作程序计数器PC(program counter)。在ARM状态下,所有指令都是32位宽,所有的指令必须字对齐,所以PC的值由位[31:2]决定,位[1:0]是0(在Thumb状态下,必须半字对齐,位[0]为0,PC的值由位[31:1] 决定)。R15虽然也可用作通用寄存器,但一般不这么使用,因为R15的值通常是下一条要取出的指令的地址,因此使用时有一些特殊的限制,当违反了这些限制时,程序的执行结果是未知的。
由于ARM7采用了三级流水线技术,指令读出的PC值是指令地址值加8个字节。
2. 程序状态寄存器
ARM的程序状态寄存器PSR(program status register)有1个当前程序状态寄存器CPSR和5个备份的程序状态寄存器SPSR。CPSR用来标识(或设置)当前运算的结果、中断使能设置、处理器状态、当前运行模式等。而SPSR则是当异常发生时,用来保存CPSR当前值,以便从异常退出时用SPSR来恢复CPSR。处理器在所有工作模式下都可访问CPSR,不同模式的CPSR是同一个物理寄存器。而每一种异常模式下都有一个SPSR,它们对应不同的物理寄存器。由于用户模式和系统模式不属于异常模式,他们没有SPSR,当在这两种模式下访问SPSR,结果是未知的。CPSR、SPSR都是32位寄存器,它们的格式是相同的,如图2.5所示。
(1)条件标志位 N、Z、C、V
N、Z、C、V(negative、zero、carry、overflow)位称为条件码标志(condition code flags),经常以标志引用,它们的内容可被算术或逻辑运算的结果改变,ARM指令可以根据这些条件标志,选择性地执行后续指令(条件执行),条件码标志各位的具体含义如表2.2所示。
(2)Q标志位
在ARMv5及以上版本的E系列处理器中,CPSR中的Q标志位指示增强的DSP运算指令是否发生了溢出。SPSR中的标志位Q用于当异常出现时保留和恢复CPSR中的Q标志。在其他版本的处理器中,Q标志位未定义。
(3)控制位
PSR的低8位I、F、T和M[4:0]统称为控制位,当发生异常时这些位发生变化,如果处理器运行于特权模式下,这些位也可以由软件修改。
I和F位是中断禁止位:I置1则禁止IRQ中断,F置1则禁止FIQ中断。
T位反映了处理器的运行状态,对不同版本的ARM处理器,T位含义不同。
对于ARM体系结构v3以及更低的版本和v4的非T系列版本处理器,T位应当为0。在这些版本中,没有ARM和Thumb状态之间的切换。
对于ARM体系结构v4及以上版本的T系列处理器,T的含义为:T=0表示执行ARM指令,T=1表示执行Thumb指令。
在这些结构体系中,可以自由地使用能在ARM和Thumb状态之间切换的指令。
对于ARM体系结构v5及以上版本的非T系列处理器,T的含义为:T=0表示执行ARM 指令,T=1表示强制下一条执行的指令产生未定义指令异常。
M[4:0](M0、M1、M2、M3、M4)是模式位,这些位决定处理器的工作模式,具体含义如表2.3所示。
M[4:0]其他的组合结果会导致处理器进入一个不可恢复的状态。
(4)其他位
PSR中的其余位为保留位,保留位将用于ARM版本的扩展。应用软件不要操作这些位,以免与ARM将来版本的扩展冲突。