解码ARM BL指令

时间:2017-02-07 00:28:43

标签: arm disassembly opcode thumb

我刚刚在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似乎不知道它......但这是另一个主题):< / p>

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 ......)有意义:所有条件都已设置(ALWAY)。

“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。

我错过了什么?

谢谢! -Eric

1 个答案:

答案 0 :(得分:3)

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&lt;&lt; 1)= 0x080005B8。 4是当前PC的两个指令头。偏移量是(16位)指令的单位。

我想armv7-m ARM ARM也可以覆盖它,但是更难以阅读,并且显然增加了功能。但是这些分支链接不会对您产生影响。

ARMv5 ARM ARM可以更好地描述发生的情况。你可以认真地采取这两个单独的指示并将它们分开

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

它将分支到相同的偏移量(相对于第二条指令)。也许在一些核心中破坏了,但我知道在某些(在armv5之后)它有效。