天天看點

彙編指令-MRS(讀)和MSR(寫)指令操作CPSR寄存器和SPSR寄存器使用(1)

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,叫做 目前程式狀态寄存器 

彙編指令-MRS(讀)和MSR(寫)指令操作CPSR寄存器和SPSR寄存器使用(1)
CPSR寄存器格式:
彙編指令-MRS(讀)和MSR(寫)指令操作CPSR寄存器和SPSR寄存器使用(1)
在CPSR寄存器中主要用到了控制位,每個标志位如下圖所示:
彙編指令-MRS(讀)和MSR(寫)指令操作CPSR寄存器和SPSR寄存器使用(1)

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      

人間有真情,人間有真愛。

彙編指令-MRS(讀)和MSR(寫)指令操作CPSR寄存器和SPSR寄存器使用(1)

如果您喜歡這裡,感覺對你有幫助,并且有多餘的軟妹币的話,不妨投個食吧,贊賞的時候,留下美句和你的部落格位址哦~   戳這裡看誰投食了