GCC内联汇编中的C数组?
Posted
技术标签:
【中文标题】GCC内联汇编中的C数组?【英文标题】:C arrays in GCC inline assembly? 【发布时间】:2011-08-15 15:37:01 【问题描述】:我正在尝试在 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 崩溃的线程:0 调度队列:com.apple.main-thread
我已经尝试了很多约束组合,但是(正如我所说),我运气不佳。
目标是访问汇编中的所有三个函数参数; a
只读、b
读写和c
只读。
如您所见,这三个都是 C 中的 char 数组;但是,a
和 b
都是 16 字节长,并且可以分别存储在 XMM 寄存器中(这是我的目标之一)。c
是一个此类变量的数组,因此每个都可以也可以存储在 XMM 寄存器中。
另外,我应该指出,如果 GCC 不将内容加载到寄存器中(因为它似乎与“x”约束有关),我更愿意,而是将其留给我。
如果有人可以为我编写约束,我真的很感激(如果您愿意,请添加一个简短的解释。)
【问题讨论】:
你看过生成的程序集吗?我希望您需要为读取位置提供"m"(*a)
;否则它会尝试将 pointer 本身加载到 %xmm0
中——这并不是说这会解释你的段错误。
Henning Makholm 是正确的。根据你的需要,你也可以做asm __volatile__ ("movdqa (%0), %%xmm0" : : "r"(a) : "%xmm0");
@Henning Makholm 实际上,这就是整个解决方案;现在可以了。谢谢!
【参考方案1】:
解决方案(在问题的 cmets 中发布)是在传递到 asm 块之前简单地取消引用指针。这样做可以让一切正常运行。
我只是将此作为答案发布,因为我无法将其标记为仅使用问题的 cmets 回答。 (另外,我回答得有点晚了,因为昨天它不会让我,因为我的代表很低。)
【讨论】:
以上是关于GCC内联汇编中的C数组?的主要内容,如果未能解决你的问题,请参考以下文章