Использование BX в коде Thumb для вызова функции Thumb или для перехода к инструкции Thumb в другой функции

Я пытаюсь освоить навыки, полезные для модификации прошивки (для которой у меня нет исходного кода) Эти вопросы касаются использования BX из кода большого пальца для перехода или вызова другого существующего кода большого пальца.

  1. Как использовать BX для перехода к существующему THUMB-коду прошивки из моего THUMB-кода.
  2. Как мне использовать BX для ВЫЗОВА существующей функции THUMB (сначала необходимо установить LR) из моего кода THUMB.

Насколько я понимаю, ЦП смотрит на бит 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

Вот то, чего я не понимаю:

  1. адрес в R2 не имеет установленного бита lsb ... поэтому не будет bx r2 переключить режим в режим охраны ??

  2. 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 ?

15
задан jww 10 July 2018 в 11:16
поделиться