内联汇编中的内存偏移

时间:2015-04-23 14:26:26

标签: c memory assembly inline-assembly arm64

在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
*/

我想在内联汇编程序中使用“Offset - Immediate Offset”。

__asm__("ldp x8, x9, %0, 16 \n\t"
        :
        : "m" (*somePointer)
        : "x8", "x9");

这会转换为

ldp x8, x9, [x0], 16

我的目标是达到

ldp x8, x9, [x0, 16]

如何使用内联汇编程序编写此类指令?

1 个答案:

答案 0 :(得分:0)

我没有ARM 64位工具链来测试这个,但你应该可以这样做:

asm("ldp x8, x9, %0\n\t"
    :
    : "Ump" (*((__int128 *) somePointer + 1))
    : "x8", "x9");

Ump约束将内存操作数限制为整数LDP指令允许的操作数,否则它的作用类似于m约束。如果somePointer已经是指向128位类型的指针,则可以使用somePointer[1]作为操作数。

如果上述方法无效,那么David Wohlferd的建议应该是:

asm("ldp x8, x9, [%0, %1]" 
    : 
    : "r" (somePointer), "i"(16), "m" (*somePointer) 
    : "x8", "x9");