1. 程式人生 > >令狀態寄存器訪問指令(MRS,MSR)

令狀態寄存器訪問指令(MRS,MSR)

時也 技術分享 偽代碼 根據 AS 都是 man arm處理器 ima

ARM中有兩條指令用於在狀態寄存器和通用寄存器之間傳送數據。

針對32位的ARM處理器,狀態寄存器就是一個32位長的寄存器。每個位的含義如下圖:
技術分享圖片

分成了4部分:

1,條件標誌位

N(Negative), Z(Zero), C(Carry), V(Verflow)統稱為條件標誌位。ARM指令可以根據CPSR中的這些條件標誌位來選擇性的執行。

2,Q標誌位

ARM v5的E系列處理器中,CPSR的bit[27]稱為Q標誌位。主要用於指示增強的DSP指令是否發生了溢出。

3,控制位

I, F, T以及M[4:0]統稱為控制位。當異常中斷發生時,這些位發生變化。在特權級的處理器模式下,軟件可以修改這些控制位。

下表示控制位M[4:0]的含義:


M[4:0]

處理器模式

可訪問的寄存器

0b10000

用戶模式

PC,CPSR, R14~R0

0b10001

FIQ模式

PC,CPSR, SPSR_fiq,R14_fiq,R8_fiq, R7~R0

0b10010

IRQ模式

PC,CPSR, SPSR_irq,R14_irq,R13_irq,R12~R0

0b10011

管理模式

PC,CPSR, SPSR_svc,R14_svc,R13_svc,R12~R0

0b10111

中止模式

PC,CPSR, SPSR_abt,R14_abt,R13_abt, R12~R0

0b11011

未定義模式

PC,CPSR, SPSR_und,R14_und,R13_und, R12~R0

0b11111

系統模式

PC,CPSR(ARMv4及以上版本), R14~R0

4,保留位
用於將來ARM版本的擴展。

狀態寄存器訪問指令僅有兩天:

MRS: 狀態寄存器到通用寄存器的傳送指令。

MSR: 通用寄存器到狀態寄存器的傳送指令。

MRS指令介紹

MRS的指令編碼格式:


技術分享圖片
指令的語法格式:

MRS{<cond>}<Rd>, CPSR

MRS{<cond>}<Rd>, SPSR

其中:

<cond>為指令執行的條件碼。當<cond>忽略時指令為無條件執行。

<Rd>為目標寄存器。

指令操作的偽代碼:

C代碼 技術分享圖片
  1. if ConditionPassed(cond) then
  2. if R == 1 then
  3. Rd = SPSR
  4. else
  5. Rd = CPSR

MSR指令使用的場合:

  • 通常通過“讀取-修改-寫回”操作序列修改狀態寄存器的內容。MRS指令用於將狀態寄存器的內容讀到通用寄存器中。
  • 當異常允許嵌套時,需要在進入異常中斷之後,嵌套中斷發生之前保存當前處理器模式對應的SPSR。這時需要先通過MRS指令讀出SPSR的值,在用其他指令將SPSR值保存起來。
  • 在進程切換時也需要保存當前狀態寄存器的值。

MSR指令介紹

MRS的指令編碼格式:

這裏分為兩種格式,一種是原操作數為通用寄存器, 另一種是源操作數是立即數。


技術分享圖片

指令的語法格式:

C代碼 技術分享圖片
  1. MSR{<cond>} CPSR_<fields>, #<immediate>
  2. MSR{<cond>} CPSR_<fields>, <Rm>
  3. MSR{<cond>} CPSR_<fields>, #<immediate>
  4. MSR{<cond>} CPSR_<fields>, <Rm>

其中:

<cond>為指令執行的條件碼。當<cond>忽略時指令為無條件執行。

<fields>設置狀態寄存器中需要操作的位。狀態寄存器的32位可以分為4個8位的域:

f: 指示bits[31 : 24],又名條件標誌位域

s: 指示bits[23 : 16],又名狀態標誌位域

