ARM汇编:MRS和MSR指令
1.MSR和MRS指令介绍
MRS 指令: 对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以获得当前处理器的工作状态。读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有SPSR寄存器)。
MSR指令: 对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。
2.CPSR 程序状态寄存器(current program status register)
如图所示,ARM每种工作模式除R0~R15共16个寄存器外,还有第17个寄存器CPSR,叫做 当前程序状态寄存器

CPSR寄存器格式:

在CPSR寄存器中主要用到了控制位,每个标志位如下图所示:

3.使用MSR指令写入数据
例:
msr cpsr_c, #0xd2 @0xd2=1100 0010//禁止中断使能,进入中断模式 msr cpsr_c, #0x53 @0x53=0101 0011//开IRQ中断,禁止FIQ中断,进入ARM状态,设为管理(svc32)模式
其中cpsr_c是因为CPSR有4个8位区域:
- C 控制域屏蔽字节([7:0])
- X 扩展域屏蔽字节([15:8])
- S 状态域屏蔽字节([23:16])
- F 标志域屏蔽字节([31:24])
所以cpsr_c表示的是CPSR控制位、
4.使用MRS和MSR来设置2440位管理模式,实例:
mrs r0,cpsr //读状态寄存器cpsr的数据到r0中 bic r0,r0,#0x1f //对r0低5位进行清0,清除模式位
orr r0,r0,#0xd3 //低8位或(110 10011), 设为管理(svc32)模式,禁止IRQ和FIQ中断
msr cpsr,r0 //写入状态寄存器cpsr,更新。
5.SPSR程序保存状态寄存器(saved program status register)
SPSR用于保存CPSR的状态,以便异常返回后恢复异常发生时的工作状态。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断退出时,可以用SPSR来恢复CPSR。
(注意:用户user模式和系统system模式不是异常中断模式,所以他没有SPSR。当用户在用户模式或系统模式访问SPSR,将产生不可预知的后果。)
在异常模式返回时,如果指令带有S后缀(除了比较指令以外),同时又以PC为目标寄存器进行操作,则操作的同时从SPSR恢复CPSR。以下都是可以恢复CPSR寄存器
例如:

movs pc, #0xff // cpsr = spsr; pc = 0xff
adds pc, r1, #0xffffff00 //cpsr = spsr; pc = r1 + 0xffffff00
ands pc, r1, r2 //cpsr = spsr; pc = r1 & r2;
ldmia sp!, { r0-r12,pc }^ //中断返回, ^表示将spsr的值复制到cpsr

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

分成了4部分:
1,条件标志位
N(Negative), Z(Zero), C(Carry), V(Verflow)统称为条件标志位。ARM指令可以根据CPSR中的这些条件标志位来选择性的执行。
2,Q标志位
ARM v5的E系列处理器中,CPSR的bit[27]称为Q标志位。主要用于指示增强的DSP指令是否发生了溢出。
3,控制位
I, F, T以及M[4:0]统称为控制位。当异常中断发生时,这些位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。
下表示控制位M[4:0]的含义:
4,保留位
用于将来ARM版本的扩展。
二:状态寄存器访问指令仅有两条:
MRS: 状态寄存器到通用寄存器的传送指令。
MSR: 通用寄存器到状态寄存器的传送指令。
三:MRS指令用法:

四:MSR指令用法:

其中:
<cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。
<fields>设置状态寄存器中需要操作的位。状态寄存器的32位可以分为4个8位的域:
f: 指示bits[31 : 24],又名条件标志位域
s: 指示bits[23 : 16],又名状态标志位域
x: 指示bits[15 : 8], 又名扩展位域
c: 指示bits[7 : 0],又名控制位
<immediate>为将要传送到状态寄存器中的立即数,该立即数的计算方式可以去照看<ARM+Architecture+Reference+Manual.pdf>
<Rm>寄存器包含将要传送到状态寄存器中的数据。
指令的操作伪代码:

