协处理器及其他指令之:状态寄存器访问指令
9.2.2写状态寄存器指令MSR
1.指令编码格式
写状态寄存器指令MSR(MovetoStatusRegisterfromARMRegister)。在ARM处理器中,只有MSR指令可以直接设置状态寄存器CPSR或SPSR。
图9.7、图9.8分别显示了源操作数为立即数的MSR指令和源操作数为寄存器的MSR指令的编码格式。
图9.7源操作数为立即数的MSR指令编码格式
图9.8源操作数为寄存器的MSR指令编码格式
2.指令的语法格式
MSR{cond>}CPSR_fields>,#immediate>
MSR{cond>}CPSR_fields>,Rm>
MSR{cond>}SPSR_fields>,#immediate>
MSR{cond>}SPSR_fields>,Rm>
①cond>
为指令编码中的条件域。它指示指令在什么条件下执行。当cond>忽略时,指令为无条件执行(cond=AL(Alway))。
②fields>
域标志位,是下面选项中的一种或几种的组合。
·C:设置控制位掩码域(bit[16])。
·X:设置扩展位掩码域(bit[17])。
·S:设置状态位掩码域(bit[18])。
·F:设置标志位掩码域(bit[19])
③immediate>
将被传送到CPSR和SPSR寄存器的立即数。此立即数可以为8位立即数(范围在0x00~0xff之间)。
④Rm>
指定的通用寄存器,此寄存器包含将要被传送状态寄存器中的数据。
3.指令操作的伪代码
指令操作的伪代码如下面程序段所示。
IfConditionPassed{cond}then
Ifopcode[25]==1
Operand=8_bit_immediateRotate_Right{rotate_imm*2}
Else/*opcode[25]==0*/
Operand=Rm
IfR==0then
Iffield_mask[0]==1andinAprivilegedMode()then
CPSR[7:0]=operand[7:0]
Iffield_mask[1]==1andinAprivilegedMode()then
CPSR[15:8]=operand[15:8]
Iffield_mask[2]==1andinAprivilegedMode()then
CPSR[23:16]=operand[23:16]
Iffield_mask[3]==1andthen
CPSR[31:24]=operand[31:24]
Else/*R==1*/
Iffield_mask[0]==1andCurrentModeHasSPSR()then
SPSR[7:0]=operand[7:0]
Iffield_mask[1]==1andCurrentModeHasSPSR()then
SPSR[15:8]=operand[15:8]
Iffield_mask[2]==1andCurrentModeHasSPSR()then
SPSR[23:16]=operand[23:16]
Iffield_mask[3]==1andCurrentModeHasSPSR()then
SPSR[31:24]=operand[31:24]
评论