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. 35-python基础-python3-字符串修改大小写的方法-title()方法-lower()方法-upper()方法

    1-title()-注:不是原地修改,有返回值 以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写. 2-lower()和upper()-注:不是原地修改,有返回值 将字符串改为全部小写或 ...

  2. BUUCTF MISC部分题目wp

    MISC这里是平台上比较简单的misc,都放在一起,难一些的会单独写1,二维码图片里藏了一个压缩包,用binwalk -e分离,提示密码为4个数字,fcrackzip -b -c1 -l 4 -u 得 ...

  3. CreateFile的内部实现

    今天想看看CreateFile的内部实现,不过网上没有想要的资料,都只是对参数分析了一下.找了找WRK源码,找到CreateFile的源码自己来分析一下. HANDLE WINAPI CreateFi ...

  4. std::wcout输出1遍不输出

    std::wcout输出1遍不输出 程序明明在执行地方执行 wcout无法输出到控制台 cout就可以 添加中文支持即可

  5. node.js提供的服务器live-server的使用

    安装node.js的版本控制工具nvm,在终端中执行 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/instal ...

  6. leetcode-12双周赛-1244-力扣排行榜

    题目描述: class Leaderboard: def __init__(self): self.map = collections.Counter() def addScore(self, pla ...

  7. js 暂停几秒后刷新或提交

    js源码如下: setTimeout(function () { //内容3秒后执行 }, 3000);

  8. js-统计中文,英文,字符的个数

    function getByteLen(val) { ; ; i < val.length; i++) { var a = val.charAt(i); if (a.match(/[^\x00- ...

  9. CSS3 图形变换

    1.zoom  和  transform:scale  的区别   :    http://www.zhangxinxu.com/wordpress/2015/11/zoom-transform-sc ...

  10. js设计模式——6.模板方法模式与职责链模式

    js设计模式——6.模板方法模式与职责链模式 职责链模式