ARM指令集——状态寄存器访问指令

ARM中有两条指令用于状态寄存器和通用寄存器之间传送数据。程序不能直接修改CPSR中的T控制位直接将程序状态切换到Thumb状态,必须通过BX等指令完成程序状态的切换。通常修改状态寄存器时通过“读取-修改-写回”的操作序列来实现的。状态寄存器访问指令包括以下两条指令:

  • MRS 状态寄存器到通用寄存器的传送指令
  • MSR 通用寄存器到状态寄存器的传送指令
下面一一介绍之:
1、MRS
指令的语法格式:
MRS{<cond>} <Rd>, CPSR
MRS{<cond>} <Rd>, SPSR
指令操作的伪代码:
if ConditionPassed(cond) then 
if R == 1 then
Rd = SPSR
else
Rd = CPSR

指令的使用:
MRS指令主要用于以下3种场合:
  • 通常通过“读出-修改-写回”操作序列修改状态寄存器的内容。MRS指令用于将状态寄存器的内容读到通用寄存器中。
  • 当异常中断允许嵌套时,需要在进入异常中断后,嵌套中断之前保存当前处理模式对应的SPSR。这时需要先通过MRS指令读出SPSR的值,再用其他指令将SPSR值保存起来。
  • 在进程切换时也需要保存当前状态寄存器的值。

2、MSR
指令的语法格式:
MSR{<cond>} CPSR_<fields>, #<immediate>
MSR{<cond>} CPSR_<fields>, <Rm>
MSR{<cond>} SPSR_<fields>, #<immediate>
MSR{<cond>} SPSR_<fields>, <Rm>
其中,
<fields>设置状态寄存器中的位域。状态寄存器的32位可以分为4个8位的域。bits[31:24]为条件标志位,用f表示;bits[23:16]为状态位域,用s表示。bits[15:8]扩展位域,用x表示。bits[7:0]控制位域,用c表示。
指令操作的伪代码:
if ConditionPassed(cond) then
if operand[25] == 1
operand = 8_bit_immediate Rotate_Right (rotate_imm * 2)
else
operand = Rm
if R == 0 then
if field_mask[0] == 1 and InAPrivilegedMode() then
CPSR[7:0] = operand[7:0]
if field_mask[1] == 1 and InAPrivilegedMode() then
CPSR[15:8] = operand[15:8]
if field_mask[2] == 1 and InAPrivilegedMode() then
CPSR[23:16] = operand[23:16]
if field_mask[3] == 1 and InAPrivilegedMode() then
CPSR[31:24] = operand[31:24]
else
if field_mask[0] == 1 and CurrentModeHasSPSR() then
SPSR[7:0] = operand[7:0]
if field_mask[1] == 1 and CurrentModeHasSPSR() then
SPSR[15:8] = operand[15:8]
if field_mask[2] == 1 and CurrentModeHasSPSR() then
SPSR[23:16] = operand[23:16]
if field_mask[3] == 1 and CurrentModeHasSPSR() then
SPSR[31:24] = operand[31:24]

指令的使用:
MSR指令通常用于恢复状态寄存器的内容或者改变状态寄存器的内容。
当退出异常中断处理程序时,如果事先保存了状态寄存器的内容,通常通过MSR指令将事先保存的状态寄存器内容恢复到状态寄存器中。
当需要修改状态寄存器中的内容时,通过“读出-修改-写回”指令序列完成。写回操作也是通过MSR指令完成的。
考虑到指令执行的效率,通常在MSR指令中指定指令将要修改的位域。例如,下面的指令序列将处理器模式切换到特权模式,这里只修改状态寄存器的控制位域,所以在指令中指定该位域。
MRS R0,CPSR ;读取CPSR
BIC R0, R0, #0x1F ;修改、去除当前处理器模式
ORR R0, R0,#0x13 ;修改、设置特权模式
MSR CPSR_c,R0 ;写回,仅仅修改CPSR中的控制位域

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值