GCC内联汇编中的C数组?

exs*_*ape 2 assembly gcc x86-64 inline-assembly

我正在尝试在C/x86_64内联汇编中编写一个函数,但我没有太多运气.

我们可以把它归结为:

void f(const unsigned char *a, unsigned char *b, const unsigned char *c) {
    asm __volatile__ ("movdqa %0, %%xmm0" : : "m"(a) : "%xmm0");
}
Run Code Online (Sandbox Code Playgroud)

(顺便说一下,该函数被正确调用;我正在尝试替换C代码,当我使用现在注释掉的C代码时,它的工作正常.)

这崩溃了:

异常类型:EXC_BAD_ACCESS(SIGSEGV)
异常代码:0x000000000000000d,0x0000000000000000
崩溃的线程:0调度队列:com.apple.main-thread

我已经尝试了很多约束的组合,但(正如我所说),我运气不好.

目标是访问程序集中的所有三个函数参数; a只读,b读写和c只读.
如您所见,这三个都是C中的char数组; 然而,这两个ab16个字节长,每个寄存器可以存储在一个XMM(这是我的目标之一).
c是这样的变量的数组,因此每个变量也可以存储在XMM寄存器中.

另外,我应该指出,我更喜欢GCC没有将内容加载到寄存器中(因为它似乎与"x"约束相关),而是它留给了我.

如果有人可以为我编写约束(如果您愿意,请添加一个简短的解释),我真的很高兴.)

exs*_*ape 5

解决方案(在问题的评论中发布)是在传入asm块之前简单地取消引用指针.这样做可以使一切正常运作.

我只是将此作为答案发布,因为我无法将其标记为只回答问题的评论.(另外,我回答的有点迟了,因为我昨天不会让我失望,因为我的代表很低.)