GCC内联汇编中的C数组?

时间:2011-08-15 15:37:01

标签: gcc assembly 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");
}

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

崩溃了:

异常类型:EXC_BAD_ACCESS(SIGSEGV)
例外代码:0x000000000000000d,0x0000000000000000
Crashed Thread:0 Dispatch queue:com.apple.main-thread

我已经尝试了很多限制组合,但(正如我所说),我没有太多运气。

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

另外,我应该指出,如果GCC没有将内容加载到寄存器中(因为它似乎与“x”约束相关),我更愿意,而是将它留给我。

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

1 个答案:

答案 0 :(得分:5)

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

我只是将此作为答案发布,因为我无法将其标记为仅回答问题的评论。 (另外,我回答的有点晚了,因为我的代表很低,所以昨天不会让我这么做。)