我正在研究Cortex M3系列,因此我参考了ARMv7 Thumb / Thumb-2指令。
我已经拆解了一个精灵图像并获得了以下片段:
Disassembly of section .text:
1f002f58 <Reset_IRQHandler>:
1f002f58: 4b01 ldr r3, [pc, #4] ; (1f002f60 <Reset_IRQHandler+0x8>)
1f002f5a: 469d mov sp, r3
1f002f5c: f000 b950 b.w 1f003200 <Reset_IRQHandler_C>
1f002f60: 20020000 andcs r0, r2, r0
1f002f64 <Setup_RC32M>:
1f002f64: b57f push {r0, r1, r2, r3, r4, r5, r6, lr}
...
...
1f003200 <Reset_IRQHandler_C>:
1f003200: 4829 ldr r0, [pc, #164] ; (1f0032a8 <Reset_IRQHandler_C+0xa8>)
1f003202: 4a2a ldr r2, [pc, #168] ; (1f0032ac <Reset_IRQHandler_C+0xac>)
1f003204: b510 push {r4, lr}
在Reset_IRQHandler
中,b.w
指令编码为f000 b950
,反汇编文本中b.w
的目标地址为0x1f003200 <Reset_IRQHandler_C>
。我想自己计算编码指令f000 b950
的目标地址,但无论如何我都无法得到结果--- 0x1f003200
...
我已经参考了 ARMv7-M架构参考手册,并且知道编码的f000 b950
是b
指令的T4编码。然后我提取imm10
,imm11
和其他基本参数,如手册中指定的S
,I1
,I2
,形成一个位串,最后我做对此位串进行了带符号扩展,以获得32位立即偏移量。
在这种情况下,经过我的计算,我得到的立即偏移量是0x150,我知道,因为它是一个Thumb2(32位)指令,它应该乘以4 ---所以得到0x540;
但是,显然,当前pc
值:0x1f002f60(0x1f002f5c + 0x4用于预取),加上0x540是0x1f0034a0 ---不是0x1f003200
我几乎整天都在努力...... 任何帮助将不胜感激......