一、指令基础概述
MRS、MSR 是 ARM Cortex‑M 内核中唯一++能够直接读写程序状态寄存器 xPSR 的专用指令++ ,普通 MOV/LDR/STR 等数据传送指令无法访问 xPSR,必须依靠这两条指令完成状态寄存器读写操作。
1. MRS:读状态寄存器到通用寄存器
指令格式:
MRS Rd, xPSR ; Rd = xPSR
功能:将 xPSR 寄存器完整数值拷贝至通用寄存器 Rd(R0~R15),用于读取 运算标志、中断状态、执行模式位等信息。
2.MSR:通用寄存器写入状态寄存器
指令格式:
MSR xPSR, Rd ; xPSR = Rd
功能:将通用寄存器 Rd 的值写回 xPSR,实现手动修改状态标志位;寄存器内部分硬件锁定位无法通过软件改写,写入操作无效。
二、xPSR 寄存器分段
xPSR 由三段独立状态寄存器组成,支持分段单独读写,操作更精准:
- APSR:算术状态标志寄存器,包含 N/Z/C/V/Q 运算结果标志,软件可自由读写;
- IPSR :中断服务编号寄存器,只读,记录当前运行中断号,
MSR指令无法修改; - EPSR:执行状态寄存器,包含 Thumb 模式位、IT 条件块位,关键位受硬件保护,软件写入不生效。
分段读写示例:
MRS R0, APSR ; 仅读取运算标志位
MSR APSR, R0 ; 仅修改运算标志,不干扰中断、执行状态
三、实操练习:清除 xPSR 24(Thumb 模式位)
需求说明
xPSR 第 24 位为 T(Thumb)标志位:
xPSR[24] = 1:CPU 运行 Thumb 指令集(Cortex‑M 内核上电默认模式);xPSR[24] = 0:切换至 ARM 32 位指令集。
重要硬件限制:全系列 Cortex‑M 内核硬件仅支持 Thumb 指令,若软件强制将 T 位清零,CPU 会立即触发硬件异常(HardFault),本段代码仅用于汇编语法练习,工程中不可实际使用。
完整汇编代码(分步写法)
MRS R0, xPSR ; 读取完整xPSR寄存器,存入R0
MOV R1, #1
MOV R1, R1, LSL #24 ; R1 = 1 << 24,生成掩码 0x01000000,仅bit24置1
BIC R0, R0, R1 ; BIC:Rn & (~Op2),清零R0中第24位,其余位保持不变
MSR xPSR, R0 ; 修改完成的数值写回xPSR,更新状态寄存器
代码逐行注释解析
MRS R0, xPSR专用读状态指令,获取当前全部状态标志,为修改做准备。MOV R1, #1+MOV R1, R1, LSL #24构造掩码,仅第 24 位为 1,其余比特为 0,用于定位待清零的 T 位。BIC R0, R0, R1按位清除指令,对 R0 和掩码取反后做与运算,仅清除 bit24,不改动其他标志位。MSR xPSR, R0将修改后的状态写回 xPSR,完成对 T 位的清零操作。
精简优化写法(省去临时寄存器 R1)
利用立即数掩码直接操作,代码更简洁:
MRS R0, xPSR
BIC R0, R0, #(1 << 24) ; 直接使用立即数掩码清除bit24
MSR xPSR, R0
四、MRS/MSR 使用核心约束
- 访问 xPSR/APSR/IPSR/EPSR 仅支持 MRS、MSR,普通数据传送指令编译报错;
- IPSR 为只读寄存器,执行
MSR IPSR, Rx无任何效果; - EPSR 内 Thumb 模式位、IT 块控制位由硬件锁定,软件写入无效;
- 写入 xPSR 后状态标志立即更新,后续
CMP/TST/ 条件分支指令可直接使用新标志; - 特权模式可完整操作状态寄存器,非特权线程模式下部分状态位存在写保护;
- Cortex‑M 内核无法关闭 Thumb 模式,强制清零 xPSR 24 会触发硬件故障。
五、指令英文全称记忆
- MRS:Move to Register from Status,从状态寄存器读至通用寄存器
- MSR:Move to Status from Register,从通用寄存器写入状态寄存器