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 ……?)