Абсолютный скачок с относительным источником данных ПК (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