【发布时间】:2017-08-03 01:31:49
【问题描述】:
我正在尝试从这里https://github.com/Ericson2314/Voxlap 在 linux 上构建 Voxlap,当我尝试这样做时,我收到一条关于内联程序集的错误消息:
source/sdlmain.cpp: In function ‘void fpuinit(long int)’:
source/sdlmain.cpp:1814:3: error: invalid 'asm': operand is not a condition code, invalid operand code 'c'
);
^
source/sdlmain.cpp:1814:3: error: invalid 'asm': operand is not a condition code, invalid operand code 'c'
source/sdlmain.cpp:1814:3: error: invalid 'asm': operand is not a condition code, invalid operand code 'c'
source/sdlmain.cpp:1814:3: error: invalid 'asm': operand is not a condition code, invalid operand code 'c'
有问题的代码在这里:
static long fpuasm[2];
static inline void fpuinit (long a)
{
__asm__ __volatile__
(
"fninit\n"
"fstcww %c[fp]\n"
"andb $240, %c[fp]+1(,1)\n"
"orb %%al, %c[fp]+1(,1)\n"
"fldcww %c[fp]\n"
:
: "a" (a), [fp] "p" (fpuasm)
: "cc"
);
}
编译器错误指向这部分
: "cc"
任何帮助破译错误消息或实际问题将不胜感激,谢谢
【问题讨论】:
-
我的问题是关于构建一个库并寻求帮助以破译错误消息或有关此程序集细节的解释以及为什么输出此错误。除了提供代码和错误以及我正在构建的内容之外,我无能为力。
-
错误消息告诉您您使用的
c操作数代码不正确。c操作数代码是%c[fp]中的字母c。这是说操作数[fp] "p" (fpuasm)不是条件代码,它似乎不是。至于实际问题,很难说您没有提供 MCVE 可能会发生什么,但我猜您正在尝试为非 x86 目标编译此代码。 -
我猜你是在一些基于 Ubuntu >= 16.10 的发行版上,并且默认构建一个与位置无关的可执行文件。尝试添加 G++ 编译器选项
-fno-pie。有问题的代码没有考虑到"p"约束在默认-fpie下无法按预期工作(此默认值在 Ubuntu >= 16.10 上已更改)。 -
@MichaelPetch 'c' 操作数修饰符/代码似乎有两个目的。似乎它正在使用它抱怨的未记录目的,因为操作数不能作为常量发出,这似乎是正确的。我的猜测是代码依赖于打开的优化。由于使用了
-mfpmath-sse标志,这段代码似乎也不会做任何有用的事情。 -
为
%[fp]生成的指令看起来像fstcww _ZL6fpuasm@GOTOFF(%ecx)当然这与位置无关,但不能转换为常量。我认为这种情况的错误消息并没有真正说明到底发生了什么。
标签: assembly x86 g++ inline-assembly