2009-09-12 114 views
2

我有一個用C編寫的項目,最初是在Linux上完成的,但現在必須在Windows上完成。部分代碼包括在幾個地方Cygwin gcc - asm錯誤:

asm("movl temp, %esp"); 

但是,這會導致「未定義的引用'臨時'」的錯誤此行。

這對使用gcc 4.3.2編譯器(在另一臺機器上測試過)在Linux上編譯沒有任何問題,這是我在Cygwin上的版本。有沒有另外一種方法來完成這條線路正在做的事情?

回答

3

你需要從

asm("movl temp, %esp"); 

改變cygwin的版本

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

+0

謝謝,但這給了我同樣的錯誤:「未定義的引用_temp'」 – Scott 2009-09-12 15:58:19

+0

剛剛嘗試__asm __(「movl _temp,%esp」);現在一切正常。 – Scott 2009-09-12 16:03:57