【问题标题】:Can someone explain the branch opcode in ARM?有人可以解释ARM中的分支操作码吗?
【发布时间】:2015-04-19 23:17:32
【问题描述】:

我正在尝试创建一个操作码来跳转到一个地址。

我查看了手册,我看到了:

B<c> <label>

31 30 29 28 | 27 26 25 24 | 23 ................. 0
    cond      1  0  1  0          imm24

我不明白 condimm24 是什么。我将如何创建一个操作码以分支到某个地址,例如分支到0xbeffffbc

【问题讨论】:

    标签: assembly arm armv7 opcode


    【解决方案1】:

    B 是一个 relative 分支,最大可达 +/-32MB。立即数编码目标地址相对于当前 PC 的有符号偏移量(即这条指令 + 8)——注意这个偏移量是以 words 为单位计算的,而不是字节;由于指令始终是字对齐的,因此任何偏移量的低两位将始终为 00,因此在编码中是隐含的。

    cond 与大多数其他 ARM 指令中的谓词字段相同。如果您已经到了探索指令编码的地步,您可能应该已经意识到这一点 - ARM ARM 的“条件执行”部分(我方便的 v7A/R 版本中的 A8.3 部分)具有完整的详情。

    ARM ARM 的典型烦恼是,虽然编码字段和它们所代表的值在指令描述中进行了描述,但您有时必须交叉引用伪代码才能准确地弄清楚是什么继续。

    【讨论】:

    • 如果我的分支指令在地址 0xbeffffb0 并且我想跳转到 0xbeffffbc 那么它应该是分支 +3 吗?
    • 他说偏移量是按字数计算的。所以我认为这在我的例子中意味着:我依次有 0xbeffffb0、0xbeffffb4、0xbeffffb8、oxbeffffbc。而且我看到它是 3 个字吗?
    • @user2378481 在 0xbeffffb0 处,PC value 将是 0xbeffffb8,因此您实际上会在分支中编码 +1。如果您检查一些拆卸可能会变得更清楚 - 例如看到 a b 。无限循环将偏移量编码为 -2(有趣的是,与 x86 上的等效操作的偏移量相同,但原因完全不同)。
    【解决方案2】:

    在大多数架构上,imm 是一个立即数(在实际指令中编码)。因此,我假设 imm24 是一个 24 位长的立即数。这个imm 值通常是有符号的。

    大多数jmp 指令与当前Program Counter 相关。这意味着将编码到指令中的立即值添加到程序计数器,该计数器将指向下一条指令。如果imm 值为负,则将从当前程序计数器中减去该值。否则,imm 值将被添加到程序计数器中。

    要创建指向您的地址0xbeffffbc 的分支,您需要知道当前指令的地址并计算它们之间的差异。

    【讨论】:

      【解决方案3】:

      如果您的分支指令位于 0xb0 并且您想跳转到 0xbc,则编码指令的 imm24 部分的值为 3。

      您指令的 imm24 部分中的这个数字 3 告诉您 [指令数量] 您正在从当前位置移动到您想去的地方。

      imm24 编码 3 而不是 12 的原因(因为分支在 0xb0 而您希望在 0xbc 相差 12)是因为 imm24 中编码的偏移值是使用 PC 的值计算的寄存器,相对于地址分支的值在 (0xb0) 处,顺便说一下,它不是您想象的 0xb0,而是 0xb8。

      您的 PC 寄存器的值是指令地址分支之前的 2 条指令(由于流水线),因此您的分支指令的实际位置是 0xb8 而不是 0xb0。

      所以 ARM 指令的大小为 4 个字节,而您正在移动 3 条指令,因此 3 x 4 将给您 12 个 0xb0 到 0xbc 的差异。

      所以如果你想完全按照上面的方式格式化你的指令

      您将有一个操作码告诉处理器分支即将出现(特定值),然后是一个可选条件(cond 部分)告诉您它应该在什么条件下进行此分支,例如它是否小于或更多然后是上面解释的 imm24 部分,这将构成您的完整说明。

      【讨论】:

        【解决方案4】:

        查看 ARM 指令集,您正在搜索分支指令。您可以轻松创建标签并跳转到它们(跳转到代码中的特定位置),尽管我认为这不是您想要做的。

        如果你想跳转到一个内存地址,有很多方法可以做到这一点(寻址模式)。立即寻址,间接寻址,... 在这里您应该可以找到您正在搜索的说明:ARM branch instructions

        您应该真正了解寻址的工作原理。在进行汇编编程时,了解它的作用至关重要。

        您可以在此处了解不同寻址模式的工作原理: ARM addressing modes Summary of the different addressing modes

        基本上你需要知道你在内存中(不多或少于比特)。因此,必须就如何组织该记忆做出某些决定。某些部分或为特定事物保留。

        使用此内存,您可以轻松地构建堆栈,只需记住最顶层位置的地址(第一个空闲位置,即 SP(堆栈指针))。然后您可以使用相对于堆栈指针的地址。这也是他们实现procedure calls的方式。

        有关底层工作的信息: Working of the stack

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-05
          • 1970-01-01
          • 1970-01-01
          • 2010-10-07
          • 2013-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多