Абсолютный скачок с относительным источником данных ПК (AArch64)

Как можно выполнить абсолютный переход (64-битное слово) на AArch64, используя как можно меньше инструкций, используя источник данных относительно счетчика программы?

На первый взгляд можно предположить LDR с последующим BR возможно, т.е.

LDR x9, [PC, #0x8];
BR x9
.dword 0xBADC0FFEE0DDF00D

Но с тех пор PC больше не является регистром общего назначения на AArch64, это не так.

Так как же это сделать, используя как можно меньше инструкций?

1 ответ

Решение

Вы можете положиться на сгенерированные компилятором литеральные пулы как обычно:

LDR x9, =0xBADC0FFEE0DDF00D
BR x9

Это читабельно и по сути генерирует тот же код.

Если вы хотите иметь точный контроль, вы можете использовать LDR literal В версии руководства написано:

Load Register (литерал) вычисляет адрес из значения ПК и немедленного смещения, загружает слово из памяти и записывает его в регистр.

Как таковой вы можете сделать:

LDR x9, foo
BR x9
foo: .dword 0xBADC0FFEE0DDF00D

Или менее читаемый, но без метки:

LDR x9, .+8
BR x9
.dword 0xBADC0FFEE0DDF00D
Другие вопросы по тегам