ARM 异常处理过程,指令[ swi ]
1. 发生异常:
程序正常执行,突然被一个不正常的事件打断正在执行的程序,执行相应的异常事件对应的程序
2. 5 种异常模式对应着 7 种异常源:
异常工作模式 异常源
FIR FIR
IRQ IRQ
Abort data_abort / pref_abort
Undef undefine
SVC reset复位 / swi软中断指令
3. 同种异常源不可以被打断,reset 优先级最高,打断任何程序执行
4. 异常处理过程:

保护现场:由 CPU 自动完成,通过 4 步完成 ; 通用寄存器CPSR 中的状态,改变CPU状态
(1)CPU 保存现场当前状态 CPSR 到异常模式下的 SPSR 中 ,这步的目的是保护当前状态的CPSR(每种异常模式都对应一个自己的SPSR,以便将来在异常返回时,从SPSR恢复至CPSR)
(2)CPU 修改 CPSR 中 模式位,禁止相应中断源,切换 CPU 状态为ARM 状态(Thumb态和ARM态由CPSR的T位来决定)
(3)保存的返回地址到对应异常模式下的LR 寄存器中。(返回地址:异常发生前正在执行指令的下一条地址)
(4)pc 指向异常向量表中对应的异常
恢复现场: 需要自己手动完成(手动修改寄存器 CPSR 中对应的状态位)
(1) 把异常模式下的 SPSR_MODE 恢复到CPSR中
(2)把 异常模式下的 LR_MODE 恢复到 PC中
5. 异常向量表
1)异常向量表就是内存的一块空间,这块内存的空间的大小为32byte,平均分成了8份,每份4个byte,然后在里边存放7中异常源,多余的一份保留不用
2) 在异常量表中存放的一条跳转指令
3) 7种异常源在异常向量表中的位置固定,不可以随意更改。
示例: 手动修改到user模式,然后使用 swi 软中断切换到 SVC 异常模式
.text
.global _start
_start:
b reset_handler
b undef_handler
b swi_handler
b pref_abort_handler
b data_abort_handler
b .
b irq_handler
b fiq_handler reset_handler: @ 复位开始为 SVC 模式
ldr sp, =0x40000200 @ 初始化栈
mrs r0, cpsr @ 读取程序状态寄存器
mov r1, #0x1F
mvn r1, r1
and r0, r0, r1
mov r1, #0x10
orr r0, r0, r1 @ 修改 读取 的CPSR 中的数据, 然后再重新写入CPSR 寄存器
msr cpsr, r0 @ 保存状态寄存器 此时改为 user 模式
ldr sp, =0x40000100 @ 初始化此状态下的 sp 指针
swi # @ 使用指令 swi 产生异常,异常号为
mov r0, #
mov r1, #
swi # @ 使用指令 swi 产生异常,异常号为
mov r0, #
mov r1, #
loop:
b loop undef_handler:
swi_handler: @ 切换模式后, 先进行现场保护, cpsr和lr值保存,修改cpsr切换模式
.if
stmfd sp!, {r0-r10, lr} @ 入栈 拷贝过来的lr 值, lr内容没有改变
mov r0, #
mov r1, #
ldmfd sp!, {r0-r10, r12} @ 出栈
mrs r11, spsr
msr cpsr, r11
mov pc, r12 @ 恢复现场
.else
stmfd sp!, {r0-r12, lr}
mov r0, #
mov r1, # mov r0, lr
sub r0, r0, # @ 获取 lr 上一条指令(也就是swi)的地址
ldr r1, [r0] @ 提取 swi 指令对应的机器码
ldr r2, =0xFFFFFF @ 提取后24位 对应的 num号
and r0, r1, r2 @根据r0判断具体是哪个地方的swi ldmfd sp!, {r0-r12, pc}^ @ 恢复现场, ^ 表示同时操作两个步骤
.endif pref_abort_handler:
data_abort_handler:
irq_handler:
fiq_handler: .end

