Это небольшая ошибка, написанная более чем одним способом. В документации на руку четко указано, что векторы - это адрес с установленным lsbit, поэтому можно думать плюс один, но безопаснее ИЛИ с одним.
Cortex-m3, если / когда вы его читаете, это armv7 -m и в документации по armv7-m, которую вы также должны иметь перед выполнением любого вида программирования, например:
При включении питания или сбросе процессор использует запись со смещением 0 в качестве начальное значение для SP_main, ... Все остальные записи должны иметь бит [0], установленный в 1
При записи исключения, если бит [0] связанной записи таблицы векторов установлен в 0, выполнение первой инструкции вызывает INVSTATE UsageFault
(да, это означает, что все векторы исключений не просто сбрасываются)
Пусть язык работает на вас, и вам не придется взломайте эти биты, инструменты сделают это за вас:
.thumb
.syntax unified
sp: .word 0x200
reset: .word start
.thumb_func
start:
mov r0, #5
mov r1, #4
add r2, r0, r1
stop: b stop
После связывания (таблица не может быть заполнена до тех пор, пока не будет связана, и компоновщик знает, что метка является функцией, поэтому генерирует правильное значение) .
Disassembly of section .text:
00000000 <sp>:
0: 00000200 andeq r0, r0, r0, lsl #4
00000004 <reset>:
4: 00000009 andeq r0, r0, r9
00000008 <start>:
8: f04f 0005 mov.w r0, #5
c: f04f 0104 mov.w r1, #4
10: eb00 0201 add.w r2, r0, r1
00000014 <stop>:
14: e7fe b.n 14 <stop>
И вы можете видеть, что таблица векторов правильна и будет работать, вектор сброса указывает на начало обработчика сброса: ORRed с 1 (0x00000008 | 1 = 0x00000009)