ARM 体系结构的相关基础知识
本篇介绍ARMv7-A的寄存器组
一、ARMv7-A寄存器
ARM 架构提供16个 32 位通用寄存器(R0-R15)供软件使用。其中 15 个寄存器(R0-R14)可用于通用数据存储,而 R15 是程序计数器,其值会随着内核执行指令而改变。软件对 R15 的明确写入将改变程序流程。软件还可以访问当前程序状态寄存器 (CPSR) 以及先前执行模式中保存的 CPSR 副本,即备份程序状态寄存器(SPSR)。

ARM处理器在每一种处理器模式中有一组相应的寄存器组。在所有模式下,可见的寄存器包括15个通用寄存器(R0~R14)、一个或两个状态寄存器及程序计数器(PC)。在所有的寄存器中,有些是各模式共用的同一个物理寄存器;有一些寄存器是各模式自己拥有的独立的物理寄存器。

深色的是各个模式所独有的寄存器,其他的寄存器与 User 模式所共有。
用户模式下的程序访问的程序状态寄存器叫做APSR(Application Program Status Register),APSR是CPSR在用户模式下的别名,因为在用户模式下CPSR的部分域是不能操作的,因此CPSR的部分域被屏蔽后就是APSR。
1.1 特殊的通用寄存器
-
R13(堆栈指针寄存器,Stack Pointer,SP): 在ARM中常用作栈指针
每种异常模式下都应该初始化R13,使其指向该异常模式专用的栈地址。 -
R14(链接寄存器,Link Register,LR):保存使用链接分支(BL)指令时输入的子程序返回地址。
在不支持子程序返回时,它也可用作通用寄存器。R14_svc、R14_irq、R14_fiq、R14_abt 和 R14_und 的使用方法类似,当中断和异常发生时,或者在中断或异常例程中执行分支和链接指令时,R14_svc、R14_irq、R14_fiq、R14_abt 和 R14_und 用于保存 R15 的返回值。 -
R15(程序计数器,PC):保存当前程序地址
因为ARM 处理器的三级流水线机制(取指->译码->执行),PC始终指向正在取指的地址,所以它总是指向当前指令前 8 个字节,在 Thumb 状态下,它总是指向当前指令前 4 个字节,这是原 ARM1 处理器三级流水线的传统)。在 ARM 状态下读取 R15 时,位 [1:0] 为 0,位 [31:2] 包含 PC。在 Thumb 状态下,位 [0] 始终为零。
R0-R14 的复位值不可预测。堆栈指针 SP 必须由启动代码初始化(针对每种模式),然后才能使用堆栈。
1.2 程序状态寄存器
CPSR(当前程序状态寄存器)可以在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。每一种处理器模式下都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存器)。当特定的异常中断发生时,这个寄存器自动存放当前程序状态寄存器的内容。在异常中断程序退出时,可以用SPSR中保存的值来恢复CPSR。
当前程序状态寄存器(CPSR)用于存储
- APSR 标志。
- 当前处理器模式
- 中断禁用标志
- 当前处理器状态,即 ARM、Thumb、ThumbEE 或 Jazelle。
- 字节序
- IT 块的执行状态位。
由于用户模式和系统模式不是异常中断模式,所以它们没有SPSR。当在用户模式或系统模式中访问SPSR时,将会产生不可预知的结果。
应用程序程序员必须使用 APSR 来访问 CPSR 中可在非特权模式下更改的部分。APSR 只能用于访问 N、Z、C、V、Q 和 GE[3:0] 位。这些位通常不直接访问,而是由条件代码设置指令设置,并由有条件执行的指令进行测试。
CPSR的格式如下所示。SPSR格式与CPSR格式相同。

N(Negative)、Z(Zero)、C(Carry)及 V(oVerflow)统称条件标志位。
各个 bit 代表以下内容:
| BIT | Field | Description |
|---|---|---|
| bit[31] | N | 当两个补码表示的有符号整数运算的时候, N=1 表示运算对的结果为负数;N=0表示结果为正数。 |
| bit[30] | Z | Z=1 表示运算结果为零;Z=0 表示运算结果不为零。 对于 CMP 指令, Z=1 表示进行比较的两个数大小相等。 |
| bit[29] | C | 在加法指令中,当结果产生了进位,则 C=1,表示无符号数运算发生上溢出;其它情况下 C=0。 在减法指令中,当运算中发生借位,则 C=0,表示无符号数运算发生下溢出;其它情况下 C=1。 对于包含移位操作的非加/减法运算指令,C 中包含最后一次溢出的位的数值。 对于其它非加/减运算指令, C 位的值通常不受影响。 |
| bit[28] | V | 对于加/减法运算指令,当操作数和运算结果表示为二进制的补码表示的带符号数时, V=1 表示符号位溢出,通常其他位不影响 V 位。 |
| bit[27] | Q | 累计饱和(也称为粘滞)。 |
| bit[26:25] | IT[1:0] | 见 IT[7:2] |
| bit[24] | J | 表示内核是否处于 Jazelle 状态。 |
| bit[23:20] | Reserved | 保留 |
| bit[19:16] | GE[3:0] | 某些 SIMD 指令使用。 |
| bit[15:10] | IT[7:2] | IT[7:0] 为 Thumb-2 指令组的 If-Then 条件执行。 |
| bit[9] | E | 大小端控制位, E=1 表示大端模式, E=0 表示小端模式。 |
| bit[8] | A | 禁止异步中断位, A=1 表示禁止异步中断。 |
| bit[7] | I | I=1 禁止 IRQ, I=0 使能 IRQ。 |
| bit[6] | F | F=1 禁止 FIQ, F=0 使能 FIQ。 |
| bit[5] | T | 指示内核是否处于 Thumb 状态。 |
| bit[4:0] | M[4:0] | 控制位,指定处理器模式 |
处理器模式,如下表:
| M[4:0] | Mode |
|---|---|
| 10000 | User (USR) |
| 10001 | FIQ |
| 10010 | IRQ |
| 10011 | Supervisor(SVC) |
| 10110 | Monitor (MON) |
| 10111 | Abort (ABT) |
| 11010 | Hyp (HYP) |
| 11011 | Undef (UND) |
| 11111 | System (SYS) |
内核可使用直接写入 CPSR 模式位的指令在不同模式间切换。更常见的情况是,处理器因异常事件而自动更改模式。在用户模式下,不能操作控制处理器模式的 CPSR 位 [4:0],或控制异常启用或禁用的 A、I 和 F 位。
1.3 协处理器15(Coprocessor 15)
CP15,即系统控制协处理器,负责控制处理核心的许多功能。它最多可包含16个32位主寄存器。对CP15的访问受特权权限控制,并非所有寄存器在用户模式下均可用。CP15寄存器访问指令需指定目标主寄存器,指令中的其他字段则用于更精确地定义访问方式,并扩展CP15中物理32位寄存器的数量。CP15的16个主寄存器被命名为c0至c15,但通常以功能名称指代。例如,CP15系统控制寄存器被称为CP15.SCTLR。

3329

被折叠的 条评论
为什么被折叠?



