【问题标题】:Understanding Arm Assembler Branch Offset Calculation了解 Arm Assembler 分支偏移量计算
【发布时间】:2011-07-19 09:01:13
【问题描述】:

我不明白为与下面列出的反汇编代码相关的分支指令(地址 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  .. á

【问题讨论】:

    标签: visual-studio-2008 arm


    【解决方案1】:

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

    【讨论】:

    • 注意偏移量 8。0xea000000 将跳过一条指令。 0xeaffffff 将是一个 nop,因为它将跳转到通常是下一条指令的位置。 0xeaffffffe 将是单个分支指令上的无限循环。 offset=(target-bra_addr-8)>>2;
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-08-24
      • 1970-01-01
      • 2021-10-14
      • 2018-04-13
      • 2011-04-01
      • 2015-03-15
      • 2023-01-08
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多