首先我们应该明白ARM采取的是指令三级流水线技术,取址,译址,执行,所以当前的PC都是指向当前执行指令+8,我们进中断的时候统一的PC-4
Arm发生异常时,进入异常处理程序,当异常处理完后,设置PC返回,但各种模式返回的方法却又区别
1.SWI和UNDEF异常(即软件中断) PC值未更新
这种情况下我们使用:
MOVS PC,LR
通常这种中断是由当前执行的指令所引起的,当中断发生的时候,PC指向当前指令后面的第二条语句,那么这种情况下,我们应当把PC-4的值保存到LR寄存器,所以当返回的时候我们直接将LR送至PC即可!
2.IRQ,FIQ和预取中止返回终止
SUBS PC,LR,#4;
所谓的预取中止返回是指当预取指令时,如果目标地址是非法的,那么该指令被标记为"有问题"指令,而PC继续向下取指令,而当前指令依然执行直到有问题的指令,此时PC值未更新!那么这是中断异常就发生了,进入中断处理程序,然后返回到该有问题的指令处重新执行该命令,那么我们来看,当异常发生的时候,我们是把PC-4的值保存到LR,而我们要返回的是PC-8的位置,所以此时返回时应该再减4
虽然FIQ跟IRQ都是-4,但是概念确实不同的,对于FIQ跟IRQ,当每条指令执行完成后,PC值更新!!,指向当前+12处此时CPU将查询IRQ跟FIQ引脚,若引脚有效并且无屏蔽则进入中断处理,然后返回下一条指令,所以是-4
3.数据访问异常中断 PC值已经更新!!!!
该中断也是由于当前执行指令产生,发生该中断时,要返回到发生中断的指令重新执行指令,而此时的PC已经指向当前的指令+8处,所以当我们返回的时候要在-4的基础上再-8