1、ARM 总共有 37 个寄存器,但是每种模式下最多只能看到 18 个寄存器,其他寄存器虽然名字相同,但是在当前模式不可见。
2、例如,对 r13 这个名字来说,在 ARM 中共有 6 个名叫 r13(又叫 sp)的寄存器,但是在每种特定处理器模式下,只有一个 r13 是当前可见的,其他的 r13 必须切换到它们的对应模式下才能看到。这种设计叫影子寄存器(banked register)。
3、这 37 个寄存器的地址都是不一样的,虽然它们可以有相同的名字。同时,有些寄存器甚至还有别名,比如在汇编代码中,r15 寄存器也写作 pc 寄存器。
当前处在 User 用户模式
下,可以看到所有 r0 ~ r15 寄存器、以及 cpsr 寄存器。
某一时刻,CPU 切换到 FIQ 模式
。此时, 寄存器列表中的 r8 ~ r14 寄存器将是属于 FIQ 模式自身的寄存器,这几个 r8 ~ r14 寄存器,与 User 模式的 r8 ~ r14 寄存器是不同的寄存器,只是名字相同。
并且,FIQ 模式下的 spsr 寄存器将会保存 User 模式下的 cpsr 寄存器的状态;等到切换回 User 模式的时候, spsr 寄存器就会将它保存的值,赋值给 User 模式下的 cpsr 寄存器,实现恢复的效果。
同理,其他任何一种模式切换的动作,都是类似的。
回到用户模式下。
User 模式切换到 IRQ 模式
。
回到用户模式下。
User 模式切换到 SVC 模式
。
回到用户模式下。
User 模式切换到 Undef 模式
。
回到用户模式下。
User 模式切换到 Abort 模式
。
回到用户模式下。
下图是 CPU 各种工作模式切换过程的 寄存器变化
示意图,图中写清楚了:各种工作模式下都会使用到 User mode 中使用的寄存器。
注意:System 模式使用 User 模式寄存器集。
ARM 处理器共有 7 种不同的处理器模式,在每一种处理器模式中有一组相应的寄存器组。任意时刻(也就是任意的处理器模式下),可见的寄存器包括 15 个通用寄存器( R0~R14)、一个或两个状态寄存器及程序计数器( PC )。在所有的寄存器中,有些是各模式共用的同一个物理寄存器:有一些寄存器是各模式自己拥有的独立的物理寄存器。表1.4 列出了各种处理器模式下可见的寄存器情况。
通用寄存器可以分为下面 3 类:
未备份寄存器包括 R0~R7。对于每一个未备份寄存器来
说,在所有的处理器模式下指的都是同一个物理寄存器
。在异常中断造成处理器模式切换时,由于不同的处理器模式使用相同的物理寄存器,可能造成寄存器中数据被破坏
。 未备份寄存器没有被系统用于特别的用途,任何可采用通用寄存器的应用场合,都可以使用未备份寄存器。
对于备份寄存器 R8~R12 来说,每个寄存器对应两个不同的物理寄存器。例如,当使用 快速中断模式
下的寄存器时,寄存器 R8 和寄存器 R9 分别记作 R8_fiq、R9_fiq
; 当使用 用户模式
下的寄存器时,寄存器R8和寄存器R9分别记作 R8_usr、R9_usr
等。 在这两种情况下,使用的是不同的物理寄存器。系统没有将这几个寄存器用于任何特殊用途,但是当中断处理非常简单,仅仅使用 R8 ~ R14 寄存器时,FIQ 处理程序可以不必执行保存和恢复中断现场的指令,从而可以使中断处理过程非常迅速。
对于备份寄存器 R13 和 R14 来说,每个寄存器对应 6 个不同的物理寄存器,其中的一个是用户模式和系统模式共用的:另外的 5 个对应于其他 5 种处理器模式。采用下面的记号来区分各个物理寄存器:
R13_< mode >
其中,< mode >可以是下面几种模式之一:usr、svc、abt、und、irg 及 fiq。
寄存器 R13 在 ARM 中常用作栈指针。在 ARM 指令集中,这只是一种习惯的用法,并没有任何指令强制性地使用 R13 作为栈指针,用户也可以使用其他的寄存器作为栈指针;而在 Thumb 指令集中,有一些指令强制性地使用 R13 作为栈指针。
每一种异常模式拥有自己的物理的 R13(sp 栈指针) 。应用程序初始化该 R13 (sp 栈指针),使其指向该异常模式专用的栈地址
。当进入异常模式时,可以将需要使用的寄存器保存在 R13 所指的栈中:当退出异常处理程序时,将保存在 R13 所指的栈中的寄存器值弹出。这样就使异常处理程序不会破坏被它所中断的程序的运行现场。
寄存器 R14 又被称为连接寄存器(Link Register,LR),在 ARM 体系中具有下面两种特殊的作用:
(1) 每一种处理器模式自己的物理 R14 中存放着当前子程序的返回地址。当通过 BL 或 BLX 指令调用子程序时,R14 被设置成该子程序的返回地址。在子程序中,当把 R14 的值复制到程序计数器PC中时,子程序即返回。可以通过下面两种方式实现这种子程序的返回操作。
① 执行下面任何一条指令:
MOV PC, LR
BX LR
(2) 当异常中断发生时,该异常模式特定的物理 R14 被设置成该异常模式将要返回的地址,对于有些异常模式,R14 的值可能与将返回的地址有一个常数的偏移量。R14 寄存器也可以作为通用寄存器使用。
程序计数器 R15 又被记作 PC 。它虽然可以作为一般的通用寄存器使用,但是有一些指令在使用 R15 时有一些特
殊限制。当违反了这些限制时,该指令执行的结果将是不可预料的。
由于ARM 采用了流水线机制,当正确读取了 PC 的值时,该值为当前指令地址值加 8 个字节。也就是说,对于
ARM 指令集来说,PC 指向当前指令的下两条指令的地址。由于 ARM 指令是字对齐的,PC值的第 0 位和第 1 位总为 0
。
30 个为“通用”型
,是指这 30 个寄存器区别于后面的寄存器:PC 寄存器固定只能是 r15 寄存器,不能将其他寄存器作为 PC 寄存器使用; CPSR 和 SPSR 寄存器也是固定的,不能将其他寄存器作为 PC 寄存器使用。
CPSR(当前程序状态寄存器) 可以在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。每一种处理器模式下都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存器)。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断程序退出时,可以用SPSR中保存的值来恢复CPSR。
由于用户模式和系统模式不是异常中断模式,所以它们没有SPSR。 当在用户模式或系统模式中访问SPSR时,将会产生不可预知的结果。
CPSR的格式如下所示。SPSR格式与CPSR格式相同。
N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)统称为条件标志位。大部分的ARM指令可以根据CPSR中的这些条件标志位来选择性地执行。各条件标志位的具体含义如表1.5所示。
以下指令会影响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所示。
B站朱友鹏老师.