assembly - 有人可以解释一下 ARM 中的分支操作码吗?

标签 assembly arm armv7 opcode

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

我查看了手册,我看到:

B<c> <label>

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

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

最佳答案

B是高达 +/-32MB 的相对分支。立即数编码目标地址相对于当前 PC 的有符号偏移量(即这条指令 + 8)——注意这个偏移量是按字数计算的,而不是字节数;由于指令总是字对齐的,任何偏移量的底部两位将始终为 00,因此在编码中是隐式的。
cond与大多数其他 ARM 指令中的谓词字段相同。如果您已经到了探索指令编码的地步,您可能应该已经意识到这一点 - ARM ARM 的“条件执行”部分(我手头的 v7A/R 版本中的 A8.3 部分)有完整的细节。

ARM ARM 的典型烦恼是,虽然在指令描述中描述了编码字段和它们所代表的值,但有时您确实必须交叉引用伪代码才能确切了解发生了什么。

关于assembly - 有人可以解释一下 ARM 中的分支操作码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29737035/

相关文章:

assembly - 在 x86 汇编中,有效地址中的寄存器算术如何编译为字节码?

delphi - FLD指令x64位

linux-kernel - 如何为 Linux Kernel Arm 交叉编译设置机器类型 (arch_id)

xcode - clang 中的 armv8 64 位架构支持

c++ - 函数调用时出现 C 到 C++ 错误

assembly - ARM 汇编,操作变量

assembly - 使用 TI 代码编写器工作室(用于 ARM)在 C 代码中进行内联汇编

iPhone - 为 armv7 构建的 OpenCV 库

iphone - MBProgressHUD armv7 错误

c - 汇编代码 fsqrt 和 fmul 指令