таблица вектора руки, указывающая один байт после

У меня есть небольшое приложение, которое хорошо компилируется и работает на моем ARM Cortex M4. Но когда я разбираю двоичный файл, который я сбрасываю, вот как выглядят первые байты:

00000000 <.data>:
0:   20020000        andcs   r0, r2, r0
4:   080003b5        stmdaeq r0, {r0, r2, r4, r5, r7, r8, r9}
8:   08000345        stmdaeq r0, {r0, r2, r6, r8, r9}
c:   08000351        stmdaeq r0, {r0, r4, r6, r8, r9}

080003b5 должен быть адресом обработчика сброса (у меня там есть .word Reset_Handler), но разборка ELF показывает, что обработчик сброса фактически находится в 080003b4, что составляет 1 байт раньше:

080003b4 <Reset_Handler>:
80003b4:  2100        movs    r1, #0
80003b6:  e003        b.n 80003c0 <InitData>

(Он работает в режиме THUMB, у меня есть 2-байтовые инструкции).

Даже если я разбираю двоичный файл, он находится по адресу 080003b4:

000003b4 <.data+0x3b4>:
3b4:   2100            movs    r1, #0
3b6:   e003            b.n     0x3c0

Мой вопрос: почему он указывает 1 байт после? Этот код удивительно работает на реальной плате. Даже без разборки, не должны ли инструкции быть выровнены на 2 байта? как адрес может быть 0x000003b5?

0

Решение

Ответ: ARM использует его для переключения в режим THUMB.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]