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 数组;但是,ab 都是 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数组?的主要内容,如果未能解决你的问题,请参考以下文章

操作系统学习之GCC内联汇编

使用内联汇编器从 GCC 中的共享库调用函数

VC内联汇编和GCC内联汇编的语法区别

最牛X的GCC 内联汇编

最牛X的GCC 内联汇编

gcc中的arm内联汇编