2011-03-03 31 views
2

所有內容都在標題中。 由於某些原因,我必須這樣做。GCC呼叫標籤作爲功能

但是當我編譯我的代碼,海灣合作委員會(或氣體也許...)顯示以下錯誤:

... /溫度/ cc1C1fjs.s:19:錯誤:立即數與非法絕對跳轉

代碼:

int main (int argc, char **argv) 
{ 
    /* Some code */ 

    ((void(*)()) &&label)(); 

    /* Some code */ 

    return 0; 

    label: 
    asm ("push %ebp"); 
    asm ("mov %esp,%ebp"); 

    /* Some code */ 
    printf("Hello world"); 

    asm ("leave"); 
    asm("ret"); 
} 

我敢肯定,這應該作品,因爲我試圖創建使用CreateThread函數(我是windows下)specifing爲切入點標籤的地址線,它完美的作品好。 那麼我怎樣才能確保編譯器接受這個語法? 或者有其他方法可以做到這一點?

+0

下一次,用四個空格縮進你的代碼,所以它被視爲代碼。選擇您的代碼並按^ K。 – 2011-03-03 01:59:36

+0

作爲一個學習點,你爲什麼使用一個標籤作爲函數指針? – 2011-03-03 14:01:42

回答

0

我沒有你的解決方案,但我有幾個建議:

  1. 運行gcc -S file.c看看線#19,看你是否能發現實際的問題是什麼。
  2. 翻閱(短).s文件的其餘部分,看看是否有什麼明顯的錯誤。例如,我的版本gcc似乎認爲return 0之後的所有內容都是無效代碼,因此您的asm代碼和printf都不會將其實際傳送給彙編程序。
  3. 這段代碼不能移入函數嗎?這樣你就可以免費得到序言/後記;採取地址也不會有困難。
0

我解決了問題的一部分:

  1. @aix你有權利,GCC刪除 一切主要功能 的return 0;後,我通過

    asm("leave"); 
    asm("xor %eax,%eax"); 
    asm("ret"); 
    
    固定這個 替換它

    現在生成我的標籤後面的代碼。

  2. 運行gcc -S file.c然後 gcc file.s -o file.exe,當然它顯示錯誤和在 錯誤行有call *$L2 (L2是在我的C文件標籤)。它的工作原理是 ,取而代之的是call L2

    現在我的標籤後,我的主調用之後的代碼被執行 和程序正確 與狀態0

終止但我不希望有各做一次,我將編譯。 GCC寫call *$L2而不是call L2是否正常?