【发布时间】: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