在 ARM 架构中,可以通过两种我知道的方式从异常返回(可能还有其他方式)。但主要逻辑是修改PC,使处理器触发进入CPSR设置的模式。
所以 pop {...,pc} 会切换到说用户来自 supervisor 或 mov pc,lr 也会这样做。
我的问题是,BX lr 会切换吗?假设我正在处理 IRQ,并且我调用一个汇编例程说 do_IRQ,然后从 do_IRQ 返回是通过 BX LR。这会使我的故障处理程序中的 bl do_IRQ 之后的代码无关紧要吗?
irq_fault_handler:
push {lr}
push {ro-r12}
mrs r0, spsr
push {r0}
bl do_IRQ
pop {r0}
msr cpsr, r0
pop {r0,-r12}
pop {lr}
subs pc, lr, #4
do_IRQ:
...
BX LR