Я пытаюсь освоить навыки, полезные для модификации прошивки (для которой у меня нет исходного кода) Эти вопросы касаются использования BX из кода большого пальца для перехода или вызова другого существующего кода большого пальца.
Насколько я понимаю, ЦП смотрит на бит LSB (бит 0), и я должен убедиться, что он установлен в 1
, чтобы сохранить состояние ЦП в «состояние большого пальца».
Итак, я думаю, мне нужно ДОБАВИТЬ 1, чтобы установить бит lsb в 1.
Итак ... скажем, я хочу просто ПЕРЕЙТИ на 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
переключить режим в режим охраны ??
LR .. Мне сказали, что у ПК есть адрес (начало текущей инструкции, +4). И в Thumb, и в Arm любой адрес инструкции должен быть выровнен (16 или 32 бит), чтобы бит LSB не был установлен в 1. Только нечетные числа имеют бит lsb, установленный в 1.
Так что в код выше, я устанавливаю LR на (ПК), адрес, для которого также НЕ установлен lsb-бит 1. Итак, когда функция, которую я вызвал, подходит к своему эпилогу и выполняет BX LR
, ... ммммм ..как это может работать, чтобы вернуться к моему коду THUMB? Я, должно быть, что-то упускаю ...
Обычно BL используется для вызова функций. В руководстве сказано, что инструкция BL устанавливает LR на следующую строку кода ...
Значит ли это, что (обычно используемая) инструкция BL
THUMB автоматически устанавливает LR на return addr + 1
?