热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

ARM各种异常返回地址的计算

首先,给出ARM的三级流水线结构图,这是后面分析的基础。上图中最左侧为指令的地址,根据三级流水线结构,当PC0X3008是时,正在执行的的指令是地址为0X3000的这条指令。在分别讲解各种异常之前,

首先,给出ARM的三级流水线结构图,这是后面分析的基础。

这里写图片描述

上图中最左侧为指令的地址,根据三级流水线结构,当PC=0X3008是时,正在执行的的指令是地址为0X3000的这条指令。

在分别讲解各种异常之前,有一条总的原则就是:无论发生什么异常(除复位),内核总是会首先将 PC-4 放到LR寄存器中。

1. 复位异常

复位异常中断处理程序不需要返回。在复位异常中断处理程序开始整个用户程序的执行,因而它不需要返回。

2. 未定义指令异常

指遇到了一条没有定义的指令导致执行时无法执行。

未定义指令异常中断是由当前执行的指令自身产生的,当产生中断时,程序计数器PC的值还未更新(未更新的意思就是PC还没有加4 呢);

以上面的流水线结构为例,地址为0X3000的指令(即第一条指令)执行时产生未定义异常,这时PC = 0X3008,内核将会把PC-4即0X3004放到LR_UND寄存器中。中断执行结束之后,我们实际上要执行的就是0X3004这条指令,所以直接用MOV PC,LR

3. 软件中断异常

由指令SWI引起的,程序在执行这一指令后,进入异常中断。

同样,未定义指令异常中断是由当前执行的指令自身产生的,当产生中断时,程序计数器PC的值还未更新;

具体实例与未定义指令异常相同,不再赘述。

4. 预取指异常

预取指异常与下面的数据访问异常是比较难以区分的。
由程序存储器引起的中止异常叫做预取指中止异常;
由数据存储器引起的中止异常叫做数据中止异常。

虽然预取指异常在取指阶段就会被标记出来,但是一定要到执行该指令的时候才会出现异常,因为这条指令可能根本就没有机会运行。当然数据中止异常也是要到指令执行阶段才出现的。

这两者之间还有一点共同点就是,当出现异常后,要重新再执行一次这条指令,这也是与其他异常不太一样的地方。

这两者之间的重要区别就在于:预取指异常是由于指令自身引起的,所以当产生中断时,程序计数器PC的值还未更新;但是数据中止异常的产生是由ALU产生的,当产生中断时,PC的值已经更新了(比如说0X3000产生数据异常,中断产生时,PC=0X000C了已经)!!

言归正传,举例说明。地址为0X3000的指令执行时产生预取指异常,这时PC = 0X3008,内核将会把PC-4即0X3004放到LR_ABT寄存器中。中断执行结束之后,我们实际上要执行的就是0X3000这条指令,所以用 SUBS PC,LR,#4

5. 数据中止异常

数据中止异常就是在执行指令时数据出现错误。

再次强调,数据访问异常中断由当前执行的指令在ALU里执行时产生,当数据访问异常中断发生时,程序计数器pc的值已经更新。

举例。地址为0X3000的指令执行时产生数据中止异常,这时PC = 0X300C,内核将会把PC-4即0X3008放到LR_ABT寄存器中。中断执行结束之后,我们实际上要执行的就是0X3000这条指令,所以用 SUBS PC,LR,#8

6. 中断请求(IRQ)异常

在此不解释何为中断请求异常。
注意,产生中断请求异常时,程序计数器pc的值也已经更新!

举例。地址为0X3000的指令执行时产生数据中止异常,这时PC = 0X300C,内核将会把PC-4即0X3008放到LR_IRQ寄存器中。中断执行结束之后,我们实际上要执行的就是0X3004这条指令,所以用 SUBS PC,LR,#4

7. 快速中断(FIQ)请求异常

与IRQ异常基本相同,不再赘述。

总结:

这里写图片描述


推荐阅读
  • 本文汇总了在正式宴会上常用的寒暄语句,包括欢迎词、感谢词及日常问候,适用于各种正式场合。这些语句不仅有助于提升交际礼仪,还能增进彼此之间的友好关系。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 解析SQL查询结果的排序问题及其解决方案
    本文探讨了为什么某些SQL查询返回的数据集未能按预期顺序排列,并提供了详细的解决方案,帮助开发者理解并解决这一常见问题。 ... [详细]
  • 本文提供南昌大学《嵌入式系统》课程期末考试的真题及详细解答,涵盖填空题、指令测试题等内容,帮助学生更好地理解和掌握相关知识点。 ... [详细]
  • 本文详细介绍了C语言的起源、发展及其标准化过程,涵盖了从早期的BCPL和B语言到现代C语言的演变,并探讨了其在操作系统和跨平台编程中的重要地位。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 在进行QT交叉编译时,可能会遇到与目标架构不匹配的宏定义问题。例如,当为ARM或MIPS架构编译时,需要确保使用正确的宏(如QT_ARCH_ARM或QT_ARCH_MIPS),而不是默认的QT_ARCH_I386。本文将详细介绍如何正确配置编译环境以避免此类错误。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 本文介绍 Java 中如何使用 Year 类的 atMonth 方法将年份和月份组合成 YearMonth 对象,并提供代码示例。 ... [详细]
  • yikesnews第11期:微软Office两个0day和一个提权0day
    点击阅读原文可点击链接根据法国大选被黑客干扰,发送了带漏洞的文档Trumps_Attack_on_Syria_English.docx而此漏洞与ESET&FireEy ... [详细]
  • vivo Y5s配备了联发科Helio P65八核处理器,这款处理器采用12纳米工艺制造,具备两颗高性能Cortex-A75核心和六颗高效能Cortex-A55核心。此外,它还集成了先进的图像处理单元和语音唤醒功能,为用户提供卓越的性能体验。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • Logback使用小结
    1一定要使用slf4j的jar包,不要使用apachecommons的jar。否则滚动生成文件不生效,不滚动的时候却生效~~importorg.slf ... [详细]
  • 中断向量是计算机系统中用于指向中断服务程序的入口地址。每个中断向量对应一个特定的中断事件,存储在内存中的中断向量表中。该表通常包含256个条目,每个条目占用4个字节,用于存放跳转指令或直接指向中断处理程序的地址。 ... [详细]
author-avatar
晓云71_783
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有