БОЛЬШОЕ РЕДАКТИРОВАНИЕ:
Изменение ответа на основе того, что я недавно узнал, и лучшее понимание вопроса
Прежде всего, я не знаю, как сказать компоновщику сгенерировать bl для адреса, который является жестко закодированным адресом, а не фактически в этом коде. Вы можете попытаться создать файл эльфа, который имеет метки и тому подобное, но не содержит кода или не содержит кода, не знаю, обманет ли это компоновщик или нет. Вам также придется изменить скрипт компоновщика. не стоит.
ваш другой вопрос, который возник из этого вопроса:
Arm / Thumb: использование BX в коде Thumb для вызова функции Thumb или для перехода к инструкции Thumb в другой функции
Для ветвления это прекрасно работает:
LDR R6, =0x24000
ADD R6, #1 @ (set lsb to 1)
BX R6
или сохраните инструкцию и просто сделайте это
LDR R6, =0x24001
BX R6
если вы хотите перейти по ссылке, и вы знаете адрес, находитесь в режиме большого пальца и хотите получить код большого пальца, тогда
ldr r6,=0x24001
bl thumb_trampoline
;@returns here
...
.thumb_func
thumb_trampoline:
bx r6
И почти то же самое, если вы начинаете в режиме охраны и хотите получить большой код по адресу, который вы уже знаете.
ldr r6,=0x24001
bl arm_trampoline
;@returns here
...
arm_trampoline:
bx r6
Вы должны знать, что таким образом вы можете удалить r6 (убедитесь, что r6 не сохраняет некоторое значение, используемое некоторым кодом, который вызвал этот код).
Очень жаль вводить вас в заблуждение другим ответом, я могу поклясться, что mov lr, pc вытащил lsbit в качестве режима, но это не так.