首页 > 编程语言 >[ARM 汇编]进阶篇—异常处理与中断—2.4.2 ARM处理器的异常向量表

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

时间:2023-06-17 23:45:20浏览次数:48  
标签:Addr PC Abort 进阶篇 Handler 异常 ARM 向量

异常向量表简介

在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

file

标签:Addr,PC,Abort,进阶篇,Handler,异常,ARM,向量
From: https://www.cnblogs.com/yaoqian/p/17488490.html

相关文章

  • 基础语法-异常
    try-catch语句块:使用try-catch语句块可以捕获和处理异常。在try块中放置可能会抛出异常的代码,然后通过catch块捕获并处理异常。catch块中指定要处理的异常类型,并提供相应的处理逻辑。try{//可能会抛出异常的代码}catch(ExceptionType1e1){//处理ExceptionT......
  • ARM(A7) wfi唤醒后...是执行中断处理程序还是后一条指令
    记录WFI相关细节,以及如何让中断唤醒后先执行wfi后指令,再执行中断异常;或者优先执行中断异常,再执行wfi后指令。1.ARM(A7)关于WFI的描述处理器可以通过执行WFI指令进入WFI低功耗状态。当硬件检测到WFI唤醒事件,WFI指令结束。WFI唤醒事件无法被CPSR屏蔽位屏蔽。执行wfi后processo......
  • HarmonyOS应用开发者基础认证题库
    祝大家都顺利通过判断题1.Web组件对于所有的网页都可以使用zoom(factor:number)方法进行缩放。错误(False)2.每一个自定义组件都有自己的生命周期正确(True)3.每调用一次router.pushUrl()方法,默认情况下,页面栈数量会加1,页面栈支持的最大页面数量为32。正确(True)4.所......
  • Java线程池与异常处理
    线程池线程池的创建代码ThreadPoolExecutorthreadPoolExecutor=newThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,......
  • arm系统部署k8s
    一、Docker安装1、下载资源docker安装包地址:https://download.docker.com/linux/static/stable/aarch64/这里下载的是docker-20.10.20.tgz。解压后,将docker目录下文件拷贝到/usr/bin$tar-xfdocker-19.10.20.tgz$mvdocker/*/usr/bin2、配置system服务创建docker.socket文件$......
  • 【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实
    异常传播有时候,您可能需要重新抛出捕获到的异常。这种情况通常发生在捕获到Error或RuntimeException时,因为您可能没有预料到这些异常,但在声明捕获Throwable和Exception时,它们也被包含在内了。为了解决这个问题,Guava提供了多种方法来判断异常类型并重新抛出异常。例如:try{......
  • [ARM 汇编]进阶篇—存储访问指令—2.3.3 栈操作指令
    栈是一种特殊的数据结构,其特点是后进先出(LIFO,LastInFirstOut)。在ARM汇编中,栈通常用于保存函数调用时的寄存器状态、局部变量和返回地址等。本节将详细介绍ARM汇编中的栈操作指令,并通过实例帮助你更好地理解和掌握这些指令。推入栈(PUSH)PUSH指令用于将一个或多个寄存器......
  • Day08-异常机制、包装类、String-StringBuffer-StringBuilder比较
    异常机制异常处理5个关键字:try、catch、finally、throw、throws注意点假设要捕获多个异常,异常类型从小到大try监控区域,catch(想要捕获的异常类型!)捕获异常finally处理善后工作,可以不要finallythrow主动抛出异常throws在方法上捕获异常 包装类包装类(I......
  • RK3588平台产测之ArmSoM产品低温环境测试
    1.简介专栏总目录ArmSoM团队在产品量产之前都会对产品做几次专业化的功能测试以及性能压力测试,以此来保证产品的质量以及稳定性优秀的产品都要进行多次全方位的功能测试以及性能压力测试才能够经得起市场的检验2.ArmSoM-W3软硬件重启测试方案软件方式重启系统3000次测试硬件电源......
  • CKS 考试题整理 (13)-使用 sysdig 检查容器里里的异常进程
    Task使用运行时检测工具来检测Podtomcat单个容器中频发生成和执行的异常进程有两种工具可供使用:sysdigfalco注:这些工具只预装在cluster的工作节点,不在master节点。 使用工具至少分析30秒,使用过滤器检查生成和执行的进程,将事件写到/opt/KSR00101/incidents/summ......