ARM 异常处理过程,指令[ swi ]的更多相关文章
- 四、ARM 异常处理
4.1 模式与异常 当正常程序流程被暂时停止发生异常,例如响应一个来自外设的中断.在处理异常前,必须保护当前的处理器状态,以便在完成处理程序后能恢复到原来的程序 . 异常的类型: Reset unde ...
- Linux kernel的中断子系统之(六):ARM中断处理过程
返回目录:<ARM-Linux中断系统>. 总结:二中断处理经过两种模式:IRQ模式和SVC模式,这两种模式都有自己的stack,同时涉及到异常向量表中的中断向量. 三ARM处理器在感知到 ...
- or1200处理器的异常处理类指令介绍
下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 我们在计算机体系结构的学习中知道:中断实质上包含由外部事件引起的硬中断(又称外中断)和由内部预先安排的特定指令或内部异常引起的软中断 ...
- ARM的栈指令
ARM的指令系统中关于栈指令的内容比较容易引起迷惑,这是因为准确描述一个栈的特点需要两个参数: 栈地址的增长方向:ARM将向高地址增长的栈称为递增栈(Descendent Stack),将向低地址增长 ...
- ARM的栈指令(转)
ARM的指令系统中关于栈指令的内容比较容易引起迷惑,这是因为准确描述一个栈的特点需要两个参数: 栈地址的增长方向:ARM将向高地址增长的栈称为递增栈(Descendent Stack),将向低地址增长 ...
- ARM指令集—SWP指令
ARM指令集-SWP指令 SWP和SWPB是ARM指令集中对存储单元的原子操作.即对存储单元的一次读和一次不可被切割. SWP和SWPB分别完毕存储器和寄存器之间 一个字(32bit)和一个字节(8b ...
- (二十三)ARM平台NEON指令的编译和优化
ARM平台NEON指令的编译和优化 本文介绍了ARM平台基于ARM v7-A架构的ARM Cortex-A系列处理器(Cortex-A5, Cortex-A7,Cortex-A8, Cortex-A9 ...
- Linux中断 - ARM中断处理过程
一.前言 本文主要以ARM体系结构下的中断处理为例,讲述整个中断处理过程中的硬件行为和软件动作.具体整个处理过程分成三个步骤来描述: 1.第二章描述了中断处理的准备过程 2.第三章描述了当发生中的时候 ...
- ARM指令集——数据处理指令
ARM汇编指令集 ARM汇编文件的组成 指令:编译完成后作为一条指令(机器码)存储在内存单元中,CPU执行时能够完成处理的操作 伪指令:在编译时替换成能被识别的ARM指令 伪操作:知道编译器进行编译, ...
随机推荐
- python配置文件configparser详解
Python中一般需要配置文件,配置文件一般以.cfg, .conf, .ini结尾.配置文件可以将数据库抽离到以 .ini(Windows)结尾的文件中,这样做的优点在于可在配置文件中添加多个数据库 ...
- arcpy-字段唯一值、重复值、最值、平均值、方差、标准差、中数、众数
插个广告,制作ArcGIS的Tool工具学习下面的教程就对了: 零基础学习Python制作ArcGIS自定义工具观看链接 <零基础学习Python制作ArcGIS自定义工具>课程简介 im ...
- c# DataTable join 两表连接
转:https://www.cnblogs.com/xuxiaona/p/4000344.html JlrInfodt和dtsource是两个datatable,通过[姓名]和[lqry]进行关联 v ...
- STM32三种BOOT模式介绍
一.三种BOOT模式介绍 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存.用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启 ...
- mysql查找字段空、不为空的方法总结
1.不为空 Select * From table_name Where id<>'' Select * From table_name Where id!='' 2.为空 Select ...
- python基础和编程库
Python编程从入门到实践-------基础入门 1.Python中的变量 2.Python首字母大写使用title()方法,全部大写upper()方法,全部小写lower()方法 3.Python ...
- CacheException: java.io.OptionalDataException
CacheException: java.io.OptionalDataException iro.authc.AbstractAuthenticator] - Authentication fail ...
- 建模+线性dp——cf1201D
这类题目要首先把模型建立起来,挑选一个好的状态能让dp方程简化很多 /* dp[i][0]表示从右到左,最后停在左端 dp[i][1]表示从左到右,最后停在右端 dp[i+1][0]=min(dis( ...
- SELinux导致PHP连接MySQL异常Can't connect to MySQL server的解决方法
原文摘自:http://www.jb51.net/article/52581.htm 这篇文章主要介绍了SELinux导致PHP连接MySQL异常Can't connect to MySQL serv ...
- bzoj1211树的计数 x bzoj1005明明的烦恼 题解(Prufer序列)
1211: [HNOI2004]树的计数 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3432 Solved: 1295[Submit][Stat ...