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

这篇具有很好参考价值的文章主要介绍了[ARM 汇编]进阶篇—异常处理与中断—2.4.2 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

[ARM 汇编]进阶篇—异常处理与中断—2.4.2 ARM处理器的异常向量表文章来源地址https://www.toymoban.com/news/detail-487925.html

到了这里,关于[ARM 汇编]进阶篇—异常处理与中断—2.4.2 ARM处理器的异常向量表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】

    目录 一、单个控制器异常处理 1.1 控制器方法 1.2 编写出错页面 1.3 测试结果 二、全局异常处理 2.1 一个有异常的控制器类 2.2 全局异常处理器类 2.3 测试结果  三、自定义异常处理器 3.1 自定义异常处理器 3.2 测试结果 往期专栏文章相关导读  1. Maven系列专栏文章 2. Mybatis系列

    2024年02月16日
    浏览(45)
  • MIPS指令集处理器设计(支持64条汇编指令)

    一、题目背景和意义 二、国内外研究现状 (略) (1) .mips 基础 指令集格式 总结 MIPS是(Microcomputer without interlocked pipeline stages)[10]的缩写,含义是无互锁流水级微处理器。MIPS 是最早、最成功的RISC处理器之一[11],源于Stanford 大学的John Hennessy 教授的研究成果。(Hennessy 于1984年在

    2024年02月07日
    浏览(45)
  • ARM处理器概述

    RISC处理器和CISC处理器 首先了解一下两种处理器名字: RISC(Reduced Instruction Set Computer): 精简指令集 处理器 与之相对应的是: CISC(Complex Instruction Set Computer): 复杂指令集 处理器 顾名思义,RISC比CISC更加简单,那么对于处理器来说什么能称为简单呢?可以联想为生活中可

    2024年02月13日
    浏览(57)
  • SSM整合(三) | 异常处理器 - 项目异常的处理方案

    异常处理器快速入门 程序开发过程中不可避免的会遇到异常现象 出现异常现象的常见位置与常见原因如下 : 框架内部抛出的异常:因使用不规范导致 数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时) 业务层抛出的异常:因业务逻辑书写错误导致(例如

    2024年02月02日
    浏览(47)
  • 全局异常处理器

    前言:由于 Controller 调用 Services ,最后调用 Mapper 来操作数据库,若 Mapper 操作数据库出问题了,此时页面报错会按照调用的原路径层层上报,最后未经处理的异常会上报至框架,最后服务器会向前端返回一个 JSON 的报错数据,而前端接收的是对 Result 封装过的 data 对象中的

    2024年02月11日
    浏览(49)
  • Spring异常处理器

     问题:   程序允许不免的在各层都可能会产生异常,我们该如何处理这些异常? 如果只是在方法里面单独使用 try… catch… 语句去一个一个的进行捕捉处理的话,那毫无疑问是不现实的,因为异常数量是非常庞大的并且对于异常的出现种类是不可预料的,于是我们可以使用

    2024年02月13日
    浏览(45)
  • 除法的效率 arm处理器

    除法的效率 性能结论: 除法:545ms 乘法:93ms 差了3倍 代码: 测试结果 : void fun(Pack1* restrict in, Pack2* restrict out) ; __restrict__ 申明该指针为唯一的访问该内存的指针 优化成果: 时间优化为原来的82% 指令优化为74% cache miss 没有变化 优化对比 测试平台 MTK arm天机 8000

    2024年02月10日
    浏览(58)
  • SpringMVC之异常处理器

    SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver。 HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver(默认的)和 SimpleMappingExceptionResolver(自定义的)。 这里配置了两个异常,出现其中一个异常后跳转到error页面。 以上就是异

    2024年02月10日
    浏览(38)
  • 13、SpringMVC之异常处理器

    创建名为spring_mvc_exception的新module,过程参考9.1节和9.5节 SpringMVC 提供了一个处理控制器方法执行异常的接口:HandlerExceptionResolver HandlerExceptionResolver 接口的实现类有:DefaultHandlerExceptionResolver 和 SimpleMappingExceptionResolver 实际工作中,有时使用 SimpleMappingExceptionResolver 异常解析器

    2024年02月05日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包