Я работаю над семейством 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
является кодировкой T4 инструкции b
. Затем я извлекаю imm10
, imm11
и другие необходимые параметры, такие как S
, I1
, I2
, указанные в руководстве, для формирования строки битов, и, наконец, я делаю знаковое расширение этой строки битов, чтобы получить немедленное 32-битное смещение.
В этом случае, после моего расчета, немедленное смещение, которое я получил, равно 0x150, я знаю, поскольку это инструкция Thumb2 (32-битная), ее следует умножить на 4 --- так что получилось 0x540;
Но, очевидно, текущее значение pc
: 0x1f002f60 (0x1f002f5c + 0x4 для предварительной выборки), плюс 0x540 это 0x1f0034a0 --- не 0x1f003200
Я борюсь с этим почти целый день... буду признателен за любую помощь...