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,LR

4.2 禁止 IRQ 中断

DISABLE_IRQ:MRS R0,CPSRORR R0,R0,#0x80MSR CPSR_c,R0MOV 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

【ARM】MRS MSR指令相关推荐

  1. ARM汇编:MRS和MSR指令

    ARM汇编:MRS和MSR指令 ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据. 一:下面先来说说状态寄存器 针对32位的ARM处理器,状态寄存器就是一个32位长的寄存器.每个位的含义如下 ...

  2. 汇编指令mrs_(转)ARM汇编学习笔记——MRS和MSR指令

    MRS,状态寄存器传送至通用寄存器类指令 功能:将状态寄存器的内容传送至通用寄存器. 格式: MRS{}Rd,CPSR}SPSR 其中: Rd  目标寄存器,Rd不允许R15. R=0  将CPSR中 ...

  3. 嵌入式:交换指令之SWP,MRS,MSR

    文章目录 存储器与寄存器交换指令(SWP) 二进制编码格式 汇编格式 举例 状态寄存器与通用寄存器之间的传送指令 MRS MRS的二进制编码 汇编格式 MSR MSR的二进制编码 汇编格式 存储器与寄 ...

  4. ARM中MRS汇编指令

    ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据. 针对32位的ARM处理器,状态寄存器就是一个32位长的寄存器.每个位的含义如下图: 分成了4部分: 1,条件标志位 N(Negative) ...

  5. ARM汇编MSR和MRS

    ARM汇编MSR和MRS学习笔记: MRS指令用于将程序状态寄存器(CPSR)的内容传送到通用寄存器中. 当需要改变程序状态寄存器(CPSR)的内容时,用MRS将程序状态寄存器(CPSR)的值传入通用 ...

  6. 汇编指令msr_ARM汇编:MRS和MSR指令

    1.MSR和MRS指令介绍 MRS 指令:  对状态寄存器CPSR和SPSR进行读操作.通过读CPSR可以获得当前处理器的工作状态.读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有 ...

  7. ARM开发基础--指令,异常源及处理过程

    本文主要面向初次接触ARM的初学者,主要做基础知识的讲解与科普,希望能对初学者有所帮助. 文章目录 前言 一.什么是指令?指令有哪些? 二.常用指令 1.数据处理指令 2.数据跳转指令 3.Load/ ...

  8. cortex-A7 ARM 汇编常用指令 终极总结

    1.处理器内部常用数据传输指令 MOV R0  R1    // 通用寄存器互传 MRS R0 CPSR   // 特殊寄存器 向 通用寄存器传 MSR CPSR R1   // 通用寄存器 向 特殊 ...

  9. ARM汇编常用指令汇总

    文章目录 ARM常见汇编指令的汇总 1.EQU 2.AREA 3.DCD 4. ENTRY 5. START 6. LDR 7. STR 8.BEQ 9.MSR/MRS 10.B/BL/BX 11.P ...

最新文章

  1. DNS区域文件(Zone file)的serial数值命名规则
  2. C#多线程编程(1)--线程,线程池和Task
  3. Java中读取本地图片并转为base64解决办法
  4. 《终于有人说出来了——Java不适合于作为主要编程教学语言》我的看法
  5. iOS获取缓存文件的大小并清除缓存
  6. MySQL 二进制日志(Binary Log)
  7. 7-2 银行排队问题之单窗口“夹塞”版 (30 分)
  8. matlab max函数_从零开始的matlab学习笔记——(14)一些有用的函数(上):最值,平均数,中位数...
  9. ad焊盘对参考点复制_点对点复制
  10. 拓端tecdat|R语言时变波动率和ARCH,GARCH,GARCH-in-mean模型分析股市收益率时间序列
  11. mysql日志课程_【mysql课程七】 MySQL日志管理
  12. Gitlab项目迁移
  13. perl脚本的参数输入
  14. AndroidStudio 编译报错 abc_list_selector_disabled_holo_light.9.png
  15. 用python画一个机器猫歌词_用Python语言模型和LSTM做一个Drake饶舌歌词生成器
  16. 刘彬20000词汇06
  17. Win11宽带连接错误651怎么解决?
  18. beyond compare
  19. Linux Mysql主从同步常见问题合集
  20. vue 在哪个生命周期进行数据请求

热门文章

  1. VS2005水晶报表发布
  2. 如何从完整的文件路径中分离文件名和路径名?
  3. pycharm在401跑程序需要每个py文件加一句
  4. 客户端(STS)连接服务器上redis时的问题
  5. javascript变量中基本类型和引用类型的详解解读
  6. HTML页面显示缩略所有空格为一格的方法
  7. Redis数据结构详解之Set(三)
  8. 3D人脸识别预处理,3D face recognition preprocess
  9. 记一个简单的保护if 的sh脚本
  10. animateWithDuration