当异常发生时(中断也是异常的一种):

1)ARM core (即CPU)拷贝当前状态的CPSR到对应异常模式下的SPSR,这步的目的是保护当前状态的CPSR(每种异常模式都对应一个自己的SPSR,以便将来在异常返回时,从SPSR恢复至CPSR)
2)这个时候CPU会自动设置适当的CPSR位:改变寄存器状态进入ARM态(注意Thumb态和ARM态由CPSR的T位来决定),反映在CPSR上就是将其T位置0;改变处理器模式进入相应的模式;如果需要的话还会设置中断禁止位禁止相应的中断。这些都是CPU自动完成的。
3)保存返回地址(注意保存的返回地址是异常发生前正在执行指令的下一条地址,即此时的为PC - 4)到对应异常模式下的LR寄存器。若不保存那么从异常模式返回后就不知道返回到哪里,这就像你自己出门要记住自己家里的地址一样。
4)设置PC为相应的异常向量,说白了就是让PC = 对应异常模式在异常向量表中的地址。因为PC为程序指针,指向程序运行的地方,原来指向哪里可能不知道但现在让其指向对应异常的地址就可以了。由于异常向量表存的是该异常的首地址只有四个字节,所以PC跳转到这里后还会继续跳转到真正的异常处理程序哪里去处理异常,处理完成后利用LR直接返回到原来模式下继续处理原来正在做的事。
5)当返回时从SPSR恢复CPSR和从LR恢复PC。

注意:以上说的CPU设计时提供的向量表一般称为一级向量表,有些CPU为了支持多种中断,还提供二级向量表。

12-05 11:54