刘帅嵌入式系统-MSR指令

刘帅嵌入式系统-MSR指令_第1张图片

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表示;bit[23:16]为状态域,用s表示;bit[15:8]为扩展域,用x表示;bit[7:0]为控制位域,用c表示。
  • < immediate >为将要传送到状态寄存器中的立即数,该立即数的计算方法在之前已经介绍。
  • < Rm >寄存器包含将要传送到状态寄存器中的数据。

指令操作的伪代码

if ConditionPassed(cond) then
	if opcode[25] == 1
        operand = 8_bit_immediate Rotate_Right (rotate_imm *2)
    else /* opcode[25] == 0 */
        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
    		CPSR[31:24] = operand[31:24]
    else /* R == 1 */
    	if field_mask[0] == 1 and CurrentModeHasSPSR() then
    		CPSR[7:0] = operand[7:0]
    	if field_mask[1] == 1 and CurrentModeHasSPSR() then
    		CPSR[15:8] = operand[15:8]
    	if field_mask[2] == 1 and CurrentModeHasSPSR() then
    		CPSR[23:16] = operand[23:16]
    	if field_mask[3] == 1 and CurrentModeHasSPSR() then
    		CPSR[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中的控制位域

但是,当进程切换到应用场合时,应指定SPSR_fsxc,这样,将来ARM扩展了当前未用的一些位后,程序还可以正常运行。

当欲修改的状态寄存器位域中包含未分配的位时,最好不要使用立即数方式的MSR指令。一个例外的情况是,可以使用立即数方式的MSR指令修改状态寄存器中的条件标志位位域。

你可能感兴趣的:(ARM)