【发布时间】:2016-04-27 09:31:56
【问题描述】:
在我看来,clang++ 错过了 g++ 拾取的汇编代码中的错误。还是我错过了一些clang的编译器标志?我是汇编代码的新手。
使用 clang++ 我编译并链接了我的应用程序错误和警告,但我遇到了令人讨厌的分段错误。切换到 g++,另一方面,我得到了这些错误:
GO_F_ImageColourConversion.cpp: Assembler messages:
GO_F_ImageColourConversion.cpp:4679: Error: `(%rsi,%edx,2)' is not a valid base/index expression
GO_F_ImageColourConversion.cpp:4682: Error: `(%rcx,%edx,1)' is not a valid base/index expression
我正在使用这些编译器标志: -DLINUX -g -Wno-deprecated -D_GNU_SOURCE -D_REENTRANT -D__STDC_CONSTANT_MACROS -fPIC -fPIE
我有以下代码(省略不相关部分):
Ipp8u * pSrc;
Ipp8u * pDst;
int x, y;
asm volatile
(
"movl (%1, %0, 2), %%eax;\n"
"shlw $8, %%ax;\n"
"shrl $8, %%eax;\n"
"movw %%ax, (%2, %0, 1);\n"
: /* no output */
: "r" (x), "r" (pSrc), "r" (pDst)
: "eax", "memory");
}
通过查看answer on SO,我意识到我遇到了 32/64 位问题(我正在移植到 64 位)。Ipp8u* 是 8 位,但在我的机器上只有 4 位。
将 int 更改为 uintptr_t x, y; 似乎可以解决问题。为什么clang编译不报错?
【问题讨论】:
-
大概是因为 clang 自动替换了正确的 64 位寄存器。您尚未显示为 clang 生成的程序集,但我认为它是有效的
(%rsi,%rdx,2)。 PS:这个不需要汇编,编译器肯定可以从C生成好的代码。而且这是一个特别糟糕的汇编代码。
标签: linux assembly clang x86-64 inline-assembly