ARM共计37个寄存器,包括31个通用寄存器和6个状态寄存器:
通用寄存器包括:未分组(未备份)寄存器、分组(备份)寄存器、程序寄存器(PC)三类;
状态寄存器包括:状态寄存器、备份状态寄存器。
(1)未分组寄存器:R0-R7,共8个;
(2)分组寄存器R8-R14:其中FIQ模式下有单独的一组R8-R12共5个,另外6种模式共用一组R8-R12,共5个;
USR和SYS模式共用一组R13-R14,共2个,另外5种模式下各有独自的一组R13-R14,共10个;
(3)程序计数器PC即R15寄存器,共1个;
(4)状态寄存器CPSR,和5个备份状态寄存器SPSR,共6个;
表3-1 寄存器组织
Usr | System | Supervisor | Abort | Undefined | IRQ | FIQ |
R0 | R0 | R0 | R0 | R0 | R0 | R0 |
R1 | R1 | R1 | R1 | R1 | R1 | R1 |
R2 | R2 | R2 | R2 | R2 | R2 | R2 |
R3 | R3 | R3 | R3 | R3 | R3 | R3 |
R4 | R4 | R4 | R4 | R4 | R4 | R4 |
R5 | R5 | R5 | R5 | R5 | R5 | R5 |
R6 | R6 | R6 | R6 | R6 | R6 | R6 |
R7 | R7 | R7 | R7 | R7 | R7 | R7 |
R8 | R8 | R8 | R8 | R8 | R8 | R8_fiq |
R9 | R9 | R9 | R9 | R9 | R9 | R9_fiq |
R10 | R10 | R10 | R10 | R10 | R10 | R10_fiq |
R11 | R11 | R11 | R11 | R11 | R11 | R11_fiq |
R12 | R12 | R12 | R12 | R12 | R12 | R12_fiq |
R13 | R13 | R13_svc | R13_abt | R13_und | R13_irq | R13_fiq |
R14 | R14 | R14_svc | R14_abt | R14_und | R14_irq | R14_fiq |
PC | PC | PC | PC | PC | PC | PC |
CPSR | CPSR | CPSR | CPSR | CPSR | CPSR | CPSR |
| SPSR_svc | SPSR_abt | SPSR_und | SPSR_irq | SPSR_fiq |
1.通用寄存器的分类:
(1)未备份寄存器,包括R0-R7
对每个未备份寄存器(R0-R7),在所有的模式下都是指同一个物理寄存器(例如:Usr下的R0与FIQ下的R0是同一个寄存器)。在异常程序中断造成模式切换时,由于不同模式使用的是相同的物理寄存器。这可能导致数据遭到破坏。未备份寄存器没有被系统作为别的用途,任何场合均可采用未备份寄存器。
(2)备份寄存器
对于备份寄存器R8-R12来说,除FIQ模式下其它模式均使用相同的物理寄存器。在FIQ模式下R8_fiq,R9_fiq,R10_fiq,R11_fiq,R12_fiq。它有自己的物理寄存器。
对于R13和R14寄存器每种模式都有自己的物理寄存器(System与Usr的寄存器相同)当异常中断发生时,系统使用相应模式下的物理寄存器,从而可以避免数据遭到破坏。
R13也称为SP(stack pointer)堆栈指针,用于存放堆栈的栈顶地址的,除了PC外,任何普通寄存器可作为栈指针寄存器。
R14也称为LR(Linked register),即链接寄存器。LR是专门用于存放子程序返回地址的。如果子程序调用更下一层的程序,编译器会在更下一层的程序入口处将连接寄存器的值入栈,这样在返回的时候通过出栈便可得到正确的返回结构。
(3)程序计数器
R15即为PC(program counter),即程序计数器。当程序往下执行时,执行完一条指令便会使程序计数器做加一运算,这里的加一可能是多个字节,这样程序继续执行时便可以从程序计数器所指定的位置开始执行。实现流水线后,PC值=当前正在执行指令的内在中的地址+8。一条指令只有在完全通过“执行”阶段才被处理。当处理器处于Thumb模式时,pc的值为正在执行指令的地址加4。
PC寄存器存储指令地址,由于ARM采用流水机制执行指令,故PC寄存器总是存储下一条指令的地址。又因为ARM是按照字对齐故PC被读取后的值的bit[1:0]总是0b00(thumb的bit[0]是0b0)。
2. 程序状态寄存器
程序状态寄存器包含当前程序状态寄存器和备份状态寄存器。
(1)CPSR(程序状态寄存器)
当前程序状态寄存器CPSR(Current Program Status Register),于用保存当前程序状态,CPSR在任何处理器模式下都可以被访问。CPSR包含条件码标志、中断禁止位、当前处理器模式以及其他状态和控制信息。每种异常模式都有一个程序状态保存寄存器SPSR(Saved Program Status Register)。当异常出现时,SPSR用于保存CPSR的状态。CPSR和SPSR的格式如下:
31 30 29 28 --- 8 7 6 5 4 3 2 1 0
N | Z | C | V |
| DNM(RAZ) | I | F | T | M4 | M3 | M2 | M1 | M0 |
N(Negative)、Z(Zero)、C(Carry)以及V(oVerflow)称为条件标志位。ARM指令根据CPSR的条件标志位来选择地执行。
表3-2 CPSR条件标志位
条件标志位 | 含义 |
N | N=1表示运算结果为负数,N=0表示运算结果为正数 |
Z | Z=1表示运算结果为0, Z=0表示运算结果为非零 |
C | C=1表示运算结果产生了进位 |
V | V=1运算结果的符号位发生了溢出 |
Q | 在ARMv5 E系列版本中Q=1表示DSP指令溢出; 在ARMv5以前的版本中没有Q标志位。 |
以下指令会影响CPSR的条件标志位:
a.比较指令,如: CMP、CMN、TEQ、TST等。
b.当一些算术逻辑运算的目标寄存器不是PC时,这些指令会影响CPSR的条件标志位。
c. MSR与MRS指令可以对CPSR/SPSR进行操作。
d. LDM指令可以将SPSR复制到CPSR中。
CPSR的控制位:
I:I=1禁用IRO中断
F:F=1禁用FIQ中断
T:ARMv4以上T版本T=0执行ARM指令,T=1执行Thumb指令;
ARMv5以上非T版本T=0执行ARM指令,T=1表示下一条指令产生未定义指令中断。
Usr | System | Supervisor | Abort | Undefined | IRQ | FIQ |
表3-3 位模式
M[4:0] | 模式 | 可访问的寄存器 |
10000 | Usr | PC、R14-R0、CPSR |
10001 | FIQ | PC、R14_fiq-R8_fiq、R7-R0、CPSR、SPSR_fiq |
10010 | IRQ | PC、R14_irq、R13_irq、R12-R0、CPSR、SPSR_irq |
10011 | Supervisor | PC、R14_svc、R13_svc、R12-R0、CPSR、SPSR_svc |
10111 | Abort | PC、R14_abt、R13_abt、R12-R0、CPSR、SPSR_abt |
11011 | Undefined | PC、R14_und、R13_und、R12-R0、CPSR、SPSR_und |
11111 | System | PC、R14-R0、CPSR |
(2)SPSR(保存程序状态寄存器)
保存程序状态寄存器(Saved Program Status Register)。SPSR是在发生异常时用于对CPSR的值进行暂时备份的作用。处理完异常便可以通过备份的值来将CPSR恢复。SPSR的结构与CPSR的结构相同,SPSR是用来备份CPSR的。