本文主要是介绍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]
else 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]
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中的控制位域
这篇关于ARM指令集——状态寄存器访问指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!