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 ]的更多相关文章

  1. 四、ARM 异常处理

    4.1 模式与异常 当正常程序流程被暂时停止发生异常,例如响应一个来自外设的中断.在处理异常前,必须保护当前的处理器状态,以便在完成处理程序后能恢复到原来的程序 . 异常的类型: Reset unde ...

  2. Linux kernel的中断子系统之(六):ARM中断处理过程

    返回目录:<ARM-Linux中断系统>. 总结:二中断处理经过两种模式:IRQ模式和SVC模式,这两种模式都有自己的stack,同时涉及到异常向量表中的中断向量. 三ARM处理器在感知到 ...

  3. or1200处理器的异常处理类指令介绍

    下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 我们在计算机体系结构的学习中知道:中断实质上包含由外部事件引起的硬中断(又称外中断)和由内部预先安排的特定指令或内部异常引起的软中断 ...

  4. ARM的栈指令

    ARM的指令系统中关于栈指令的内容比较容易引起迷惑,这是因为准确描述一个栈的特点需要两个参数: 栈地址的增长方向:ARM将向高地址增长的栈称为递增栈(Descendent Stack),将向低地址增长 ...

  5. ARM的栈指令(转)

    ARM的指令系统中关于栈指令的内容比较容易引起迷惑,这是因为准确描述一个栈的特点需要两个参数: 栈地址的增长方向:ARM将向高地址增长的栈称为递增栈(Descendent Stack),将向低地址增长 ...

  6. ARM指令集—SWP指令

    ARM指令集-SWP指令 SWP和SWPB是ARM指令集中对存储单元的原子操作.即对存储单元的一次读和一次不可被切割. SWP和SWPB分别完毕存储器和寄存器之间 一个字(32bit)和一个字节(8b ...

  7. (二十三)ARM平台NEON指令的编译和优化

    ARM平台NEON指令的编译和优化 本文介绍了ARM平台基于ARM v7-A架构的ARM Cortex-A系列处理器(Cortex-A5, Cortex-A7,Cortex-A8, Cortex-A9 ...

  8. Linux中断 - ARM中断处理过程

    一.前言 本文主要以ARM体系结构下的中断处理为例,讲述整个中断处理过程中的硬件行为和软件动作.具体整个处理过程分成三个步骤来描述: 1.第二章描述了中断处理的准备过程 2.第三章描述了当发生中的时候 ...

  9. ARM指令集——数据处理指令

    ARM汇编指令集 ARM汇编文件的组成 指令:编译完成后作为一条指令(机器码)存储在内存单元中,CPU执行时能够完成处理的操作 伪指令:在编译时替换成能被识别的ARM指令 伪操作:知道编译器进行编译, ...

随机推荐

  1. jquery hover中嵌套mouseenter,mouseenter函数执行多次的问题解决方案

    已知晓在jq中hover的API就是把mouseenter和mouseleave组合在一起来用的,在jq中实现`hover:function(fnOver,fnOut){return this.mou ...

  2. [POI2010]OWC-Sheep

    题目 不难猜到或者发现的性质,如果连了一条对角线划分出了奇数个点,那么这条对角线肯定不合法:因为划分成三角形就不可能有对角线相交,于是划分成奇数的那一边怎么样也不可能划分成全是偶数 于是我们需要对每一 ...

  3. js保留两位小数的方法

    js保留两位小数的方法如下 1.toFixed()方法 需注意,保留两位小数,将数值类型的数据改变成了字符串类型 2.Math.floor(),不四舍五入 ,向下取整 注意,不改变数据类型 3.字符串 ...

  4. 我爱Linux

    这道题卡了好久,题是一张图片,打开看到看提示以为是用哪个Linux命令处理,直到后来知道后面是python序列化文件的数据,将FF D9后保存出来,将序列化文件读出来写脚本把它画出来 import p ...

  5. 出现异常: 非介入式客户端验证规则中的验证类型名称必须唯一。下列验证类型出现重复: required

    在将web.config文件中的<add key="ClientValidationEnabled" value="false" /> 设为fals ...

  6. c# DataTable第二行改为各列标题字段

    DataTable dt = ExcelHelper.ToDataTable(fileinfo.FilePath); //将datatable的第二行变为列标题字段 DataTable dt2 = n ...

  7. tar - tar 档案文件管理程序的 GNU 版本。

    总览 tar [ - ] A --catenate --concatenate | c --create | d --diff --compare | r --append | t --list | ...

  8. Docker部署web环境之总结篇

    3. 问题总结 问题总结1: 数据库容器时区问题以及环境变量的安全控制 docker-compose.yml文件中的环境变量,可以配置的变量方法有两种: 方法一:docker-compose.yml文 ...

  9. JavaScript代码/ES6语法笔记一

    1. new Set()/去重一个数组 let arr = [1, 2, 2, 3, 3]; let set = new Set(arr); let newArr = Array.from(set); ...

  10. day03 python数据类型 数字 字符串 布尔

    day03 python   一.基本数据类型     1.int a= 8 a_length = a.bit_length()  #此方法求数字的二进制长度  print(a_length)     ...