Я пытаюсь изучить навыки, полезные в модемном программировании (для которого у меня нет исходного кода) Эти вопросы касаются использования BX из кода большого пальца для перехода или вызова другого существующего кода большого пальца.
- Как использовать BX для JUMP для существующего кода прошивки THUMB, из моего кода THUMB.
- Как использовать BX для вызова существующей функции THUMB (должен сначала установить LR), из моего кода THUMB.
Я понимаю, что процессор смотрит на бит lsb (бит 0), и я должен убедиться, что для него установлено значение 1
, чтобы сохранить состояние процессора в "состоянии большого пальца".
Поэтому я думаю, что мне нужно добавить ADD 1, чтобы установить бит lsb в 1.
Итак... скажем, я хочу просто JUMP до 0x24000 (в середине какого-то существующего кода THUMB)
LDR R6, =0x24000
ADD R6, #1 @ (set lsb to 1)
BX R6
Я думаю, что это правильно?
Теперь скажите, что я хочу ЗВОНОТЬ существующую функцию большого пальца, используя BX, и я хочу, чтобы она вернулась ко мне, поэтому мне нужно установить LR туда, где я хочу, чтобы она вернулась.
Давайте скажем, что функция, которую я хочу вызвать, равна 0x24000 Было предложено :
ldr r2, =0x24000
mov lr, pc
bx r2
Вот что я не понимаю:
-
адрес в R2 не имеет набора бит lsb... так что не будет
bx r2
переключить режим в режим ARM -
LR.. У ПК есть адрес (начало текущей инструкции, + 4), мне сказали. В обоих Thumb и Arm каждый адрес инструкции должен быть выровнен (16 бит или 32 бит), поэтому у него не будет бит LSB, установленный в 1. Только нечетные числа имеют бит lsb, равный 1.
Итак, в приведенном выше коде я устанавливаю LR на (PC), адрес, для которого не установлен бит lsb 1. Поэтому, когда вызываемая мной функция приходит к ней эпилогом и делает BX LR
,... uhmmm.. как это может работать, чтобы вернуться к моему коду THUMB? Мне что-то не хватает...
Обычно BL используется для вызова функций. В руководстве говорится, что инструкция BL устанавливает LR в следующую строку кода...
Значит ли это, что команда (обычно используется) BL
THUMB автоматически устанавливает LR в return addr + 1
?