@未分组寄存器R0~R7
@分组寄存器R8~R14
@PC寄存器R15
同一个寄存器名在ARM微处理器内部只有一个独立的物理寄存器与之对应。
每一个物理寄存器分别与不同的处理器模式相对应。对于R8~R12来说,每个寄存器对应两个不同的物理寄存器,当使用fiq模式时,访问寄存器R8_fiq~R12_fiq;当使用除fiq模式以外的其他模式时,访问寄存器R8_usr~R12_usr。对于于R13、R14来说,每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式。
在ARM指令中常用作堆栈指针,但这只是一种习惯用法
也称作子程序链接寄存器(Subroutine Link Register)或连接寄存器LR。当执行BL子程序调用指令时,R14中得到R15的备份。
R14寄存器使用举例:当用BL或BLX指令调用子程序时,将PC的当前值拷贝给R14,执行完子程序后,又将R14的值拷贝回PC,即可完成子程序的调用返回。
子程序返回指令:MOV PC, LR 或者 BX LR
将R14存入堆栈:STMFD SP!,{<Regs>,LR}
子程序返回时的R14出栈:LDMFD SP!,{<Regs>,PC}
PC在ARM模式下,位[1:0]为0,位[31:2]用于保存PC;在Thumb 状态下,位[0]为0,位[31:1]用于保存PC。(符合ARM微处理器字对齐规则:32位活16位指令长度,而存储是以字节为单位的)。对于ARM指令集而言,PC总是指向当前指令的下两条指令。即PC的值为当前指令的地址值加8个字节。
寄存器R16用作当前程序状态寄存器CPSR
N、Z、C、V均为条件码标志位。它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。在ARM状态下,大多数的指令都是有条件执行的。
N 当用两个补码表示的带符号数进行运算时,N=1 表示运算的结果为负数;N=0 表示运算的结果为正数或零;
Z Z=1 表示运算的结果为零;Z=0 表示运算的结果为非零;
C 可以有 4 种方法设置 C 的值:
─ 加法运算(包括比较指令CMN):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。
─ 减法运算(包括比较指令CMP):当运算时产生了借位(无符号数溢出),C=0,否则C=1。
─ 对于包含移位操作的非加/减运算指令,C为移出值的最后一位。
─ 对于其他的非加/减运算指令,C的值通常不改变。
V 可以有2种方法设置V的值:
─ 对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。
─ 对于其他的非加/减运算指令,V的值通常不改变
PSR的低8位(包括I、F、T和M[4:0])称为控制位,当发生异常时这些位可以被改变。如果处理器运行特权模式,这些位可以由程序修改。
─ 中断禁止位I、F: I=1 禁止IRQ中断; F=1 禁止FIQ中断。
─ T标志位:该位反映处理器的运行状态。对于ARM体系结构v5及以上的版本的T系列处理器,当该位为1时,程序运行于Thumb状态,否则运行于ARM状态。对于ARM体系结构v5及以上的版本的非T系列处理器,当该位为1时,执行下一条指令为引起定义的指令异常,当该位为0时表示运行于ARM状态。
─ 运行模式位M[4:0]:M0、M1、M2、M3、M4是模式位。这些位决定了处理器的运行模式。
每一种运行模式下又都有一个专用的物理状态寄存器,称为SPSR(Saved Program Status Register,备份的程序状态寄存器),当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR。
由于用户模式和系统模式不属于异常模式,他们没有SPSR,当在这两种模式下访问SPSR,结果是未知的。