ARMv7-A寄存器

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 代表以下内容:

BITFieldDescription
bit[31]N当两个补码表示的有符号整数运算的时候, N=1 表示运算对的结果为负数;N=0表示结果为正数。
bit[30]ZZ=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]II=1 禁止 IRQ, I=0 使能 IRQ。
bit[6]FF=1 禁止 FIQ, F=0 使能 FIQ。
bit[5]T指示内核是否处于 Thumb 状态。
bit[4:0]M[4:0]控制位,指定处理器模式

处理器模式,如下表:

M[4:0]Mode
10000User (USR)
10001FIQ
10010IRQ
10011Supervisor(SVC)
10110Monitor (MON)
10111Abort (ABT)
11010Hyp (HYP)
11011Undef (UND)
11111System (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。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uoscn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值