【ARM】MRS MSR指令
00. 目錄
文章目錄
- 00. 目錄
- 01. 狀態操作指令概述
- 02. MRS
- 2.1 指令的語法格式
- 2.2 指令示例
- 03. MSR
- 3.1 指令的語法格式
- 3.2 應用示例
- 04. 綜合應用
- 4.1 使能 IRQ 中斷
- 4.2 禁止 IRQ 中斷
- 4.3 堆棧指令初始化
- 05. 附錄
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,CPSRBIC R0,R0,#0x80MSR CPSR_c,R0MOV PC,LR4.2 禁止 IRQ 中斷
DISABLE_IRQ:MRS R0,CPSRORR R0,R0,#0x80MSR CPSR_c,R0MOV PC,LR4.3 堆棧指令初始化
INITSTACK:MOV R0,LR ;保存返回地址@ 設置管理模式堆棧: MSR CPSR_c,#0xD3 LDR SP,StackSvc@設置中斷模式堆棧: MSR CPSR_c,#0xD2 LDR SP,StackSvc05. 附錄
11.1 ARM Architecture Reference Manual
總結
以上是生活随笔為你收集整理的【ARM】MRS MSR指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ARM】跳转指令
- 下一篇: 【ARM】协处理器指令