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
人間有真情,人間有真愛。
如果您喜歡這裡,感覺對你有幫助,并且有多餘的軟妹币的話,不妨投個食吧,贊賞的時候,留下美句和你的部落格位址哦~ 戳這裡看誰投食了