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

Assembly 使用PC相对数据源的绝对跳转(AArch64),assembly,arm64,Assembly,Arm64,在使用与程序计数器相关的数据源时,如何使用尽可能少的指令在AArch64上执行绝对跳转(64位dword) 乍一看,人们可能会假设一个LDR后接一个BR是可能的,即: LDR x9, [PC, #0x8]; BR x9 .dword 0xBADC0FFEE0DDF00D 但由于PC在AArch64上不再是通用寄存器,因此它不是 那么,如何使用尽可能少的指令来实现这一点呢?您可以像往常一样依赖编译器生成的文本池: LDR x9, =0xBADC0FFEE0DDF00D BR x9 这是可读的,

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

乍一看,人们可能会假设一个
LDR
后接一个
BR
是可能的,即:

LDR x9, [PC, #0x8];
BR x9
.dword 0xBADC0FFEE0DDF00D
但由于PC在AArch64上不再是通用寄存器,因此它不是


那么,如何使用尽可能少的指令来实现这一点呢?

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

LDR x9, =0xBADC0FFEE0DDF00D
BR x9
这是可读的,基本上会生成相同的代码

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

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

因此,您可以:

LDR x9, foo
BR x9
foo: .dword 0xBADC0FFEE0DDF00D
或可读性较差但无标签:

LDR x9, .+8
BR x9
.dword 0xBADC0FFEE0DDF00D

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

LDR x9, =0xBADC0FFEE0DDF00D
BR x9
这是可读的,基本上会生成相同的代码

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

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

因此,您可以:

LDR x9, foo
BR x9
foo: .dword 0xBADC0FFEE0DDF00D
或可读性较差但无标签:

LDR x9, .+8
BR x9
.dword 0xBADC0FFEE0DDF00D

如果您阅读文档,它告诉您这是一个pc相对负载,pc只是没有编码在指令中,它隐含在这个指令集中。我明白了,这就是为什么我感到困惑。谢谢你的澄清!“加载寄存器(文字)根据PC值和立即偏移量计算地址,从内存加载一个字,并将其写入寄存器。”如果您阅读文档,它告诉您这是一个PC相对加载,PC只是没有编码在指令中,而是隐含在该指令集中。我明白了,这就是我感到困惑的原因。谢谢你的澄清!加载寄存器(文字)根据PC值和立即偏移量计算地址,从内存加载一个字,并将其写入寄存器