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,从通用寄存器写入状态寄存器
相关推荐
Brilliantwxx1 小时前
【Linux】 自主shell编写巩固复习篇
linux·运维·服务器·开发语言
Qt云程序员1 小时前
零代码网页数据采集教程:不写爬虫,把网页数据搬进 Excel
运维·自动化
弯_弯1 小时前
FDE 的工程能力画像:数据接入、PoC 与可复用资产的落地口径
java·服务器·开发语言
鱼很腾apoc1 小时前
【MySQL】第3期 索引、事务与视图系统详解
linux·mysql·事务·索引·dml·视图·macc
anew___2 小时前
《从零手写操作系统 (49):虚拟内存进阶——Demand Paging、Swap与缺页异常处理》
linux·服务器·php
迷途之人不知返2 小时前
【基础IO】-4-再谈重定向
linux
Android系统攻城狮2 小时前
Linux Gstreamer深度解析之gst_audio_ring_buffer_parse_caps调用流程与实战(八十)
linux·运维·服务器·gstreamer音视频·音视频进阶
l1t2 小时前
DeepSeek总结的 DuckDB 2.0 文档新内容
服务器·网络·数据库
erzong2313 小时前
Linux网络:UDP编程踩坑日记
linux·网络·udp