ARM的状态传送器指令、软中断指令与协处理指令(软中断具体实现)

news/2024/10/17 22:17:08/

1.状态寄存器传送指令:

作用:访问(读写)CPSR寄存器

CPSR寄存器结构图:

前八位的作用:

Bit[4:0] :不同的电平组合表示不同的模式,[10000]User    [10001]FIQ     [10010]IRQ     [10011]SVC     [10111]Abort   [11011]Undef   [11111]System  [10110]Monitor  

Bit[5]:[0]ARM状态     [1]Thumb状态  

Bit[6]:[0]开启FIQ     [1]禁止FIQ  

Bit[7]:[0]开启IRQ     [1]禁止IRQ
 

我们知道cpsr寄存器的数据表示当前程序处于什么状态,如果我们想人为更改其模式或者知道当前程序处于什么模式,我们可使用以下两个指令:

  • MRS指令:读CPSR
  • MSR指令:写CPSR

在汇编程序刚启动时,CPSR中存放的数据为0xD3,转换成二进制数就是11010011,在与上图的前八位一一对应后得知此时程序处于SVC模式,并且禁止了FIQ中断和IRQ中断,因为在刚开始启动时系统需要做初始化,这时候是不想让其他的中断去打断系统初始化这个操作的,所以此时CPSR中存放的数据为0xD3,当初始化完成后我们就可以使用指令来更改其数据,具体操作如下:

        @ 读CPSR@ MRS R1, CPSR@将CPSR中的数据读到R1中,等价于R1 = CPSR@ 写CPSR@ MSR CPSR, #0x10@将0x10写入CPSR中,通过文章开始的图经计算得知0x10为user模式,等价于CPSR = 0x10	@ 在USER模式下不能随意修改CPSR,因为USER模式属于非特权模式@此时在此执行下面的写指令,CPSR的值将不会改变@ MSR CPSR, #0xD3

再次强调,在user模式下CPSR的值是不允许被改变的,一般c语言的程序在汇编时的权限就是user

2.软中断指令

SWI:触发一次软中断

异常向量表:

 

具体使用如下(软中断的具体处理过程在代码中):

@ 异常向量表@ B MAIN  @ 位置为0x00,每一条指令会使这个值+4@ B .@ 0x04@ B SWI_HANDLER@0x08@ B .@ B .@ B .@ B .@ B .@ 应用程序
@ MAIN:@ MOV SP, #0x40000020@ 初始化SVC模式下的栈指针@ MSR CPSR, #0x10@ 切换成USER模式,开启FIQ、IRQ@ MOV R1, #1@ MOV R2, #2@ SWI #1@ 触发软中断异常,其第二操作数可以是随便一个立即数@***************************软中断处理过程*******************************@ 在软中断触发后,程序会进行异常处理操作,PC中的数据会变成异常向量表中SWI的位置@ 也就是0x08,而此时0x08这个地址中可能存放着之前的指令从而导致异常处理无法执行@ 所以我们在汇编的开始需要将0x08这个地址存放异常程序处理函数的入口@ 所以我们可以再汇编开始时写几条指令来代表异常向量表,@ 因为我们默认了汇编开始的位置为0x00000000,且异常向量表中的复位对应的位置也是0x00,@ 在ARM中每条指令占四个字节,所以我们可以再开始时使其跳转到主函数MAIN@ 这时候0x00这个地址指向的指令就是B MAIN也就是跳转指令,@ 我们就可以使用多个跳转命令使得我们自创的异常向量表种每个位置都与异常向量表中的对应@ 使其能跳转到对应的异常处理函数@ 因为SWI异常在异常向量表中存在于0x08这个位置@ 所以我们汇编程序的0x08地址应该为SWI异常处理的位置@ 所以我们使第三个跳转指令跳转到异常处理函数,也就是 B SWI_HANDLER,@ 其他的异常处理只需放在对应的位置即可@ 所以当这条指令执行时,ARM回去找到0x08位置的指令去执行,也就跳转到了异常处理函数@**********************************************************************@ ADD R3, R2, R1        @ B STOP@ 异常处理程序
@ SWI_HANDLER:@ 因为异常处理程序在此操作了R1和R2,所以需要进行压栈来保护@ STMFD SP!,{R1,R2,LR}@ 压栈保护现场@ MOV R1, #10@ MOV R2, #20@ SUB R3, R2, R1@ LDMFD SP!,{R1,R2,PC}^@ 出栈恢复现场@ 将压入到栈中的LR(返回地址)出栈给PC,实现程序的返回@ ‘^’表示出栈的同时将SPSR的值传递给CPSR,实现CPU状态的恢复

3.协处理器指令:

        含义:操控协处理器的指令

        简单提及一下,具体了解自行学习
    
         1.协处理器数据运算指令
            CDP
         2.协处理器存储器访问指令
            STC    将协处理器中的数据写入到存储器
            LDC    将存储器中的数据读取到协处理器
         3.协处理器寄存器传送指令
            MRC    将协处理器中寄存器中的数据传送到ARM处理器中的寄存器
            MCR    将ARM处理器中寄存器中的数据传送到协处理器中的寄存器


http://www.ppmy.cn/news/79817.html

相关文章

分布式运用之ELK企业级日志分析系统

1.ELK的相关知识 1.1 ELK的概念与组件 ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。 ElasticSearch: 是基于Lucene&#xff0…

浅析Koa2中控制器

控制器 什么是控制器 拿到路由分配的任务,并执行 路由的功能是根据不同的 url, 来分配不同的任务。 控制器是拿到路由分配的任务并执行,是注册在路由中的中间件。 所以在 koa 中, 控制器也是一个中间件。 为什么要使用控制器 获取HTTP请求参数处理…

Unix/C/C++进阶--线程 pthread_creat() return 1失败

Unix/C/C进阶--pthread_creat return 1失败 1 介绍1.1 man pthread_create1.2 一般失败原因1.3 最大进程/线程数(理论)1.3 最大进程/线程数(实际)1.4 查看Linux实际运行的总线程数1.5 查看运行的进程1.6 查看进程信息1.7 top -H 一…

qt quick(qml)通过arcgis导入自定义格式地图(Windows 版本)

参考ArcGIS Maps SDK for Qt 参考Display a map 安装 预先安装的软件 安装ArcGIS SDK 点击ArcGIS Maps SDK for Qt 注册账号 要注册成developer版本用户的,不然之后可能没办法生成API 下载 下载之后安装,一路next就可以了 在QT中创建ArcGIS项目…

一种适用于大量租户大量角色权限系统设计

前言 权限管理是每个系统不可缺少的一部分,大部分开发者应该都设计过权限管理系统,很多开发者学习的第一个项目可能就是权限管理系统。但是常见的权限设计在租户量非常大、角色数量非常多时会存在角色权限表数据量指数增长的情况,本文介绍一…

自动化测试与手工测试?你真的了解吗?如何共存...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Python自动化测试&…

每日一练 | 网络工程师软考真题 Day10

1、下面是显示交换机端口状态的例子: 2950# show interface fastEthernet0/1 switchport Name: fa0/1 Switchport: Enabled Administrative mode: trunk Operational Mode: trunk Administrative Trunking Encapsulation: dot1q Operational Trunking Encaps…

【错误记录】androidx.swiperefreshlayout.widget.SwipeRefreshLayout导包失败

一、错误记录 项目引用包appcompat从1.1.1升级到1.4.1 升级前 implementation androidx.appcompat:appcompat:1.1.0xml布局中使用androidx.swiperefreshlayout.widget.SwipeRefreshLayout正常 升级后 implementation androidx.appcompat:appcompat:1.4.1xml布局中使用android…