2011-08-15 272 views
2

我想在C/x86_64内联汇编中编写一个函数,但我没有太多的运气。GCC内联汇编中的C数组?

我们可以煮一切归因于这样的:

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
坠毁Threa d:0调度队列:com.apple.main线程

我已经尝试了几个约束的组合,但(正如我所说),我没有太多的运气。

目标是有权访问程序集中的所有三个函数参数; a只读,b为可读写,c为只读。如你所见,所有三个都是C中的char数组;然而,ab都是16字节长,可以存储在XMM寄存器中(这是我的目标之一)。
c是一个这样的变量数组,所以每个这些变量也可以存储在XMM寄存器中。另外,我应该指出,如果GCC没有将东西加载到寄存器中(因为它看起来与“x”约束)有关,但它将它留给了我。

我真的并欣赏,如果有人能写的约束,我(如果你喜欢它的感觉,添加一个简短的说明。)

+7

你看过生成的程序集吗?我希望你需要给''m“(* a)'作为读取位置;否则它会尝试将_pointer_本身加载到'%xmm0'中 - 但这不能解释您的段错误。 –

+0

Henning Makholm是正确的。取决于你想要什么,你也可以做'asm __volatile__(“movdqa(%0),%% xmm0”::“r”(a):“%xmm0”);' – user786653

+0

@亨宁Makholm其实,那是整个解;它现在有效。谢谢! – exscape

回答

5

解决方案(如张贴在评论的问题)是简单地在传递给asm块之前解引用指针。这样做可以让所有事情都按照原样进行。

我只发布这个答案,因为我不能将它标记为只回答问题的评论。 (另外,我回答的有点迟,因为它不会让我昨天,由于我的低代表。)