使用 PC 相关数据源的绝对跳转 (AArch64)

Ell*_*ink 1 assembly arm64

如何在AArch64 上使用尽可能少的指令执行绝对跳转(64 位双字),同时使用相对于程序计数器的数据源?

乍一看,人们可能会认为 aLDR后跟 a BR是可能的,即:

LDR x9, [PC, #0x8];
BR x9
.dword 0xBADC0FFEE0DDF00D
Run Code Online (Sandbox Code Playgroud)

但由于PC不再是AArch64上的通用寄存器,因此不是。

那么,如何用尽可能少的指令来做到这一点呢?

Jes*_*ter 5

您可以像往常一样依赖编译器生成的文字池:

LDR x9, =0xBADC0FFEE0DDF00D
BR x9
Run Code Online (Sandbox Code Playgroud)

这是可读的,并且基本上会生成相同的代码。

如果要精确控制,可以使用LDR literal版本,手册上说:

加载寄存器(文字)根据 PC 值和立即偏移量计算地址,从内存加载一个字,并将其写入寄存器。

因此,您可以这样做:

LDR x9, foo
BR x9
foo: .dword 0xBADC0FFEE0DDF00D
Run Code Online (Sandbox Code Playgroud)

或者可读性较差但没有标签:

LDR x9, .+8
BR x9
.dword 0xBADC0FFEE0DDF00D
Run Code Online (Sandbox Code Playgroud)