exs*_*ape 2 assembly gcc 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");
}
Run Code Online (Sandbox Code Playgroud)
(顺便说一下,该函数被正确调用;我正在尝试替换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"约束相关),而是它留给了我.
如果有人可以为我编写约束(如果您愿意,请添加一个简短的解释),我真的很高兴.)
解决方案(在问题的评论中发布)是在传入asm块之前简单地取消引用指针.这样做可以使一切正常运作.
我只是将此作为答案发布,因为我无法将其标记为只回答问题的评论.(另外,我回答的有点迟了,因为我昨天不会让我失望,因为我的代表很低.)