ARM7 响应异常处理时的断点返回地址计算

来源:互联网 发布:房地产开发与管理 知乎 编辑:程序博客网 时间:2024/05/17 22:33

ARM处理器对异常的响应过程可用伪代码描述如下:

 

R14_<exception_mode>=return link
SPSR_<exception_mode>=CPSR
CPSR[4:0]=exception mode number
CPSR[5]=0 /* 当运行于ARM状态时 */
if <exception_mode> == Reset or FIQ then
CPSR[6]=1 /* 禁止新的FIQ中断 */
CPSR[7]=1 /* 禁止新的IRQ中断 */
PC = exception vector address

 

注意:异常发生时异常模式R14的定义是PC-4。

 

 

 

 

IRQ、FIQ和ABT(指令预取)异常中断处理程序的返回
发生IRQ或者FIQ异常中断时,指令已经执行完毕,PC指向当前指令后面的第3条指令。因此IRQ或者FIQ的异常中断发生时,处理器将程序计数器的计算值(PC-4)保存到LR_IRQ或者LR_FIQ寄存器中。这时LR_IRQ或者LR_FIQ寄存器的值指向当前指令后的第2条指令。

在指令预取时如果目标地址是非法的,该指令将被标记成有问题的指令,处理器产生指令预取ABT异常。此刻PC的值还没有更新,它指向当前指令后的第2条指令。指令预取ABT异常中断发生时,处理器将程序计数器的计算值(PC-4)保存到异常模式LR_ABT。这时LR_ABT寄存器的值指向当前指令后的第1条指令。

当IRQ、FIQ和ABT(指令预取)异常中断处理程序退出时,前两种情况下应该执行断点的下一条指令,后一种情况下程序应该返回到有问题的指令处(即断点指令),重新读取并执行。无论上述三种情况的那一种,返回操作都应该通过SUBS PC, LR, #4指令实现。该指令将寄存器LR中的值复制到程序计数器PC中,实现程序返回,同时将SPSR_SVC或者SPSR_UND寄存器的内容复制到CPSR中。

 

原创粉丝点击