协处理器及其他指令之:状态寄存器访问指令
为指令编码中的条件域。它指示指令在什么条件下执行。当<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;
- 实时操作系统软件调度器/硬件调度器的设计与实现(03-27)
- BASIC在PLC控制系统中的应用(08-15)
- 协处理器及其他指令之:零计数指令CLZ(08-13)
- 协处理器及其他指令之:交换指令(08-13)
- 协处理器及其他指令之:协处理器指令(08-13)
- 高效的C编程之: 浮点运算(08-30)