ARM / Thumb код для патчей прошивки ... Как передать gcc ассемблер / компоновщик BL в абсолютный адрес? - PullRequest
2 голосов
/ 19 февраля 2012

Я пытаюсь написать мод прошивки (для существующих прошивок, для которых у меня нет исходного кода) Весь код Thumb.

Кто-нибудь знает, как это сделать,в gcc as (GAS) ассемблере: Используйте BL без необходимости вручную вычислять смещения, когда BL 'с какой-либо существующей функцией (не в моем коде .. но я знаю ее адрес)

В настоящее время, если я хочу использовать BL ... мне нужно: -войти обратно в мой код -избраться и добавить все байты, которые могут возникнуть в результате сборки всех предыдущих инструкций в функции, которую я пишу -к этому добавьте начальный адрес моей функции (я указываю начальный адрес того, что я пишу, в скрипте компоновщика), а затем вычтите адрес функции firmfunc, которую я хочу вызвать

Все это.... просто чтобы вычислить смещение ... чтобы иметь возможность написать bl смещение ... для вызова существующей функции прошивки?И если я изменю какой-либо код перед этим BL, мне придется делать все заново вручную!
См. , поэтому я хочу научиться использовать BX вправо ... вместоBL

Кроме того, я не совсем понимаю BX.Если я использую BX для перехода к абсолютному адресу, нужно ли мне увеличивать фактический адрес на 1 при вызове кода Thumb из кода Thumb (чтобы сохранить байт lsb 1) ... и процессор будет знать, что это код большого пальца?

Ответы [ 2 ]

3 голосов
/ 19 февраля 2012

БОЛЬШОЕ РЕДАКТИРОВАНИЕ:

Изменение ответа на основе того, что я недавно узнал, и лучшее понимание вопроса

Прежде всего, я не знаю, как сказать компоновщику сгенерировать 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 в качестве режима, но это не так.

0 голосов
/ 09 сентября 2013

Принятый ответ достигает желаемой цели, но для того, чтобы ответить на вопрос точно так, как его попросили, вы можете использовать директиву .equ, чтобы связать постоянное значение с символом, который затем можно использовать в качестве операнда для инструкций. При этом ассемблер синтезирует батут, если / когда это необходимо:

equ myFirmwareFunction, 0x12346570
.globl _start
        mov r0, #42
        b   myFirmwareFunction

, который генерирует следующую сборку [1]

01000000 <_start>:
 1000000:   e3a0002a    mov r0, #42 ; 0x2a
 1000004:   eaffffff    b   1000008 <__*ABS*0x12346570_veneer>

01000008 <__*ABS*0x12346570_veneer>:
__*ABS*0x12346570_veneer():
 1000008:   e51ff004    ldr pc, [pc, #-4]   ; 100000c <__*ABS*0x12346570_veneer+0x4>
 100000c:   12346570    data: #0x12345670

Если непосредственное значение достаточно близко к ПК, чтобы смещение поместилось в непосредственном поле, тогда вернер (трамплин) будет пропущен, и вы получите одну инструкцию перехода на указанный постоянный адрес.

[1] с использованием набора инструментов codesorcery (2009q1) с: arm-none-eabi-gcc -march=armv7-a -x assembler test.spp -o test.elf -Ttext=0x1000000 -nostdlib

...