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

原创 2017年01月03日 11:33:55

首先,给出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异常基本相同,不再赘述。

总结:

这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

ARM中断返回PC值分析

ARM中断返回PC值分析 在ARM程序的开发过程中,对中断的处理是很普遍的、也是相当重要的。Realview MDK使用的RVCT编译器提供了__irq关键字,用此关键字修饰的函数被作为中断来函...
  • u010479322
  • u010479322
  • 2016年05月18日 11:07
  • 531

【补充】关于ARM的PC指针异常返回处理(PC+8,PC+4,PC-4,PC-8情况)

要理解PC指针,首先就要好好了解LR指针 连接寄存器LR(r14):用来保存和恢复PC寄存器的内容,它有两个特殊功能。     (1)保存子程序返回地址。使用BL或BLX时,跳转指令自动把返回地...
  • czg13548930186
  • czg13548930186
  • 2017年07月15日 22:03
  • 5987

ARM七种异常源和异常处理流程(四大步三小步)

ARM七种异常源和异常处理流程。ARM异常处理(处理器对特定的异常事件进行的处理)的进入过程(硬件自动完成):四大步(两备份两修改)三小步。...
  • yunfenglw
  • yunfenglw
  • 2014年11月30日 09:56
  • 3146

ARM异常中断返回的几种情况

重要基础知识:R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此 PC总是指...
  • u013562393
  • u013562393
  • 2016年06月13日 22:05
  • 1504

ARM异常处理

ARM异常处理: 只要正常的程序流被暂时中止,处理器就进入异常模式。例如响应一个来自外设的中断。在处理异常之前,ARM内核保存当前的处理器状态,这样当处理程序结束是可以恢复执行原来的程序。 注意:...
  • haoge921026
  • haoge921026
  • 2015年06月29日 20:41
  • 907

ARM的异常处理过程分析

原文地址:http://blog.chinaunix.net/uid-20937170-id-3220124.html 近来翻了uOS-II官网给出来的ARM7-ARM9移植手册(AN-104)...
  • xiaohuima_dong
  • xiaohuima_dong
  • 2015年05月14日 23:16
  • 1462

ARM中断异常处理的返回的问题

因为ARM指令是三级流水线就是说取指,译指,执行时同时执行的 ,这样说吧,现在PC指向的是正在取指的地址,那么cpu正在译指的指令地址是PC-4(假设在ARM状态下,一个指令占4个字节),cpu正在执...
  • zzsfqiuyigui
  • zzsfqiuyigui
  • 2014年04月10日 10:01
  • 3189

ARM汇编SWI

1.  状态切换和BX指令 AREA   ADDREG,CODE,READONLY   ENTRY MAIN       ADR r0,ThunbProg + 1      BX  r0 ...
  • findaway123
  • findaway123
  • 2014年01月11日 21:38
  • 790

ARM的异常处理

ARM的异常处理 当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断指令的下条指令...
  • u010479322
  • u010479322
  • 2016年05月18日 20:42
  • 1459

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

首先,给出ARM的三级流水线结构图,这是后面分析的基础。上图中最左侧为指令的地址,根据三级流水线结构,当PC=0X3008是时,正在执行的的指令是地址为0X3000的这条指令。在分别讲解各种异常之前,...
  • Setul
  • Setul
  • 2017年01月03日 11:33
  • 1292
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ARM各种异常返回地址的计算
举报原因:
原因补充:

(最多只允许输入30个字)