Cygwin gcc - asm错误:

时间:2009-09-12 15:06:42

标签: c gcc assembly cygwin

我有一个用C编写的项目,最初是在Linux上完成的,但现在必须在Windows上完成。部分代码在几个地方包含这一行

asm("movl temp, %esp");

但是这会导致“未定义引用`temp'”错误。

使用gcc 4.3.2编译器(在另一台机器上测试)在Linux上进行编译没有问题,这是我在Cygwin上的版本。还有另一种方法可以完成这条线的工作吗?

1 个答案:

答案 0 :(得分:3)

您需要从

更改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 ......?)