1

ARM アーキテクチャでは、例外からの復帰は、私が知っている 2 つの方法で行うことができます (他にもあるかもしれません)。しかし、主なロジックは PC を変更することです。これにより、プロセッサのトリガーが CPSR で設定されたモードになります。

したがって、 pop {...,pc} は、スーパーバイザーまたは 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
4

1 に答える 1

4

ブランチの代わりにdo_IRQwithを呼び出したので、それは無関係にならないので、すでに上書きされています。さらに、ブランチを実行しただけでも、スタックが台無しになります (r0 から r12 をプッシュしますが、戻る前にそれらをポップすることはありません)。bllr

また、表示されているコードも例外から正しく返されないようです。ほとんどの場合、例外から戻ったときに、プログラム ステータス レジスタと、mov pc, lrが実行しない、または実行しないレジスタを復元する必要がありbx lrます。

さらに、に含まれるアドレスlrは実際には数ワード分オフセットされるため (例外の種類によって異なります)、とにかく正しい命令に戻ることはありません。IRQ については、1 ワードずれていると思います。

IRQ 例外から戻るための推奨される方法は、 CPSR も復元するという点で特別なsubs pc, lr, #4命令です (もちろん、事前にすべてのレジスタをポップした後) 。

于 2013-09-13T09:44:58.853 に答える