Cygwin gcc – asm错误:
我有一个用C编写的项目,最初是在Linux上完成的,但现在必须在Windows上完成。 部分代码在几个地方包含这一行
asm("movl temp, %esp");
但这会导致“未定义的引用’temp’”错误。
使用gcc 4.3.2编译器(在另一台机器上测试)在Linux上进行编译没有问题,这是我在Cygwin上的版本。 还有另一种方法可以完成这条线的工作吗?
您需要更改cygwin版本
asm("movl temp, %esp");
至
asm("movl _temp, %esp");
是的,它是相同的编译器和汇编程序,但它们的设置与主机系统的兼容性不同。
您可以通过简单地告诉gcc使用的特定名称来隔离依赖于系统的符号前缀:
int *temp asm("localname"); ... __asm__("movl localname,%esp");
这避免了某种类型的#if并删除了主机操作系统依赖性,但增加了编译器依赖性。 说到编译器扩展,有些人会写(见info as
)类似于:
#ifdef __GNUC__ __asm__("movl %[newbase],%%esp" : : [newbase] "r,m" (temp) : "%esp"); #else #error haven't written this yet #endif
这里的想法是这个语法允许编译器通过查找temp
来帮助你,即使它在寄存器中说谎或者需要加载一些指令,并且为了避免与你发生冲突,例如它使用寄存器你破坏了。 它需要这个,因为编译器不会以任何方式解析普通的__asm__()
。
在您的情况下,您似乎正在实现自己的线程包,因此这些都不重要。 Gcc不打算使用%esp进行计算。 (但为什么不使用pthreads ……?)