内联汇编内存偏移 [英] Memory offsets in inline assembly

查看:405
本文介绍了内联汇编内存偏移的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在A64汇编程序,有不同的方式来指定地址。

In A64 assembler, there are different ways to specify addresses.

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


我想用偏移 - 即时偏移中的内联汇编


I would like to use "Offset - Immediate Offset" in inline assembler.

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

本被翻译成

ldp x8, x9, [x0], 16

我的目标是要达到

My goal is to reach

ldp x8, x9, [x0, 16]

我怎么能写与内联汇编这样的指令?

推荐答案

我没有一个ARM 64位的工具链来进行测试,但你应该能够做这样的事:

I don't have an ARM 64-bit toolchain to test this with, but you should be able to do something like this:

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

UMP 约束限制了存储器的操作数那些由整数自民党指令允许的,否则它的工作方式类似于 M 约束。如果 somePointer 已经是一个指针,你可以使用 somePointer [1] 作为操作数128位的类型。

The Ump constraint limits the memory operand to those permitted by the integer LDP instruction, otherwise it works like the m constraint. If somePointer is already a pointer to a 128-bit type you can just use somePointer[1] as the operand.

如果以上不工作,那么大卫Wohlferd的建议应该:

If the above doesn't work then David Wohlferd's suggestion should:

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

这篇关于内联汇编内存偏移的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