ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据。
关于状态寄存器,这里仅强调以下几点。
- 状态寄存器中,有些位是当前没有使用的,但在ARM将来的版本中有可能使用这些位,因此用户程序不要使用这些位。
- 程序不能通过直接修改CPSR中的T控制位直接将程序状态切换到Thumb状态,必须通过BX等指令完成程序状态的切换。
- 通常修改状态寄存器是通过"读取-修改-写回"的操作序列来实现的。
- 状态寄存器访问指令包括以下两条。
- MRS:状态寄存器到通用寄存器的传输指令
- MSR:通用寄存器到状态寄存器的传输指令
MRS
MRS指令用于将状态及粗气你的内容传送到通用寄存器。
指令的编码格式
指令的语法格式
MRS{< cond >} < Rd >, CPSR
MRS{< cond >} < Rd >, SPSR
其中:
- < cond >为指令执行的条件码。当< cond >忽略时,指令为无条件执行。其他指令中< cond >的用法于此相同。
- < Rd >为目标寄存器。
指令操作的伪代码
if ConditionPassed(cond) then
if R == 1 then
Rd = SPSR
else
Rd = CPSR
指令的使用
MRS 指令主要用于以下3中场合:
- 通常通过"读取-修改-写回"操作序列修改状态寄存器的内容。MRS指令用于将状态寄存器的内容读取到通用寄存器
- 当异常中断允许嵌套时,需要在进入异常中断之后,嵌套中断发生之前保存当前处理器模式对应的SPSP。这时需要先通过MRS指令读出SPSR的值,再用其他指令将SPSR的值保存起来。
- 在进程切换时也需要保存当前状态寄存器值。