arm cpsr 寄存器解析和設置



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格式如下圖所示:
1644648087(1)


3. 條件碼標志

     N、Z、C、V均為條件碼標志位。它們的內容可被算術或邏輯運算的結果所改變,並且可以決定某條指令是否被執行。條件碼標志各位的具體含義如下表所示:

標志位 含義
N
當兩個有符號整數運算時:
N=1:表示運算的結果為負數;
N=0:表示運算的結果為正數或零。
Z Z=1表示運算的結果為零,Z=0表示運算的結果非零。
對於CMP指令,Z=1表進行比較的兩個數相等
C
可以有4種方法設置C的值:
  •  在加法指令中(包括比較指令CMP),當結果產生了進位,則C=1,表示無符號運算發生上溢出;其他情況C=0。
  • 在減法指令中(包括減法指令CMP),當運算中發生借位,則C=0,表示無符號運算數發生下溢出;其他情況下C=1。
  • 對於包含移位操作的非加鹼運算指令,C中包含最后一次溢出的的位的數值
  • 對於其他非加減運算指令,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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM