如何计算分支指令的偏移/目标地址(`b`)

时间:2015-11-15 07:50:35

标签: assembly arm cortex-m3

我正在研究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 b950b指令的T4编码。然后我提取imm10imm11和其他基本参数,如手册中指定的SI1I2,形成一个位串,最后我做对此位串进行了带符号扩展,以获得32位立即偏移量。

在这种情况下,经过我的计算,我得到的立即偏移量是0x150,我知道,因为它是一个Thumb2(32位)指令,它应该乘以4 ---所以得到0x540;

但是,显然,当前pc值:0x1f002f60(0x1f002f5c + 0x4用于预取),加上0x540是0x1f0034a0 ---不是0x1f003200

我几乎整天都在努力...... 任何帮助将不胜感激......

0 个答案:

没有答案