ARM汇编:MRS和MSR指令的更多相关文章
- 7.arm汇编 bic和orr指令
1. bic BIC指令的格式为: BIC{条件}{S} 目的寄存器,操作数1,操作数2 BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中. 操作数1应是一个寄存器, 操作数2可以是一 ...
- ARM 汇编指 跳转指令 b , bl
1. 跳转指令 [ b ] [ bl ] 指令格式:<opcode><cond> <address> 不带返回的跳转指令:b mov r0, #0x12 mov ...
- ARM 汇编指令
ARM汇编程序特点: l 所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通 ...
- ARM汇编指令特点
根据朱有鹏老师课程笔记整理而来: (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串1 0组成的机器码,由CPU读取执行. (汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器 ...
- ARM汇编指令集1
(汇编)指令是CPU机器指令的助记符,经过编译过会得到一串0011组成的机器码,可以由CPU读取执行. (汇编)伪指令本质不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译 ...
- 常用ARM汇编指令
常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区 作者:xuyuanfan77 [字体:大 中 小] 在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...
- 经常使用ARM汇编指令
一面学习,一面总结,一面记录. 以下是整理在网上找到的一些资料,简单整理记录一下,方便以后查阅. ARM处理器的指令集能够分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.载入/存储指令. ...
- 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 : -- AR ...
- ARM汇编(2)(指令)
一,ARM汇编语言立即数的表示方法 十六进制:前缀:0x 十进制:无前缀 二制:前缀:0b 二,常用的ARM指令(标准的ARM语法,GNU的ARM语法) 1.@M开头系列 MOV R0, #12 @R ...
- arm汇编指令
ARM处理器的指令集可以分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.加载/存储指令.协处理器指令和异常产生指令6大指令 一.跳转指令 跳转指令用于实现程序流程的跳转 跳转指令分类 Ⅰ ...
随机推荐
- mtr和traceroute的区别,以及为什么traceroute不显示路径mtr却可以显示路径
最近工作主要都是网络策略的开通和网络测试,在测试的过程当中发现当网络不通时,用traceroute来看路由路径的时候总是无法显示出来,于是就换了个工具-mtr,发现mtr可以正常显示出路由路径,帮助我 ...
- 攻防世界——Misc新手练习区解题总结<4>(11、12题)
第十一题ext3: 方法一:挂载 需要工具:kali虚拟机 下载附件后得到一个linux的系统光盘,我们用kali挂载一下 mount 123 /mnt//123为要挂载的文件名 寻找flag.txt ...
- Redis 注册成windows 服务并开机自启动
进入安装目录 输入命令redis-server --service-install redis.windows.conf 输入启动命令即可 redis-server --service-start ...
- C语言的简单学习
C语言是编译型语言,先编译再运行,通常用gcc进行编译,于是安装了Ubuntu操作系统.至于编辑器,VS Code也能用,先sudo apt install build-essential gdb,再 ...
- P9210 题解
学长给我们讲了就顺便来写一篇题解. 首先最优解一定包括根,不然一定可以从当前根连接一条到根的链. 然后考虑假若最大导出子树深度为 \(n\) 则显然可以把深度为 \(n\) 的节点全部选上,然后每个节 ...
- gdb 根据c语言二进制文件进程号查看内部多线程任务
C语言二进制文件 a 编译时添加了 -g (gdb 调试), 但是 gdb a 这种方式有时不容易复现一些场景.这时可以先正常启动 a, 然后根据 a 的进程号启动gdb调试. # 1. 找到程序进程 ...
- 算法金 | 一个强大的算法模型,GPR !!
大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 抱个拳,送个礼 高斯过程回归(GPR)是一种非参数化的贝叶斯方法,用于解决回归问题.与 ...
- WPF单行TextBox自动滚动至末尾
根据光标位置自动滚动 textBox.CaretIndex = textBox.SelectionStart; var rect = textBox.GetRectFromCharacterIndex ...
- MyBatis-Plus 整理
# 前言 代码生成器插件选择去这里:https://www.cnblogs.com/zixq/p/16726534.html 相关插件在那里面已经提到了 # 上手 MyBatis-Plus 是一个 M ...
- 探究kubernetes 探针参数periodSeconds和timeoutSeconds
探究kubernetes 探针参数 periodSeconds和timeoutSeconds 问题起源 kubernetes probes的配置中有两个容易混淆的参数,periodSeconds和ti ...