ARM寄存器
ARM寄存器
ARM处理器共有37个32位寄存器,其中31个通用寄存器,6个状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决于ARM处理器的工作状态及具体的运行模式。但在任何时候,通用寄存器R14~R0、程序计数器PC、一个状态寄存器都是可访问的。
在所有的寄存器中,有些是各模式共用的同一个物理寄存器,有一些寄存器是各模式自己拥有的独立的物理寄存器,表1-1列出了ARM寄存器的组织
表1-1 ARM寄存器组织
通用寄存器
通用寄存器可以分为3类:
- 未分组寄存器(The unbanked registers):R0~R7,在所有运行模式下,都分别是同一个物理寄存器;
- 分组寄存器(The banked registers):R8~R14
-
R8 ~ R12 每个寄存器对应2个不同的物理寄存器;当使用fiq模式时,访问寄存器R8_fiq ~ R12_fiq;其他模式,访问寄存器R8 ~ R12。
-
R13 ~ R14 每个寄存器对应6个不同的物理寄存器;其中一个是用户模式和系统模式共用,另外5个物理寄存器分别对应其它5种不同的运行模式。
-
寄存器R13通常用做堆栈指针(SP),这只是一种习惯用法,也可以是其它寄存器作为堆栈指针。
-
寄存器R14用作子程序链接寄存器(subroutine link register LR),指向函数的返回地址。
-
- 程序计数器PC:R15
-
它虽然可以用作一般的通用寄存器使用,但是有一些指令在使用R15时有些特殊限制。当违反了这些限制时,该指令执行的结果将是不可预料的。
-
由于ARM采用了流水线机制,对ARM指令集而言,PC总是指向当前指令的下两条指令的地址,其值等于当前正在执行的指令的地址+8(因为在取址和执行之间多了一个译码的阶段)。由于ARM指令时字对齐的,PC值的第0位和第1位总为0.
程序状态寄存器
CPSR(Current Program Status Register,当前程序状态寄存器):可以在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志和其他一些相关的控制和状态位。
SPSR(Saved Program Status Register,备份程序状态寄存器):每一种运行模式下都有一个专用的物理状态寄存器。当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可以由SPSR来恢复CPSR。
图1-1 CPSR/SPSR的格式
条件标志位
N(Negative):本位设置成当前指令运算结果的bit[31]的值;
当两个补码表示的有符号整数运算时,N=1表示运算的结果为负数;N=0表示运算的结果为整数或零。
Z(Zero):Z=1表示运算的结果为零;Z=0表示运算的结果不为零。
对于CMP指令,Z=1表示进行比较的两个数大小相等。
C(Carry):
- 在加法指令中(包括比较指令CMN),当结果产生了进位,则C=1,表示无符号数运算发生了上溢出;其他情况下C=0;
- 在减法指令中(包括比较指令CMP),当运算中发生了借位,则C=0,表示无符号数运算发生了下溢出;其他情况下C=0;
- 对于包含移位操作的非加/减法运算指令,C中包含最后一次被溢出的位的数值;
- 对于其他非加/减法运算指令,C位的值通常不受影响;
V(oVerflow):
- 对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出;
- 通常其他的指令不影响V位;
以下指令会影响到CPSR中的条件标志位:
- 比较指令,如CMP、CMN、TEQ、TST等;
- 当一些算术运算指令和逻辑指令的目标寄存器不是R15时,这些指令会影响CPSR中的条件标志位;
- MSR指令可以向CPSR/SPSR中写入新值;
- MRC指令将R15作为目标寄存器时,可以把协处理器产生的条件标志位的值传送到ARM处理器;
- 一些LDM指令的变种指令可以将SPSR的值复制到CPSR中,这种操作主要用于从异常中断程序中返回;
- 一些带“位设置”的算术和逻辑指令的变种指令,也可以将SPSR的值复制到CPSR中,这种操作主要用于从异常中断程序中返回;
控制位
CPSR的低8位I、F、T以及M[4:0]统称为控制位。当异常中断发生时这些位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。
- 中断控制位
- 当I=1时禁止IRQ中断
- 当F=1时禁止FIQ中断
- T控制位
- T控制位用于控制指令执行的状态,即说明本指令是ARM指令,还是Thumb指令。对于不同版本的ARM处理器,T控制位的含义不同。
- M控制位
- M[4:0]控制处理器的运行模式。