ARM的异常模式是由异常事件引起的。ARM在进入相应的模式前要把PC值保存到LR中,但是这个PC值并不是一定是程序放回时的地址值,有的情况有偏移量。
BL调用时,可以直接返回;
SWI :可以直接返回LR;
位定义指令:可以直接返回LR;
预取指中止:返回值LR-4
快速中断: 返回值LR-4
IRQ中断:返回值LR-4
数据中止:放回值LR-8
ARM7是3级流水线作业,取指,译码,执行。。。所以每次在执行指令时,当前的PC是取指的PC,即PC比当前执行代码时的PC值要多8个地址。。。。。
ARM在执行跳转后(PC的值是没有按顺序执行),预取的指令会被丢弃的。
如果我们用BL来调用其他指令段,pc的值一直被+4,当指令执行到BL LABEL时,PC的值应该是这条语句当前的PC+8,即是该语句后第2条语句处的地址。要跳转,先要把当前的PC值保存到LR中。再改变PC的值,使其转到标号LABEL处执行,先前的预取指令被丢弃,重新开始预取。当调用的程序段执行完后(现在还不知道怎么判断调用的程序结束,好像是没有相关的伪指令,可能是根据下一个标号来判断),返回时把LR的值(或-4,或-8,不同异常不同)再赋给PC,返回到调用前的下调指令执行。
安装上面的分析,应该是不能够返回到下条指令的。。。。。。。。。PC值是被加8,但是为什么不同情况保存PC到LR时,好像根本不是保存当前PC+8的值,不知道ARM到底是怎么处理的????好多的书本都介绍的不详细,希望各位大侠能给点指导!!! |