我不理解与以下反汇编代码相关的分支指令(地址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  .. á

最佳答案

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

关于visual-studio-2008 - 了解Arm装配工分支偏移计算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6744661/

10-11 22:47