【问题标题】:decode ARM BL instruction解码 ARM BL 指令
【发布时间】:2017-02-07 00:28:42
【问题描述】:

我刚刚开始在我的 Nucleo STM32F303RE 上使用 ARM 架构,我正在尝试了解指令的编码方式。

我运行了一个简单的 LED 闪烁程序,前几个反汇编的应用程序指令是:

08000188:   push    {lr}
0800018a:   sub     sp, #12
235         __initialize_hardware_early ();
0800018c:   bl      0x80005b8 <__initialize_hardware_early>

这些说明在 hex 文件中解析为以下内容(在 Eclipse 中显示很奇怪——每个 32 位字都按 MSB 顺序排列,但 Eclipse 似乎不知道它……但这是另一个话题):

address 0x08000188:  B083B500 FA14F000

使用 ARM 架构参考手册,我已经确认了前 2 条指令,push (0xB500) 和 sub (0xB083)。但我无法理解“bl”指令。

十六进制指令为 0xFA14F000。参考手册说它是这样分解的:

31.28   27 26 25 24   23............0
cond     1  0  1  L   signed_immed_24

第一个“F”(0xF......)有意义:所有条件都已设置(总是)。

但“A”没有意义,因为应该设置 L 位 (1011)。不应该是0xFB吗……?

signed_immed_24 也没有任何意义。参考手册说:

- start with 0x14F000
- sign extend to 30 bits (signed 2's-complement), giving 0x0014F000
- shift left to form 32-bit value, giving 0x0053C000
- add to the PC, which is the current instruction + 8, giving 0x0800018c + 8 + 0x0053C000, or 0x0853C194.

所以我得到一个0x0853C194的分支地址,但是反汇编显示0x080005B8。

我错过了什么?

谢谢! -埃里克

【问题讨论】:

    标签: arm disassembly opcode thumb


    【解决方案1】:

    bl 是两条独立的 16 位指令。 armv5(及更早版本)ARM ARM 在记录它们方面做得更好。

    111HHoffset11
    

    来自 ARM ARM

    第一条 Thumb 指令的 H == 10 并提供 分支偏移量。该指令为子程序调用设置 并且在 BL 和 BLX 表单之间共享。

    第二条 Thumb 指令的 H == 11(对于 BL)或 H == 01(对于 BLX)。它提供分支偏移的低部分并导致 子程序调用发生。

    0xFA14 0xF000

    0xF000 是第一条指令的上偏移量为零 0xFA14是第二条指令偏移量是0x214

    如果从 0x0800018c 开始,则为 0x0800018C + 4 + (0x0000214

    我猜 armv7-m ARM ARM 也涵盖了它,但更难阅读,并且显然添加了一些功能。但它们不会通过此分支链接影响您。

    ARMv5 ARM ARM 也更好地描述了发生的情况。您当然可以将这两个单独的说明分开

    .byte 0x00,0xF0
    nop
    nop
    nop
    nop
    nop
    .byte 0x14,0xFA
    

    它会跳转到相同的偏移量(相对于第二条指令)。也许在某些内核中出现了问题,但我知道在某些内核中(在 armv5 之后)它可以工作。

    【讨论】:

    • 啊,你缺少的是 STM32 是一个 cortex-m,它是一个仅限拇指的机器(支持 thumb2 扩展,具体取决于架构),你试图使用 32 位 ARM 指令来解码BL。
    • 好的,谢谢!我想知道为什么似乎混合了 16 位和 32 位指令。只是想我还没有遇到过相关文档。到目前为止,我不记得在任何地方看到 STM32 仅支持拇指......
    • 它在某处会说它是基于 cortex-m 的,并且是 armv6m 或 armv7m(最后一个 m 也表示 cortex-m)然后从架构参考手册中澄清这些是仅限拇指的核心(添加了 thumb2 扩展,基本上是可变长度指令,一些一个半字一些两个)。 bl 指令从拇指 ARMV7T(T 指示拇指)的第一天起就已经存在,但这些内核中的所有内容都是 16 位指令,并且它们进一步一对一映射到 arm 指令(显然解码器只是转换为 arm 指令和喂它)。
    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多