我有一个用C编写的项目,最初是在Linux上完成的,但现在必须在Windows上完成。部分代码在几个地方包含这一行
asm("movl temp, %esp");
但是这会导致“未定义引用`temp'”错误。
使用gcc 4.3.2编译器(在另一台机器上测试)在Linux上进行编译没有问题,这是我在Cygwin上的版本。还有另一种方法可以完成这条线的工作吗?
答案 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 ......?)