轉自:http://blog.sina.com.cn/s/blog_6ac051b2010123cz.html
MRS,狀態寄存器傳送至通用寄存器類指令
功能:將狀態寄存器的內容傳送至通用寄存器。
格式:
MRS{<條件碼>}Rd,CPSR}SPSR
其中:
Rd 目標寄存器,Rd不允許R15。
R=0 將CPSR中的內容傳送目的寄存器。
R=1 將SPSR中的內容傳送至目的寄存器。
注釋:
MRS與MSR配合使用,作為更新PSR的讀-修改-寫序列的一部分。例如:改變處理器或清除標志Q。注意:當處理器在用戶模式或系統模式下,一定不能試圖訪問SPSR
這條指令不影響條件碼標志。
例:
MRS R0,CRSR ;將CPSR中的內容傳送至R0
MRS R3,SPSR ;將SPSR中的內容傳送至R3
MSR,通用寄存器傳送至狀態寄存器傳送指令
功能:將通用寄存器的內容傳送至狀態寄存器。
格式:
MSR{<條件碼>CPSR_f|SPSR_f,<#immed_8r>
MSR{<條件碼>CPSR_<field>|SPSR_<field>,Rm
其中:
<field>字段可以是以下之一或多種:(位從右到左)
C:控制域屏蔽字段(PSR中的第0位到第7位);
X:擴展域屏蔽字段(PSR中的第8位到第15位);
S:狀態域屏蔽字段(PSR中的第16位到第32位);
F:標志域屏蔽字段(PSR中的第24位到第31位)。
immed_8r 值數字常量的表達式。常量必須對應8位位圖。該位圖在32位字中循環移位偶數數位。
Rm 源寄存器。
注釋:
同前一條指令(MRS)。
例1:設置N、Z、C、V標志。
MSR CPSR_f,#&f0000000 ;僅高位有效,其他必須為0
例2:
僅置位C標志,保留N、Z、V標志。
MRS R0,CPSR ;將CPSR中的內容傳送至R0
ORR R0,R0,#&1f ;置位R0的第29位
MSR CPSR_c,R0 ;再將R0中的內容傳送至CPSR
例子:設置cpu工作在超級保護模式(SVC32)
@set the cpu to SVC32 mode
mrs r0,cpsr
@把CPSR內容存入r0.使用了mrs指令:專用寄存器到通過寄存器的存取.
@CPSR當前程序狀態寄存器格式如下:
@ 31 30 29 28 27 26 25 24 ~ ~ ~ 8 7 6 5 4 3 2 1 0
@ ___ ___ ___ ___ ___ ___ ___ ___ _ _ _ _ ___ ___ ___ ____ ____ ____ ____ ____
@| N | Z | C | V | * | * | * | * | * * * | I | F | T | M4 | M3 | M2 | M1 | M0 |
@
bic r0,r0,#0x1f
@bic指令(bit clear): r0:= r0 and (not op2).上邊的指令目的是把bit0~bit4清零.
orr r0,r0,#0xd3
@r0:= r0 or 0xd3 . 以上三條指令執行后r0值為:**** **** **** **** **** ***** 11*1 0011
msr cpsr,r0
@把r0存於cpsr.注意:msr指令是專用的通用寄存器到特殊功能寄存器的指令與mrs對應
說明:通過上邊的指令可以看到,實現了兩個功能.1,disable 外部中斷(IRQ)與快速中斷(FIR).2,把系統設為SVC32狀態(超級保護)即M4~M1=10011