【ARM】MRS MSR指令

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章