MRS/MSR 指令操作 xPSR 寄存器

一、指令基础概述

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 由三段独立状态寄存器组成,支持分段单独读写,操作更精准:

  1. APSR:算术状态标志寄存器,包含 N/Z/C/V/Q 运算结果标志,软件可自由读写;
  2. IPSR :中断服务编号寄存器,只读,记录当前运行中断号,MSR 指令无法修改;
  3. 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,更新状态寄存器

代码逐行注释解析

  1. MRS R0, xPSR 专用读状态指令,获取当前全部状态标志,为修改做准备。
  2. MOV R1, #1 + MOV R1, R1, LSL #24 构造掩码,仅第 24 位为 1,其余比特为 0,用于定位待清零的 T 位。
  3. BIC R0, R0, R1 按位清除指令,对 R0 和掩码取反后做与运算,仅清除 bit24,不改动其他标志位。
  4. MSR xPSR, R0 将修改后的状态写回 xPSR,完成对 T 位的清零操作。

精简优化写法(省去临时寄存器 R1)

利用立即数掩码直接操作,代码更简洁:

复制代码
MRS     R0, xPSR
BIC     R0, R0, #(1 << 24)  ; 直接使用立即数掩码清除bit24
MSR     xPSR, R0

四、MRS/MSR 使用核心约束

  1. 访问 xPSR/APSR/IPSR/EPSR 仅支持 MRS、MSR,普通数据传送指令编译报错;
  2. IPSR 为只读寄存器,执行 MSR IPSR, Rx 无任何效果;
  3. EPSR 内 Thumb 模式位、IT 块控制位由硬件锁定,软件写入无效;
  4. 写入 xPSR 后状态标志立即更新,后续 CMP/TST/ 条件分支指令可直接使用新标志;
  5. 特权模式可完整操作状态寄存器,非特权线程模式下部分状态位存在写保护;
  6. Cortex‑M 内核无法关闭 Thumb 模式,强制清零 xPSR 24 会触发硬件故障。

五、指令英文全称记忆

  • MRS:Move to Register from Status,从状态寄存器读至通用寄存器
  • MSR:Move to Status from Register,从通用寄存器写入状态寄存器
相关推荐
爱莉希雅&&&39 分钟前
GitLab 完整学习笔记
linux·运维·服务器
风笙9781 小时前
[文件系统]文件系统挂载与卸载详解
linux
GeW1 小时前
新质生产力路线图解读:数据库性能优化与Linux调优专场
linux·数据库
小杨爱科普2 小时前
制造业上自动化改造,改造部分的专利到底归谁
运维·经验分享·自动化
陈希1233 小时前
Linux 服务器性能排查手册(2026):CPU、内存、磁盘IO、网络四大瓶颈定位
linux·服务器·网络
方便面不加香菜3 小时前
Docker Container --容器及容器的操作案例详解
运维·docker·容器
测试界的小码农6 小时前
【Linux 命令实战(03):文件创建、复制、移动与删除,掌握 touch、mkdir、cp、mv、rm】
linux·服务器·php
|_⊙6 小时前
网络层协议 IP
服务器·网络·tcp/ip
byte轻骑兵6 小时前
实战 1:修改 BlueZ 源码,添加自定义开机日志
linux·aiot·bluez·电脑蓝牙·嵌入式蓝牙
叼烟扛炮7 小时前
Linux 学习笔记(五十):网络层——IP 协议、子网划分与 NAT 魔法
linux·笔记·学习