微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 协处理器及其他指令之:状态寄存器访问指令

协处理器及其他指令之:状态寄存器访问指令

时间:08-13 来源:3721RD 点击:

为指令编码中的条件域。它指示指令在什么条件下执行。当<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.指令操作的伪代码

指令操作的伪代码如下面程序段所示。

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 and then

CPSR[31:24]=operand[31:24]

Else/*R==1*/

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]

4.指令的使用

详见MRS指令。

5.指令举例

(1)使用"读-修改-写"模式更新CPSR寄存器。

MRS r0,CPSR ;读CPSR寄存器的值

BIC r0,r0,#0xf0000000 ;清除N、Z、C、V位

MSR CPSR_f,r0 ;更新CPSR中的标志位

注意

因为PSR状态寄存器中存在目前没有定义的保留位,所以在使用时,最好加上"_fsxc"后缀,如上例中的"CPSR_f"。这样做的目的是使指令只修改程序状态寄存器的某个域,防止程序向高版本指令集移植时发生意外。

(2)禁止IRQ中断。

MRS r0,CPSR ;读CPSR状态寄存器

ORR r0,r0,#0x80 ;设置IRQ中断禁止位

MSR CPSR_c,r0 ;更新CPSR状态寄存器

(3)堆栈初始化。

INITSTACK

MOV r0,LR ;保存返回地址

;设置管理模式堆栈

MSR CPSR_c,#0xd3;

LDR SP,StackSvc;

;设置中断模式堆栈

MSR CPSR_c,#0xd2;

LDR SP,StackIrq;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top