【发布时间】:2017-04-17 17:41:56
【问题描述】:
我有这个 C sn-p,它给出了一个编译器错误,我不知道为什么:
// compiler dependent inline assemble
#ifdef __INTEL_COMPILER
#define ASM __asm
#else
#define ASM __asm__
#endif
int getfpucw(
/* Get FPU control word */
) {
int mode = 0;
// load mode value into register %0, no output ...: :...
ASM fnstcw *&mode;
ASM("fnstcw %0" : "m"(*&mode));
return mode;
}
我明白了:
../src/fpucw.c(28):错误:汇编语言中的常量无效 操作说明 ASM("fnstcw %0" : : "m"(*&mode)); ^
../src/fpucw.c(28):错误:汇编语言中的常量无效 操作说明 ASM("fnstcw %0" : : "m"(*&mode));
第一个 ASM 语句通过。我想是因为它是 MS ASM 语法?
但是,我想避免总是在 ASM 语句周围使用 #ifdef,因为我们也使用 GCC。
【问题讨论】:
-
您的代码是用 C 编写的还是用 C++ 编写的?请在两种语言中最多选择一种。
-
内联汇编是特定于编译器的。如果你想避免一堆 ifdef,不要使用内联汇编。而是将汇编代码放在汇编文件中,并使用相同的汇编器来汇编它们,而不管您使用的是哪个 C 编译器。
-
我无法重现您的错误。你能告诉我们生成的程序集吗?
-
请注意,当您写入操作数时,它必须是输出操作数,而不是输入操作数。所以改写
ASM("fnstcw %0" : "m"(mode))。可能这也解决了您的其他问题。 -
那不是 C 代码。