ARM處理器的程序狀態(tài)寄存器(CPSR,SPSR)訪問指令
數(shù)據(jù),程序狀態(tài)寄存器訪問指令包括以下兩條:
— MRS 程序狀態(tài)寄存器到通用寄存器的數(shù)據(jù)傳送指令
— MSR 通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送指令
1、 MRS 指令
MRS 指令的格式為:
MRS{條件} 通用寄存器,程序狀態(tài)寄存器(CPSR 或SPSR)
MRS 指令用于將程序狀態(tài)寄存器的內(nèi)容傳送到通用寄存器中。該指令一般用在以下幾種情況:
- 當(dāng)需要改變程序狀態(tài)寄存器的內(nèi)容時,可用MRS 將程序狀態(tài)寄存器的內(nèi)容讀入通用寄存
器,修改后再寫回程序狀態(tài)寄存器。
- 當(dāng)在異常處理或進(jìn)程切換時,需要保存程序狀態(tài)寄存器的值,可先用該指令讀出程序狀態(tài)
寄存器的值,然后保存。
指令示例:
MRS R0,CPSR ;傳送CPSR 的內(nèi)容到R0
MRS R0,SPSR ;傳送SPSR 的內(nèi)容到R0
2、 MSR 指令
MSR 指令的格式為:
MSR{條件} 程序狀態(tài)寄存器(CPSR 或SPSR)_<域>,操作數(shù)
MSR 指令用于將操作數(shù)的內(nèi)容傳送到程序狀態(tài)寄存器的特定域中。其中,操作數(shù)可以為通用寄存
器或立即數(shù)。<域>用于設(shè)置程序狀態(tài)寄存器中需要操作的位,32 位的程序狀態(tài)寄存器可分為4 個域:
位[31:24]為條件標(biāo)志位域,用f 表示;
位[23:16]為狀態(tài)位域,用s 表示;
位[15:8]為擴(kuò)展位域,用x 表示;
位[7:0]為控制位域,用c 表示;
該指令通常用于恢復(fù)或改變程序狀態(tài)寄存器的內(nèi)容,在使用時,一般要在MSR 指令中指明將要
操作的域。
指令示例:
MSR CPSR,R0 ;傳送R0 的內(nèi)容到CPSR
MSR SPSR,R0 ;傳送R0 的內(nèi)容到SPSR
MSR CPSR_c,R0 ;傳送R0 的內(nèi)容到SPSR,但僅僅修改CPSR 中的控制位域
//
1 狀態(tài)寄存器傳送至通用寄存器類指令
功能:將狀態(tài)寄存器的內(nèi)容傳送至通用寄存器。
格式:
MRS{<條件碼>}Rd,CPSR}SPSR
其中:
Rd 目標(biāo)寄存器,Rd不允許R15。
R=0 將CPSR中的內(nèi)容傳送目的寄存器。
R=1 將SPSR中的內(nèi)容傳送至目的寄存器。
注釋:
MRS與MSR配合使用,作為更新PSR的讀-修改-寫序列的一部分。例如:改變處理器或清除標(biāo)志Q。注意:當(dāng)處理器在用戶模式或系統(tǒng)模式下,一定不能試圖訪問SPSR
這條指令不影響條件碼標(biāo)志。
例:
MRS R0,CRSR ;將CPSR中的內(nèi)容傳送至R0
MRS R3,SPSR ;將SPSR中的內(nèi)容傳送至R3
2.通用寄存器傳送至狀態(tài)寄存器傳送指令
功能:將通用寄存器的內(nèi)容傳送至狀態(tài)寄存器.
格式:
MSR{<條件碼>CPSR_f|SPSR_f,<#ommed_8r>
MSR{<條件碼>CPSR_
其中:
C:控制域屏蔽字段(PSR中的第0位到第7位);
X:擴(kuò)展域屏蔽字段(PSR中的第8位到第15位);
S:狀態(tài)域屏蔽字段(PSR中的第16位到第32位);
F:標(biāo)志域屏蔽字段(PSR中的第24位到第31位)。
immed_8r 值數(shù)字常量的表達(dá)式。常量必須對應(yīng)8位位圖。該位圖在32位字中循環(huán)移位偶數(shù)數(shù)位。
Rm 源寄存器。
注釋:
同前一條指令(MRS)。
例1:設(shè)置N、Z、C、V標(biāo)志。
MSR CPSR_f,#&f0000000 ;僅高位有效,其他必須為0
例2:
僅置位C標(biāo)志,保留N、Z、V標(biāo)志。
MRS R0,CPSR ;將CPSR中的內(nèi)容傳送至R0
ORR R0,R0,#&1f ;置位R0的第29位
MSR CPSR_c,R0 ;再將R0中的內(nèi)容傳送至CPSR
評論