一、简介
1、ARM 总共有 37 个寄存器,但是每种模式下最多只能看到 18 个寄存器,其他寄存器虽然名字相同,但是在当前模式不可见。
2、例如,对 r13 这个名字来说,在 ARM 中共有 6 个名叫 r13(又叫 sp)的寄存器,但是在每种特定处理器模式下,只有一个 r13 是当前可见的,其他的 r13 必须切换到它们的对应模式下才能看到。这种设计叫影子寄存器(banked register)。
3、这 37 个寄存器的地址都是不一样的,虽然它们可以有相同的名字。同时,有些寄存器甚至还有别名,比如在汇编代码中,r15 寄存器也写作 pc 寄存器。
二、CPU 通用寄存器的切换示意图
1、
当前处在 User 用户模式
下,可以看到所有 r0 ~ r15 寄存器、以及 cpsr 寄存器。
2、
某一时刻,CPU 切换到 FIQ 模式
。此时, 寄存器列表中的 r8 ~ r14 寄存器将是属于 FIQ 模式自身的寄存器,这几个 r8 ~ r14 寄存器,与 User 模式的 r8 ~ r14 寄存器是不同的寄存器,只是名字相同。
并且,FIQ 模式下的 spsr 寄存器将会保存 User 模式下的 cpsr 寄存器的状态;等到切换回 User 模式的时候, spsr 寄存器就会将它保存的值,赋值给 User 模式下的 cpsr 寄存器,实现恢复的效果。
同理,其他任何一种模式切换的动作,都是类似的。
3、
回到用户模式下。
4、
User 模式切换到 IRQ 模式
。
5、
回到用户模式下。
6、
User 模式切换到 SVC 模式
。
7、
回到用户模式下。
8、
User 模式切换到 Undef 模式
。
9、
回到用户模式下。
10、
User 模式切换到 Abort 模式
。
11、
回到用户模式下。
12、
下图是 CPU 各种工作模式切换过程的 寄存器变化
示意图,图中写清楚了:各种工作模式下都会使用到 User mode 中使用的寄存器。
- 对于 sp(栈指针寄存器)和 lr (链接寄存器,用于函数返回),每一种模式都会有属于自己的栈空间,因此每个模式都需要属于自己的 sp(栈指针寄存器),用于恢复和保存自身工作模式下的栈空间现场;同理,每个工作模式都会有属于自己的 lr 寄存器,比如 IRQ 模式下进行了函数调用,IRQ 模式的 lr 寄存器用于保存 IRQ 模式进行函数调用时的返回地址,当函数调用执行结束后,回到被调用的地址处,继续往下执行 IRQ 模式下的剩余代码。
- spsr 寄存器用于保存和恢复 cpsr 寄存器的值。当处于 User 模式时,User 模式拥有一个 cpsr 寄存器的值。某个时刻,从 User 模式切换到 IRQ 模式,IRQ 模式使用和 User 模式同一个 cpsr 寄存器,此时需要用 IRQ 模式的 spsr 寄存器保存属于 User 模式的 cpsr 寄存器的值。这样,当从 IRQ 模式退出返回到 User 模式时, IRQ 模式的 spsr 寄存器就可以把 User 模式的 cpsr 寄存器值恢复回去。
注意:System 模式使用 User 模式寄存器集。
总结
- ARM 共有 37个寄存器,都是 32 位长度。
- 37 个寄存器中 30 个为“通用”型,1 个固定用作 PC,一个固定用作 CPSR,5 个固定用作 5 种异常模式下的 SPSR。
- 上述的
30 个为“通用”型
,是指这 30 个寄存器区别于后面的寄存器:PC 寄存器固定只能是 r15 寄存器,不能将其他寄存器作为 PC 寄存器使用; CPSR 和 SPSR 寄存器也是固定的,不能将其他寄存器作为 PC 寄存器使用。
三、CPSR程序状态寄存器
CPSR(当前程序状态寄存器) 可以在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。每一种处理器模式下都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存器)。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断程序退出时,可以用SPSR中保存的值来恢复CPSR。
由于用户模式和系统模式不是异常中断模式,所以它们没有SPSR。 当在用户模式或系统模式中访问SPSR时,将会产生不可预知的结果。
CPSR的格式如下所示。SPSR格式与CPSR格式相同。
1 、条件标志位
N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)统称为条件标志位。大部分的ARM指令可以根据CPSR中的这些条件标志位来选择性地执行。各条件标志位的具体含义如表1.5所示。
以下指令会影响CPSR中的条件标志位:
- 比较指令,如CMP、CMN、TEQ及TST等。
- 当一些算术运算指令和逻辑指令的目标寄存器不是R15时,这些指令会影响CPSR中的条件标志位。
- MSR指令可以向CPSR/SPSR中写入新值。
- MRC指令将R15作为目标寄存器时,可以把协处理器产生的条件标志位的值传送到ARM处理器。
- 一些LDM指令的变种指令可以将SPSR的值复制到CPSR中,这种操作主要用于从异常中断程序中返回。
- 一些带“位设置”的算术和逻辑指令的变种指令,也可以将SPS的值复制到CPSR中,这种操作主要用于从异常中断程序中返回。
2、CPSR中的控制位
CPSR 的低8位 I、F、T 及 M[4:0] 统称为控制位。当异常中断发生时,这些位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。
(1) 中断禁止位
① 当 I=1 时禁止IRQ中断。
② 当 F=1 时禁止FIQ中断。
(2) T控制位
T控制位用于控制指令执行的状态,即说明本指令是ARM指令,还是Thumb指令。对与不同版本的ARM处理器,T控制位的含义不同。
对于ARMv3以及更低的版本和ARMv4的非T系列版本的处理器,没有ARM状态和Thumb状态切换,T控制位应为0。
对于ARMv4以及更高的版本的T系列的ARM处理器,T控制位的含义如下。
①T=0表示执行ARM指令。
②T=1表示执行Thumb指令。
对于ARMv5以及更高的版本的非T系列的ARM处理器,T控制位的含义如下。
①T=0表示执行ARM指令。
②T=1表示强制下一条执行的指令产生未定义指令中断。
(3) M 控制位
控制位 M[4:0] 控制处理器模式,具体含义如表1.6所示。
3、注意
- CPSR中各个bit位表明了CPU的某些状态信息,这些信息非常重要,和后面学到的汇编指令息息相关(譬如BLE指令中的E就和CPSR中的Z标志位有关);
- CPSR中的 I、F位和开中断、关中断有关;
- CPSR中的mode位 (bit4~bit0共5位) 决定了CPU的工作模式,在uboot代码中会使用汇编进行设置;
四、PC(r15)程序控制寄存器
- PC(Program control register)为程序指针,PC 指向哪里,CPU 就会执行哪条指令(所以程序跳转时就是把目标地址代码放到 PC 中);
- 整个 CPU 中只有一个 PC(CPSR 也只有一个,但 SPSR 有 5 个);
B站朱友鹏老师.