[ARM 汇编]进阶篇—异常处理与中断—2.4.2 ARM处理器的异常向量表

数据分
• 阅读 519

异常向量表简介

在ARM架构中,异常向量表是一组固定位置的内存地址,它们包含了处理器在遇到异常时需要跳转到的处理程序的入口地址。每个异常类型都有一个对应的向量地址。当异常发生时,处理器会自动跳转到对应的向量地址,并开始执行异常处理程序。

异常向量表的位置

ARM处理器的异常向量表位于内存的低地址空间。具体地址如下:

异常类型向量地址
复位(Reset)0x00000000
未定义指令(Undefined Instruction)0x00000004
软件中断(SWI)0x00000008
预取指令异常(Prefetch Abort)0x0000000C
数据异常(Data Abort)0x00000010
保留(Reserved)0x00000014
外部中断(IRQ)0x00000018
快速外部中断(FIQ)0x0000001C

异常向量表的初始化

在ARM汇编开发中,我们需要在程序开始时初始化异常向量表。初始化过程包括将每个向量地址设置为对应的异常处理程序的入口地址。这通常通过将异常处理程序的地址存储在向量表中的相应位置来完成。

以下是一个初始化异常向量表的示例代码:

AREA Vectors, CODE, READONLY
    ; 复位向量
    LDR PC, Reset_Addr
    ; 未定义指令向量
    LDR PC, Undefined_Addr
    ; 软件中断向量
    LDR PC, SWI_Addr
    ; 预取指令异常向量
    LDR PC, Prefetch_Abort_Addr
    ; 数据异常向量
    LDR PC, Data_Abort_Addr
    ; 保留向量
    NOP
    ; 外部中断向量
    LDR PC, IRQ_Addr
    ; 快速外部中断向量
    LDR PC, FIQ_Addr

    ; 异常处理程序地址
    Reset_Addr          DCD _start
    Undefined_Addr      DCD Undefined_Handler
    SWI_Addr            DCD SWI_Handler
    Prefetch_Abort_Addr DCD Prefetch_Abort_Handler
    Data_Abort_Addr     DCD Data_Abort_Handler
    IRQ_Addr            DCD IRQ_Handler
    FIQ_Addr            DCD FIQ_Handler

在这个示例中,我们首先使用AREA指令定义一个名为Vectors的代码段。接下来,我们将每个异常向量设置为对应的处理程序地址。例如,对于软件中断(SWI),我们将其向量地址设置为SWI_Handler

在向量表的末尾,我们使用DCD指令定义每个异常处理程序的入口地址。这些地址将在处理器遇到异常时被加载到程序计数器(PC)寄存器,从而实现异常处理的跳转。

示例代码

以下是一个简单的示例代码,演示了如何使用异常向量表处理软件中断(SWI):

