了解Arm Assembler Branch Offset计算

时间:2011-07-19 09:01:13

标签: visual-studio-2008 arm

我不明白与下面列出的反汇编代码相关的分支指令(地址0x00011004和0x00011010处的b和bl)计算的偏移量。我想知道在十六进制代码列表中,偏移量似乎是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  .@-é
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  .@.è
0x00011018  00 00 a0 e1  .. á
0x0001101C  00 00 a0 e1  .. á

2 个答案:

答案 0 :(得分:6)

由于在ARM模式下,指令只能放在字边界上,因此不需要对地址的两个低位进行编码(它们将为0)。因此,B指令中的立即值是移位2位的delta。对于第一个分支, delta 是(目标 - PC )>> 2. 目标是00011010, PC 是00011004 + 8 = 0001100C。所以 delta =(00011010-0001100C)>> 2 = 4>> 2 = 1.你可以自己做第二个数学计算。

答案 1 :(得分:1)

由于ARM预取,8字节偏移量是恒定的。