У меня есть небольшое приложение, которое хорошо компилируется и работает на моем 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?
Ответ: ARM использует его для переключения в режим THUMB.
Других решений пока нет …