; 初始化异常向量表
    AREA Vectors, CODE, READONLY
    LDR PC, Reset_Addr
    LDR PC, Undefined_Addr
    LDR PC, SWI_Addr
    LDR PC, Prefetch_Abort_Addr
    LDR PC, Data_Abort_Addr
    NOP
    LDR PC, IRQ_Addr
    LDR PC, FIQ_Addr

    Reset_Addr          DCD _start
    Undefined_Addr      DCD Undefined_Handler
    SWI_Addr            DCD SWI_Handler
    Prefetch_Abort_Addr DCD Prefetch_Abort_Handler
    Data_Abort_Addr```assembly
DCD Data_Abort_Handler
IRQ_Addr            DCD IRQ_Handler
FIQ_Addr            DCD FIQ_Handler

; 主程序
AREA Main, CODE, READONLY
_start
    ; 触发软件中断
    SWI 0

; 异常处理程序
AREA Handlers, CODE, READONLY
Undefined_Handler
    B Undefined_Handler

SWI_Handler
    ; 在此处编写软件中断处理程序
    ; ...
    ; 返回到主程序
    MOV PC, LR

Prefetch_Abort_Handler
    B Prefetch_Abort_Handler

Data_Abort_Handler
    B Data_Abort_Handler

IRQ_Handler
    B IRQ_Handler

FIQ_Handler
    B FIQ_Handler

在这个示例中,我们首先初始化异常向量表,然后在_start标签下的主程序中触发一个软件中断(SWI)。当软件中断发生时,处理器会自动跳转到SWI_Handler异常处理程序。

SWI_Handler中,你可以编写相应的处理代码。处理完成后,使用MOV PC, LR指令返回到主程序。

需要注意的是,这个示例仅用于演示异常向量表的基本概念和用法。在实际开发中,你可能需要根据具体的硬件平台和需求进行相应的调整和优化。

小结

本节我们介绍了ARM处理器的异常向量表,包括其位置、初始化过程以及如何使用异常向量表处理异常。通过学习本节内容,你应该对ARM汇编开发中的异常处理有了基本的了解。在之后的学习中,你可以更深入地探讨各种异常类型以及如何编写高效、稳定的异常处理程序。
推荐阅读:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

[ARM 汇编]进阶篇—异常处理与中断—2.4.2 ARM处理器的异常向量表

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java Exception和Error的区别
Exception子类下面的另一部分子类对应于Java程序中的非运行时异常的处理,这些异常也称为显式异常。它们都是在程序中用语句抛出、并且也是用语句进行捕获的,比如,文件没找到引起的异常、类没找到引起的异常等。常见的异常有:ArithmeticException——由于除数为0引起的异常;ArrayStoreExcept
Wesley13 Wesley13
3年前
JAVA学习笔记 之 异常
异常的概述代码在运行时期发生的问题就称之为异常。在java中,异常被封装成为了一个类,当程序出现了异常类中的问题时,异常的信息(如位置和原因)就会被抛出。在java中用Exception来描述异常,publicclassExceptionextendsThrowable则是异常的继承体系。 Throwable是所有错误或异常的
Stella981 Stella981
3年前
Hystrix异常处理及线程池划分
异常处理异常传播在HystrixCommand实现的run()方法中抛出异常时,除了HystrixBadRequestException之外,其他异常均会被Hystrix认为命令执行失败并触发服务降级的处理逻辑,所以当需要在命令执行中抛出不触发服务降级的异常时来选择它。在使用注解配置实现Hystrix命令时,可以忽略指定的异常
Wesley13 Wesley13
3年前
Java 异常处理
完善的异常处理有利于程序稳定。不要不停的catch异常。什么是异常??定义:异常是一个事件,它发生在程序的执行过程中,会破坏程序的正常执行在一个错误发生会在一个方法时,创建一个Exception对象来处理来保证程序能继续执行下去。当异常发生时,JVM会搜索调用栈上的所有方法,若没有找到合适的异常处理方法,JVM将会终
Stella981 Stella981
3年前
PlayJava Day020
1.异常Exception补充:①错误(Error)指的是致命性错误,一般无法处理②异常以类的形式封装程序可以处理的异常对应的类是java.lang.Exception及其子类运行时异常对应的类是java.lang.RuntimeException错误异常对应的类是java.lang.Error③异常相关类的继承树:java.la
Wesley13 Wesley13
3年前
Java异常处理的最佳实践
Java异常处理的最佳实践为什么要有最佳实践我们在写程序是不可避免的要对代码进行异常处理,但是有时对异常的处理会使我们的程序变的更加糟糕,这是我们所不想看到的。所以,我们再进行异常处理时需要遵循一定的套路,来降低异常处理对我们程序的影响。异常产生的原因一般来说,java中的异常会
Stella981 Stella981
3年前
SpringBoot2 全局异常处理
参考这篇文章里面的几种异常形式:全局异常处理是个比较重要的功能,一般在项目里都会用到。 大概把一次请求分成三个阶段,来分别进行全局的异常处理。 一:在进入Controller之前,譬如请求一个不存在的地址,404错误。 二:在执行@RequestMapping时,进入逻辑处理阶段前。譬如传的参数类型错误。 
Easter79 Easter79
3年前
SpringBoot2 全局异常处理
参考这篇文章里面的几种异常形式:全局异常处理是个比较重要的功能,一般在项目里都会用到。 大概把一次请求分成三个阶段,来分别进行全局的异常处理。 一:在进入Controller之前,譬如请求一个不存在的地址,404错误。 二:在执行@RequestMapping时,进入逻辑处理阶段前。譬如传的参数类型错误。 
小万哥 小万哥
2年前
C++异常和错误处理机制:如何使您的程序更加稳定和可靠
在C编程中,异常处理和错误处理机制是非常重要的。它们可以帮助程序员有效地处理运行时错误和异常情况。本文将介绍C中的异常处理和错误处理机制。什么是异常处理?异常处理是指在程序执行过程中发生异常或错误时,程序能够捕获并处理这些异常或错误的机制。例如,当
小万哥 小万哥
1年前
C++ 异常处理机制详解:轻松掌握异常处理技巧
C异常处理C异常处理机制允许程序在运行时处理错误或意外情况。它提供了捕获和处理错误的一种结构化方式,使程序更加健壮和可靠。异常处理的基本概念:异常:程序在运行时发生的错误或意外情况。抛出异常:使用throw关键字将异常传递给调用堆栈。捕获异常:使用
sum墨 sum墨
10个月前
《优化接口设计的思路》系列:第五篇—接口发生异常如何统一处理
BUG对于程序员来说实在是不陌生,当代码出现BUG时,异常也会随之出现,但BUG并不等于异常,BUG只是导致异常出现的一个原因。导致异常发生的原因非常多,本篇文章我也主要只讲一下接口相关的异常怎么处理。