在ARM架构的中断处理过程中,PC(程序计数器)和LR(链接寄存器)的关系与流水线执行机制及异常类型密切相关。以下通过具体案例说明不同中断场景下两者的关系:
案例1:IRQ中断(PC已更新)
场景:
ARM状态下执行指令序列时发生IRQ中断:
0x4000: ADD R1, R2, R3 ; 指令A(执行中)
0x4004: SUB R4, R5, R6 ; 指令B(译码阶段)
0x4008: MOV R7, #8 ; 指令C(取指阶段,PC指向此处)
中断发生时的硬件行为:
-
指令A执行完毕后检测到IRQ中断。
-
PC已更新:硬件将PC指向下一条待取指指令的地址(0x400C)。
-
LR保存值:硬件自动将 PC - 4 = 0x4008 存入 LR_irq(指向指令C的地址)。
-
返回地址修正:
• 期望返回地址是 0x4004(指令B,未执行)。• 但 LR_irq = 0x4008,因此需通过 SUBS PC, LR, #4 修正为 0x4004。
关键关系:
• PC:中断时指向 0x400C(当前执行地址 0x4000 + 12)。
• LR:保存 PC - 4 = 0x4008,需软件修正偏移量(-4)。
案例2:SWI软中断(PC未更新)
场景:
执行软中断指令 SWI 0:
0x3000: SWI 0 ; 指令A(执行中,触发异常)
0x3004: MOV R0, #1 ;