在 A64 汇编器中,有不同的方法来指定地址。
/*
[base{,#0}] Simple register (exclusive) - Immediate Offset
[base{,#imm}] Offset - Immediate Offset
[base,Xm{,LSL #imm}] Offset - Register Offset
[base,Wm,(S|U)XTW {#imm}] Offset - Extended Register Offset
[base,#imm]! Pre-indexed - Immediate Offset
[base],#imm Post-indexed - Immediate Offset
label PC-relative (literal) load - Immediate Offset
*/
我想在内联汇编器中使用“偏移 - 立即偏移”。
__asm__("ldp x8, x9, %0, 16 \n\t"
:
: "m" (*somePointer)
: "x8", "x9");
这被翻译成
ldp x8, x9, [x0], 16
我的目标是达到
ldp x8, x9, [x0, 16]
如何使用内联汇编器编写此类指令?
我没有 ARM 64 位工具链来测试这个,但你应该能够执行如下操作:
asm("ldp x8, x9, %0\n\t"
:
: "Ump" (*((__int128 *) somePointer + 1))
: "x8", "x9");
The Ump
约束将内存操作数限制为整数 LDP 指令允许的操作数,否则它的工作方式类似于m
约束。如果somePointer
已经是一个指向 128 位类型的指针,您可以直接使用somePointer[1]
作为操作数。
如果上述方法不起作用,那么 David Wohlferd 的建议应该是:
asm("ldp x8, x9, [%0, %1]"
:
: "r" (somePointer), "i"(16), "m" (*somePointer)
: "x8", "x9");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)