2011-07-19 34 views
1

我不明白與下面列出的反彙編代碼有關的分支指令(b和bl在地址0x00011004和0x00011010)的計算偏移量。我想知道在十六進制代碼中列出的偏移量似乎是0x000001和0x000002。條件b(EA)和bl(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模式指令只能在單詞邊界放置,沒有必要編碼的兩個低位的地址(他們將是0)。因此,B指令中的立即值是偏移了2位的增量。對於第一分支,增量是(目標 - PC)>> 2 目標是00011010和PC是00011004 + 8 = 0001100C。所以delta =(00011010-0001100C)>> 2 = 4 >> 2 = 1.你可以自己做第二個數學。

+0

記下8的偏移量。一個0xea000000將跳過一條指令。一個0xeaffffff將是一個nop,因爲它會跳轉到通常是下一條指令的地方。一個0xeafffffe將是單個分支指令的無限循環。 '偏移=(目標bra_addr-8)>> 2;' – Renate

1

由於ARM預取,8字節偏移量是恆定的。