2

1 つの質問は、未定義の命令がいつ発生するかということです.R14_SVC または R14_UNDEF から現在実行中の命令を取得する必要がありますか? . 現在、未定義の命令が発生した 1 つの問題に取り組んでいます。R14_SVC を確認すると、命令は次のようになっていることがわかりました。

0x46BFD73C cmp r0, #0x0
0x46BFD740 beq 0x46BFD75C
0x46BFD744 ldr r0,0x46BFE358

したがって、私の仮定では、命令の実行中に未定義の命令が発生したでしょうbeq 0x46BFD75C

私を困惑させることの1つは、私がチェックしたr14_undefところ、構造が異なっていたことです.

0x46bfd4b8  bx r14
0x46bfd4bC  mov r0, 0x01
0x46bfd4c0  bx r14

未定義命令例外の原因となったのはどれですか?

4

1 に答える 1

3

すべての回答は、ARM ARM、ARM アーキテクチャ リファレンス マニュアルに記載されています。infocenter.arm.com のリファレンス マニュアルにアクセスして、関心のあるアーキテクチャ ファミリを見つけてください。非 Cortex-m シリーズはすべて、これらの例外を同じ方法で処理します。

When an Undefined Instruction exception occurs, the following actions are performed:
R14_und = address of next instruction after the Undefined instruction
SPSR_und = CPSR
CPSR[4:0] = 0b11011 /* Enter Undefined Instruction mode */
CPSR[5] = 0 /* Execute in ARM state */
            /* CPSR[6] is unchanged */
CPSR[7] = 1 /* Disable normal interrupts */
            /* CPSR[8] is unchanged */
CPSR[9] = CP15_reg1_EEbit
/* Endianness on exception entry */
if high vectors configured then
    PC = 0xFFFF0004
else
    PC = 0x00000004

R14_und は、未定義命令の後の次の命令を指します。R14_und から 2 または 4 を減算する必要があるかどうか、および 2 または 4 バイトをフェッチする必要があるかどうかを知るために、SPSR_und を調べて、プロセッサがどのモード (腕または親指) にあったかを判断する必要があります。残念ながら、thumb2 をサポートする新しいアーキテクチャの場合、thumb モードでも 4 バイトを取得して、何が起こったのかを突き止める必要があります。語長が可変であるため、何が起こったのかを判断できない状況になる可能性が非常に高くなります。thumb2 命令を使用していない場合は、決定論的です。

于 2012-07-12T13:58:22.147 に答える