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

У меня есть небольшое приложение, которое хорошо компилируется и работает на моем 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?

1 ответ

Решение

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

Другие вопросы по тегам