ARM匯編:MRS和MSR指令


 

1.MSR和MRS指令介紹

 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寄存器

例如:

復制代碼
movs pc, #0xff             // cpsr = spsr; pc = 0xff 

adds pc, r1, #0xffffff00   //cpsr = spsr; pc = r1 + 0xffffff00  

ands pc, r1, r2         //cpsr = spsr; pc = r1 & r2; 

ldmia   sp!,    { r0-r12,pc }^ //中斷返回, ^表示將spsr的值復制到cpsr
復制代碼

 

 

https://blog.csdn.net/weibo1230123/article/details/84036225

  ARM匯編:MRS和MSR指令

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]的含義:

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


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

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

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

三:MRS指令用法:


四:MSR指令用法:

 其中:

<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>寄存器包含將要傳送到狀態寄存器中的數據。

 

指令的操作偽代碼:


 


免責聲明!

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



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