gpt4 book ai didi

android - BX LR 和 ARM 从异常指令返回(RFE 和 ERET)

转载 作者:行者123 更新时间:2023-11-29 16:05:38 24 4
gpt4 key购买 nike

在 ARM 体系结构中,可以通过两种我知道的方式从异常中返回(可能还有其他方式)。但主要逻辑是修改PC,使处理器触发到CPSR设置的模式。

所以 pop {...,pc} 会切换为 user from supervisor或者 mov pc,lr 会做同样的事情。

我的问题是,BX lr 会做出转换吗?假设我正在处理 IRQ,我调用一个汇编例程说 do_IRQ,然后通过 BX LR 从 do_IRQ 返回。这会使我的故障处理程序中 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

最佳答案

这并没有使它变得无关紧要,因为您使用 bl 而不是只是一个分支调用了 do_IRQ,所以您已经覆盖了 lr。此外,即使您只是做了一个分支,您的堆栈也会被弄乱(您压入 r0-r12 但在返回之前从不弹出它们)。

此外,您显示的代码似乎也没有从异常中正确返回。大多数时候,当您从异常中返回时,您想要恢复程序状态寄存器以及 mov pc, lrbx lr 都不会的寄存器

此外,lr 中包含的地址实际上会偏移几个字(根据异常类型而有所不同),因此您无论如何都不会返回到正确的指令。对于 IRQ,我认为它差了 1 个字。

从 IRQ 异常返回的推荐方法是 subs pc, lr, #4 指令(当然是在你事先弹出所有寄存器之后)which is special in that it also restores the CPSR .

关于android - BX LR 和 ARM 从异常指令返回(RFE 和 ERET),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18780935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com