【发布时间】: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 实际上,这就是整个解决方案;现在可以了。谢谢!
标签: gcc assembly x86-64 inline-assembly