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