我不明白与下面列出的反汇编代码相关的分支指令(地址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 .. á
答案 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字节偏移量是恒定的。