ARM处理器如何判断何时从SPSR恢复CPSR?ARMv4T模拟疑问
ARMv4T(ARM7TDMI)异常返回的PC与CPSR同步恢复机制
核心逻辑:ARM7TDMI并不是“写PC就自动恢复CPSR”,而是仅当执行特定指令时才会同步恢复CPSR——这类指令是带
S后缀的数据处理指令,目标寄存器为PC(R15),且操作的是当前异常模式下的R14寄存器。异常发生时的硬件准备:
当触发异常(比如未定义指令、IRQ)时,硬件会自动完成两个操作:- 将当前CPSR的内容复制到对应异常模式的SPSR(比如SPSR_UND、SPSR_IRQ);
- 将调整后的返回地址(根据异常类型,比如未定义异常是当前PC+4)存入该模式的R14(比如R14_UND、R14_IRQ)。
异常返回指令的特殊行为:
当执行类似MOVS PC, R14_UND或SUBS PC, R14_IRQ, #4这类指令时,处理器会同时执行两个动作:- 将R14中的返回地址写入PC,实现跳转;
- 将当前异常模式的SPSR值复制回CPSR,恢复异常发生前的处理器状态(包括Thumb模式位T,因此不会出现PC解析错误的问题)。
处理器的判断依据:
硬件通过指令编码和当前运行模式来判断是否触发同步恢复:- 指令编码中
S位为1(表示带状态更新); - 目标寄存器
Rd为15(即PC); - 当前处于异常模式(此时才有对应的SPSR可恢复);
- 源寄存器是当前模式的R14。
这些判断都是硬件译码时直接完成的,效率极高,不需要对比PC值。
- 指令编码中
子程序调用不受影响的原因:
普通子程序调用(比如BL)返回时,用的是不带S后缀的指令(如MOV PC, R14)或分支指令(如BX R14),这些指令不满足上述条件,因此只会更新PC,不会触发CPSR的恢复操作,完全正常工作。
内容的提问来源于stack exchange,提问作者Papierkorb2292
相关产品推荐
相关产品推荐

