2011-07-19 12 views
1

以下に示す逆アセンブルされたコードに関連する分岐命令(アドレス0x00011004および0x00011010のbおよびbl)について計算されたオフセットがわかりません。私は、16進コードのリストでオフセットが0x000001と0x000002のように見えると思っています。条件b(EA)とb1(EB)のオペコードは、私が期待したものでした。事前にすべてのヒントのアームアセンブラ分岐のオフセット計算の理解

おかげ

MyAssemblerFunc: 
00011000 stmdb  sp!, {r0 - r3, lr} 
00011004 b   00011010 
00011008 mov   r0, r0 
0001100C mov   r0, r0 
00011010 bl   |PrintHelloWorld (11020h)| 
00011014 ldmia  sp!, {r0 - r3, lr} 

関連進コード

0x00011000 0f 40 2d e9 [email protected]é 
0x00011004 01 00 00 ea ...ê 
0x00011008 00 00 a0 e1 .. á 
0x0001100C 00 00 a0 e1 .. á 
0x00011010 02 00 00 eb ...ë 
0x00011014 0f 40 bd e8 [email protected]è 
0x00011018 00 00 a0 e1 .. á 
0x0001101C 00 00 a0 e1 .. á 

答えて

5

ARMモード命令のみがワード境界に配置することができますので、2つの低ビットを符号化する必要はありません(0になります)。従って、B命令の即値は、2ビットだけシフトされたデルタである。最初の分岐の場合は、デルタがある(ターゲット - PC)>> 2. ターゲットは00011010とPCは、00011004 + 8 = 0001100Cです。したがってデルタ =(00011010-0001100C)>> 2 = 4 >> 2 = 1. 2番目の計算は自分で行うことができます。

+0

オフセット8に注意してください。0xea000000は1つの命令をスキップします。通常は次の命令にジャンプするので、0xeaffffffはnopになります。 0xeafffffeは単一分岐命令に対する無限ループになります。 'offset =(target-bra_addr-8)>> 2;' – Renate

1

8バイトオフセットは、ARMプリフェッチによって一定です。