x: 指示bits[15 : 8], 又名擴展位域

c: 指示bits[7 : 0],又名控制位
<immediate>為將要傳送到狀態寄存器中的立即數,該立即數的計算方式可以去照看<ARM+Architecture+Reference+Manual.pdf>

<Rm>寄存器包含將要傳送到狀態寄存器中的數據。

指令的操作偽代碼:


技術分享圖片

指令的使用:
MSR指令通常用於恢復狀態寄存器的內容或者改變寄存器的內容。

當退出異常中斷處理器程序時,如果事先保存了狀態寄存器的內容通常通過MSR指令將事先保存的狀態寄存器內容恢復到狀態寄存器中。

當需要修改狀態寄存器的內容時,通過“讀取-修改-寫回”指令序列完成。寫回操作也是通過MSR指令完成的。

處理器切換到特權模式,使用將要修改某個位域的示例:

C代碼 技術分享圖片
    1. mrs r0, cpsr ;讀取cpsr中的值
    2. bic r0, r0, #0x1F ;修改,去除當前處理器模式
    3. orr r0, r0, #0x13 ;修改,設置特權模式
    4. msr cpsr_c, r0 ;寫回,僅僅修改CPRS中的控制位
    5. 1.MSR和MRS指令介紹
    6. MRS 指令: 對狀態寄存器CPSR和SPSR進行讀操作。通過讀CPSR可以獲得當前處理器的工作狀態。讀SPSR寄存器可以獲得進入異常前的處理器狀態(因為只有異常模式下有SPSR寄存器)。

      MSR指令: 對狀態寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。

      2.CPSR 程序狀態寄存器(current program status register)

      如圖所示,ARM每種工作模式除R0~R15共16個寄存器外,還有第17個寄存器CPSR,叫做 當前程序狀態寄存器

      技術分享圖片

      CPSR寄存器格式:

      技術分享圖片

      在CPSR寄存器中主要用到了控制位,每個標誌位如下圖所示:

      技術分享圖片

      3.使用MSR指令寫入數據

      例:

      msr cpsr_c, #0xd2       @0xd2=1100 0010//禁止中斷使能,進入中斷模式
      
      msr cpsr_c, #0x53        @0x53=0101 0011//開IRQ中斷,禁止FIQ中斷,進入ARM狀態,設為管理(svc32)模式

      其中cpsr_c是因為CPSR有4個8位區域:

      • C 控制域屏蔽字節([7:0])
      • X 擴展域屏蔽字節([15:8])
      • S 狀態域屏蔽字節([23:16])
      • F 標誌域屏蔽字節([31:24])

      所以cpsr_c表示的是CPSR控制位、

      4.使用MRS和MSR來設置2440位管理模式,實例:

      mrs r0,cpsr         //讀狀態寄存器cpsr的數據到r0中
      
      bic  r0,r0,#0x1f    //對r0低5位進行清0,清除模式位
      orr    r0,r0,#0xd3  //低8位或(110 10011), 設為管理(svc32)模式,禁止IRQ和FIQ中斷
      msr    cpsr,r0      //寫入狀態寄存器cpsr,更新。

      5.SPSR程序保存狀態寄存器(saved program status register)

      SPSR用於保存CPSR的狀態,以便異常返回後恢復異常發生時的工作狀態。當特定的異常中斷發生時,這個寄存器用於存放當前程序狀態寄存器的內容。在異常中斷退出時,可以用SPSR來恢復CPSR。

      (註意:用戶user模式和系統system模式不是異常中斷模式,所以他沒有SPSR。當用戶在用戶模式或系統模式訪問SPSR,將產生不可預知的後果。)

      在異常模式返回時,如果指令帶有S後綴(除了比較指令以外),同時又以PC為目標寄存器進行操作,則操作的同時從SPSR恢復CPSR。以下都是可以恢復CPSR寄存器

令狀態寄存器訪問指令(MRS,MSR)