.thumb
.global _start
_start:
.word 0x20001000
.word one
.word two
.align
.thumb_func
one:
b .
two:
b .
arm-none-eabi-as so.s -o so.o
arm-none-eabi-ld -Ttext=0x08000000 so.o -o so.elf
arm-none-eabi-objdump -D so.elf
so.elf: file format elf32-littlearm
Disassembly of section .text:
08000000 <_start>:
8000000: 20001000 andcs r1, r0, r0
8000004: 0800000d stmdaeq r0, {r0, r2, r3}
8000008: 0800000e stmdaeq r0, {r1, r2, r3}
0800000c <one>:
800000c: e7fe b.n 800000c <one>
0800000e <two>:
800000e: e7fe b.n 800000e <two>
Во-первых, _start не требуется, вы получите предупреждение, просто вставить его туда.
Вам необходимо объявить метку как функцию, есть несколько способов сделать это в гну ассемблере. .thumb_fun c легко, ему не обязательно быть строкой перед тем, как вы можете иметь другие вещи между .thumb_fun c и меткой, но следующая метка помечена как функция.
Вы увидите выходные данные компилятора делают что-то вроде этого (используйте -save-temps или -S, чтобы увидеть выходные данные компилятора), есть другой способ объявить функцию в газе, для полноразмерной руки есть другой, который вы должны использовать.
Вы можете видеть, что при правильном объявлении инструменты заботятся о вас и обращаются к lsbit адреса в таблице векторов, когда вы не объявляете его правильно, тогда вы получаете неправильный адрес в таблице векторов, который не будет работать.
И как ответили минимум, две записи только потому, что вам нужно что-то иметь по смещению / адресу 4. Обратите внимание, что 0x08000000 отображается на 0x00000000 при загрузке на этих платформах STM32. Минимум - это вектор сброса, если вам не нужны другие, но, находясь со смещением, вы должны заполнить первые четыре байта. Можно также поместить туда начальное значение указателя стека и тот же код, который позже настроит его.
В таблице векторов нет ничего по-настоящему волшебного, это просто адресное пространство, которое вы можете делать как для выборок, так и для данных. циклы.
Два - минимум, но если вы в конечном итоге столкнетесь с ошибкой выравнивания или другой ошибкой, то он попытается найти там вектор, если четное число будет проблемой, если нечетное, то попробуйте выполнить с этого адреса (lsbit удален, p c не имеет нечетного числа в нем, это просто механизм, показывающий большой палец против руки). Таким образом, хотя технически один вектор, сброс - это минимум, вероятно, это хорошая идея, чтобы охватить первые 16 (15) на всякий случай.
.thumb
.global _start
_start:
.word 0x20001000
.word reset
.word loop
.word loop
.word loop
.word loop
.word loop
.word loop
.word loop
.word loop
.word loop
.word loop
.word loop
.word loop
.word loop
.word loop
.thumb_func
reset:
b .
.thumb_func
loop:
b .
Хотя вы можете смешивать код и векторы, если в итоге вы используете прерывание обработчик для периферийного устройства, то вы, вероятно, хотите не связываться с микшированием кода между исключениями и там, где находится ваш вектор обработчика прерываний. Если вы действительно отчаянно нуждаетесь в кодовом пространстве во флаге sh, то технически вы можете ...
Насколько ответом будет минимальный ответ P__J __. Добавил этот ответ, чтобы покрыть вопрос lsbit.