先来说说arm指令的处理过程:
pc寄存器保存的总是当前正在取指的指令的地址。
如果有如下指令序列S1,S2,S3,S4,S5这五条指令在内存中分布为:
PC寄存器保存的总是当前正在取址的指令的地址,arm态下指令长度为4个字节,如图所示当前正在执行的指令为pc-8即pc的值为当前正在执行的指令加8
同理在arm9五级流水的情况下:
了解一下pc与arm处理指令的过程有利于我们理解异常处理进入时lr保存的pc值 与函数返回时所要执行的指令之间的关系。
在异常发生时常常要保存当前指令地址,即pc保存到lr中。以用来异常处理完毕的返回。
要清楚返回地址,我们必须弄清楚三点:
1.该种异常或者程序跳转发生在什么时候?
2.异常发生时pc的值是否更新
3.异常返回时要接着执行的指令是哪一条?
接着我们来看看各种异常发生后 进入处理函数 处理完毕如何返回
返回包含如下两个操作:
1.将SPSR_mode复制给CPSR
2.返回到异常发生处所要执行的下一条指令 之所以这么说是因为可能返回的时候进行取指操作的第一条指令还是那条触发异常发生的指令 或者触发异常发生的指令的下一条指令 而非仅仅是将lr赋给pc
在谈异常返回pc的值与lr_mode之间的换算关系前 先看看两个跳转指令B 和 BL
还有一点我们要清楚的是PC总是指向当前正在执行的指令的下两条指令 即pc指向的是当前正在取址的指令
对比一下两个代码: