【发布时间】:2016-10-26 19:21:18
【问题描述】:
我正在将 AArch64 程序集文件链接到 C/C++ 中的项目。 C/C++ 代码包含一个存储函数指针的变量。我需要调用这个函数(如果指针不为空),所以我的计划是把变量的地址加载到X1中,然后通过LDR X2, [X1]的方式将变量的值加载到X2中,然后通过BLR X2 调用函数。但是,我想不通:如何在X1中加载变量的地址?
下面是一个代码示例。在其中我需要将变量_funcPtr的64位地址加载到X1。
.syntax unified
.text
.global _funcPtr
.p2align 2
.global _myAsmFunc
.type _myAsmFunc, %function
_myAsmFunc:
@ Load the address of _funcPtr to X1 here
我正在使用 GNU / Clang 汇编器。
【问题讨论】:
-
ldr x1, =_funcPtr像往常一样吗? -
@Jester,你的意思是汇编程序应该扩展成真实指令的宏/伪指令吗?
-
是和否 :) 这确实是一条伪指令,但它会扩展为真正的
ldr和文字池条目。 -
@MichaelDorgan 不,它会生成一条 PC 相关的 LDR 指令来加载文字池中的 64 位值。如果要在不使用加载指令的情况下将 64 位地址加载到寄存器中,则需要使用 MOVL 伪指令。然而,它需要 4 条指令(1 条 MOVZ 和 3 条 MOVL),因此它的总大小要长 4 个字节,而且可能要慢得多。
-
我在想 ADRP xX, #label : ADD xY, xX, #imm。正如您所说,这当然是与 PC 相关的加载指令,并在较新的 CPU 上进一步优化。
标签: assembly arm constants arm64