cpsr 寄存器格式
版權聲明:本文為CSDN博主「Arrow」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/MyArrow/article/details/9701499
1. 簡介
CPSR(當前程序狀態寄存器)在任何處理器模式下被訪問。它包含了【條件標志位】、【中斷禁止位】、【當前處理器模式標志】以及其他的一些控制和狀態位。每一種處理器模式下都有一個專用的物理狀態寄存器,稱為SPSR (備份程序狀態寄存器)。
當特定的異常中斷發生時,這個寄存器用於存放當前程序狀態寄存器的內容。在異常中斷退出時,可以用SPSR來恢復CPSR。由於用戶模式和系統模式不是異常中斷模式,所以他沒有SPSR。當用戶在用戶模式或系統模式訪問SPSR,將產生不可預知的后果。
2. CPSR格式
CPSR格式如下所示。SPSR和CPSR格式相同。 CPSR格式如下圖所示:
3. 條件碼標志
N、Z、C、V均為條件碼標志位。它們的內容可被算術或邏輯運算的結果所改變,並且可以決定某條指令是否被執行。條件碼標志各位的具體含義如下表所示:
標志位 | 含義 |
N |
當兩個有符號整數運算時:
N=1:表示運算的結果為負數;
N=0:表示運算的結果為正數或零。
|
Z | Z=1表示運算的結果為零,Z=0表示運算的結果非零。 對於CMP指令,Z=1表進行比較的兩個數相等 |
C |
可以有4種方法設置C的值:
|
V | 對於加減運算指令,當操作數和運算結果為二進制的補碼表示的帶符號數時,V=1表示符號為溢出;通常其他指令不影響V位。 |
4. 控制位
CPSR的低八位I、F、T、M[4:0]統稱為控制位。當異常中斷發生時這些位發生變化。在特權級的處理器模式下,軟件可以修改這些控制位。
1) I: IRQ中斷禁止位:當I=1時禁止IRQ中斷,
2) F: FIQ中斷禁止位:當F=1時禁止FIQ中斷
3) T: T控制位該位反映處理器的運行狀態。當該位為1時,程序運行於THUMB狀態,否則運行於ARM狀態。該信號反映在外部引腳TBIT上。在程序中不得修改CPSR中的TBIT位,否則處理器工作狀態不能確定。
4) 保留位:CPSR中的其余位為保留位,當改變CPSR中的條件碼標志位或者控制位時,保留位不要改變,在程序中也不要用保留位存儲數據。保留位將用於ARM版本的擴展。
5) 運行模式位M[4:0]:這幾位是模式位,這些位決定了處理器的運行模式。具體含義如下表所示:
M[4:0] | 處理器模式 | ARM模式可訪問的寄存器 | THUMB模式可訪問的寄存器 |
0b10000 | 用戶模式 | PC,CPSR,R0~R14 | PC,CPSR,R0~R7,LR,SP |
0b10001 | FIQ模式 | PC,CPSR,SPSR_fiq,R14_fiq~R8_fiq,R0~R7 | PC,CPSR,SPSR_fiq,LR_fiq,SP_fiq,R0~R7 |
0b10010 | IRQ模式 | PC,CPSR,SPSR_irq,R14_irq~R13_irq,R0~R12 | PC,CPSR,SPSR_irq,LR_irq,SP_irq,R0~R7 |
0b10011 | 管理模式 | PC,CPSR,SPSR_svc,R14_svc~R13_svc,R0~R12 | PC,CPSR,SPSR_svc,LR_svc,SP_svc,R0~R7 |
0b10111 | 中止模式 | PC,CPSR,SPSR_abt,R14_abt~R13_abt,R0~R12 | PC,CPSR,SPSR_abt,LR_abt,SP_abt,R0~R7 |
0b11011 | 未定義模式 | PC,CPSR,SPSR_und,R14_und~R13_und,R0~R12 | PC,CPSR,SPSR_und,LR_und,SP_und,R0~R |
0b11111 | 系統模式 | PC,CPSR,R0~R14 | PC,CPSR,LR,SP,R0~R74 |
設置CPSR 寄存器-MSR指令和MRS指令
CPSR有4個8位區域:標志域(F)、狀態域(S)、擴展域(X)、控制域(C)
MSR - Load specified fields of the CPSR or SPSR with an immediate constant, or from the contents of a general-purpose register.
Syntax:
MSR{cond} <psr>_<fields>, #immed_8r
MSR{cond} <psr>_<fields>, Rm
where: {cond} is an optional condition code.
<psr> is either CPSR or SPSR.
<fields> specifies the field or fields to be moved. <fields> can be one or more of:
c control field mask byte (PSR[7:0])
x extension field mask byte (PSR[15:8])
s status field mask byte (PSR[23:16)
f flags field mask byte (PSR[31:24]).
immed_8r is an expression evaluating to a numeric constant. The constant must correspond to an 8-bit pattern rotated by an even number of bits within a 32-bit word.
Rm is the source register.
C 控制域屏蔽字節(psr[7:0])
X 擴展域屏蔽字節(psr[15:8])
S 狀態域屏蔽字節(psr[23:16])
F 標志域屏蔽字節(psr[31:24])
常用於MRS或MSR指令,用於psr中的值轉移到寄存器 或 把寄存器的內容加載到psr中.
如:
MSR CPSR_c,#0xd3