带PC相对数据源的绝对跳转(AArch64)
Absolute jump with a PC relative data source (AArch64)
如何使用尽可能少的指令在 AArch64 上执行绝对跳转(64 位双字),同时使用与程序计数器相关的数据源?
乍一看,可能会假设 LDR
后接 BR
是可能的,即:
LDR x9, [PC, #0x8];
BR x9
.dword 0xBADC0FFEE0DDF00D
但由于 PC
不再是 AArch64 上的通用寄存器,所以它不是。
那么如何用尽可能少的指令来完成呢?
您可以照常依赖编译器生成的文字池:
LDR x9, =0xBADC0FFEE0DDF00D
BR x9
这是可读的,基本上会生成相同的代码。
如果想要精确控制,可以使用LDR literal
版本,说明书上说:
Load Register (literal) calculates an address from the PC value and an immediate offset, loads a word from memory, and writes it to a register.
因此你可以这样做:
LDR x9, foo
BR x9
foo: .dword 0xBADC0FFEE0DDF00D
或可读性较差但没有标签:
LDR x9, .+8
BR x9
.dword 0xBADC0FFEE0DDF00D
如何使用尽可能少的指令在 AArch64 上执行绝对跳转(64 位双字),同时使用与程序计数器相关的数据源?
乍一看,可能会假设 LDR
后接 BR
是可能的,即:
LDR x9, [PC, #0x8];
BR x9
.dword 0xBADC0FFEE0DDF00D
但由于 PC
不再是 AArch64 上的通用寄存器,所以它不是。
那么如何用尽可能少的指令来完成呢?
您可以照常依赖编译器生成的文字池:
LDR x9, =0xBADC0FFEE0DDF00D
BR x9
这是可读的,基本上会生成相同的代码。
如果想要精确控制,可以使用LDR literal
版本,说明书上说:
Load Register (literal) calculates an address from the PC value and an immediate offset, loads a word from memory, and writes it to a register.
因此你可以这样做:
LDR x9, foo
BR x9
foo: .dword 0xBADC0FFEE0DDF00D
或可读性较差但没有标签:
LDR x9, .+8
BR x9
.dword 0xBADC0FFEE0DDF00D