汇编指令-MRS(读)和MSR(写)指令操作CPSR寄存器和SPSR寄存器使用(1)

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏陈树义

MySQL用户管理:添加用户、授权、删除用户

添加用户 以root用户登录数据库,运行以下命令: create user zhangsan identified by 'zhangsan'; 上面的命令创...

4265
来自专栏机器学习实践二三事

VirtualBox安装CentOS联网问题

最近玩Hadoop需要几个虚拟机构成集群,就在VirtualBox上安装了CentOS,联网问题就出现了,具体就是两个: 主机与虚拟机的联通 虚拟机的上网问题 ...

1868
来自专栏黑泽君的专栏

【MyEclipse】我们导入的jar包后, 一般没有关联源码, 需要手动进行关联!推荐这种方式。

775
来自专栏小樱的经验随笔

Linux目录结构

Linux 目录结构 装完Linux,首先需要弄清Linux 标准目录结构 ? / root —?启动Linux时使用的一些核心文件。如操作系统内核、引导程序G...

3356
来自专栏IT技术精选文摘

Kafka生产者架构-选择记录的分区

Kafka生产者 Kafka生产者将记录发送到主题。记录有时被称为消息。 生产者选择哪个分区将记录发送到每个主题。生产者可以轮循发送记录。根据记录的优先级,生...

1857
来自专栏Python自动化测试

测试驱动之excel文件与ddt模块在自动化中的引用(十三)

在前面详细的介绍了ddt模块的安装以及在自动化项目中的使用,我们再已验证V客网登录界面为实例,来说明ddt模块在自动化中的实战,验证点分别为如下几点:

1356
来自专栏别先生

JSP连接mysql数据库的重点

1:用mysql驱动把mysql与tomcat的连接起来。把mysql驱动包(不用解压)放到Tomcat安装目录中lib文件夹下即可。 ? 2:然后在自己的新...

2718
来自专栏大学生计算机视觉学习DeepLearning

mysql安装 2017最新安装mysql教程及遇到的问题解决Windows下

3626
来自专栏雨过天晴

原 PHPStrom 9系列激活码

1644
来自专栏云计算教程系列

如何在Ubuntu 16.04上将Redis服务器设置为PHP的会话处理程序

Redis是一个开源键值缓存和存储系统,由于其对多种数据类型(如散列,列表,集合和位图等)的高级支持,也称为数据结构服务器。它还支持群集,使其在高度可用和可扩展...

1103

扫码关注云+社区