00. 目錄
文章目錄
01. 狀態操作指令概述
ARM 指令集提供了兩條指令,可直接控制程序狀態寄存器(Program State Register,PSR)。MRS 指令用於把 CPSR 或 SPSR 的值傳送到一個寄存器;MSR 與之相反,把一個寄存器的內容傳送到 CPSR 或 SPSR。這兩條指令相結合,可用於對 CPSR 和 SPSR 進行讀/寫操作。程序狀態寄存器指令如下表所示。
在指令語法中可看到一個稱爲 fields 的項,它可以是控制(C)、擴展(X)、狀態(S)及標誌(F)的組合。
02. MRS
MRS 指令用於將程序狀態寄存器的內容傳送到通用寄存器中。在 ARM 處理器中,只有 MRS 指令可以將狀態寄存器 CPSR 或 SPSR 讀出到通用寄存器中。
2.1 指令的語法格式
MRS{cond} Rd,PSR
# 其中,Rd 爲目標寄存器,Rd 不允許爲程序計數器(PC)。PSR 爲 CPSR 或 SPSR。
2.2 指令示例
MRS R1,CPSR ;將 CPSR 狀態寄存器讀取,保存到 R1 中
MRS R2,SPSR ;將 SPSR 狀態寄存器讀取,保存到 R1 中
MRS 指令讀取 CPSR,可用來判斷 ALU 的狀態標誌及 IRQ/FIQ 中斷是否允許等;在異常處理程序中,讀 SPSR 可指定進入異常前的處理器狀態等。MRS 與 MSR 配合使用,實現 CPSR 或 SPSR 寄存器的讀—修改—寫操作,可用來進行處理器模式切換,允許/禁止IRQ/FIQ 中斷等設置。另外,進程切換或允許異常中斷嵌套時,也需要使用 MRS 指令讀取SPSR 狀態值並保存起來。
03. MSR
在 ARM 處理器中,只有 MSR 指令可以直接設置狀態寄存器 CPSR 或 SPSR。
3.1 指令的語法格式
MSR{cond} PSR_field,#immed_8r
MSR{cond} PSR_field,Rm
其中,PSR 是指 CPSR 或 SPSR。設置狀態寄存器中需要操作的位。狀態寄存器的 32 位可以分爲 4 個 8 位的域(field)。bits[31:24]爲條件標誌位域,用 f 表示;bits[23:16]爲狀態位域,用 s 表示;bits[15:8]爲擴展位域,用 x 表示;bits[7:0]爲控制位域,用 c 表示;immed_8r 爲要傳送到狀態寄存器指定域的立即數,8 位;Rm 爲要傳送到狀態寄存器指定域的數據源寄存器。
3.2 應用示例
MSR CPSR_c,#0xD3 ;CPSR[7:0]=0xD3,切換到管理模式
MSR CPSR_cxsf,R3 ;CPSR=R3
溫馨提示
只有在特權模式下才能修改狀態寄存器。
程序中不能通過 MSR 指令直接修改 CPSR 中的 T 位控制位來實現 ARM 狀態/Thumb狀態的切換,必須使用 BX 指令來完成處理器狀態的切換(因爲 BX 指令屬轉移指令,它會打斷流水線狀態,實現處理器狀態的切換)。MRS 與 MSR 配合使用,實現 CPSR 或 SPSR寄存器的讀—修改—寫操作,可用來進行處理器模式切換及允許/禁止IRQ/FIQ中斷等設置。
04. 綜合應用
4.1 使能 IRQ 中斷
ENABLE_IRQ:
MRS R0,CPSR
BIC R0,R0,#0x80
MSR CPSR_c,R0
MOV PC,LR
4.2 禁止 IRQ 中斷
DISABLE_IRQ:
MRS R0,CPSR
ORR R0,R0,#0x80
MSR CPSR_c,R0
MOV PC,LR
4.3 堆棧指令初始化
INITSTACK:
MOV R0,LR ;保存返回地址
@ 設置管理模式堆棧:
MSR CPSR_c,#0xD3
LDR SP,StackSvc
@設置中斷模式堆棧:
MSR CPSR_c,#0xD2
LDR SP,StackSvc
05. 附錄
11.1 ARM Architecture Reference Manual