Оптимизация ARM абсолютного скачка - PullRequest
1 голос
/ 28 февраля 2012

Я хотел бы выполнить следующую операцию в сборке ARM только с 24 байтами кода / данных.Возможно ли это?

ПК = [MEMLOC] + ПК

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

Значение, считываемое из MEMLOC, должно быть полным 32-битным словом

Я могу сделать это легко с 16 [<-обновлено от 32 до] байтов (используя стандартные инструкции LDR и ADD),но ищу оптимизировать одну инструкцию.Кто-нибудь знает, возможно ли это?Я думаю, что есть способы сделать с ~ 20-битным словом, прочитанным из памяти, но это может быть невозможно с полным 32-битным словом. </p>

Обновление: вот что у меня есть:

LDR R12, =MEMLOC1
ADD R12, PC, R12
LDR PC, [R12]

MEMLOC1: (contains 32-bit word)

1 Ответ

1 голос
/ 28 февраля 2012

Ваше решение на самом деле занимает 36 байтов, потому что первый ldr, вероятно, приводит к тому, что запись пула памяти, содержащая адрес MEMLOC1, будет сгенерирована в вашем тексте (если ваш компоновщик не достаточно умен, чтобы это исправить).

В 24 байтах вы можете сделать это, переместив свои данные ближе, чтобы вы могли сгенерировать относительный к ПК адрес.

  .text
_go:
  ldr r0, L_offset
  add pc, pc, r0
L_offset:
  .word 0x12345678

Смещение, возможно, должно быть минус несколько байтов, чтобы компенсировать увеличенный ПК.

...