2013-11-14 166 views
-3

我試圖與GCC:內聯彙編代碼不會編譯爲空......這是編譯器問題嗎?

#include <iostream> 
using namespace std; 
int main() 
{ 
asm("mov $0x7, %al"); 
} 

而這正是輸出:

Exited: ExitFailure 7

所以,我想這個代替:

#include <iostream> 
    using namespace std; 
    int main() 
    { 
    asm("mov $0xcf, %eax";); 
    } 

而得到這個錯誤:

error: expected `)' before ';' token.

我試過this guy's advice,但它不起作用。 This tutorial says otherwise.

我並嚴格按照顯示在本教程中,如下圖所示:

#include <iostream> 
int main() 
{ 
asm("movl $10, %eax"); 
} 

而得到這個錯誤:

Exited: ExitFailure 10

什麼是一個「ExitFailure」意味着什麼,他們爲什麼對應於操作數中的值?基本上,這裏發生了什麼?我的部分或編輯錯了嗎?

PS:這是一個錯誤日誌;我的程序不能成功編譯。

+1

當它說退出,這意味着該程序已編譯和執行。 – DogDog

+0

_ExitFailure_是什麼聽起來有問題。 –

+0

它說退出失敗,因爲它返回的東西!= 0 – DogDog

回答

4

你的程序在編譯和運行得很好 - 你只是碰巧把值710eax,這會導致你的函數的返回值分別爲710, - 該行爲取決於您的ABI。

+0

我不相信「ExitFailure」表示「_just fine_」。我也沒有指定任何輸出到控制檯或這樣的,所以我說的結果是一個**錯誤**,不輸出在控制檯程序。 –

+0

爲什麼不呢?這只是程序的退出狀態,它是由您的代碼明確指定的。 –

+0

閱讀我上面發佈的內容......這是編譯器日誌上的_error output_;該程序從不執行。 –

2

您的主要功能缺少返回值,請添加return 0;或您希望返回的任何內容。

+0

C++規則規定,在main()的末尾落下(只有'main')和執行'return 0;'是一樣的。 –

+0

我做過了,沒有它也沒有區別。 –

1

你的代碼編譯得很好,在gcc 4.8.1上執行得很好。它甚至說Process terminated with status 0 (0 minutes, 1 seconds)。我用codeblocks和Mingw-builds 4.8.1編譯它。

你甚至可以嘗試在這裏在線GCC 4.8.1:http://ideone.com/dUcDc1

或GCC 4.3.2

http://ideone.com/tNFWZH

無論哪種方式,它仍然有效..返回0爲好。

enter image description here

現在爲你可能的錯誤..究其原因,其他的答案說,你正在試圖返回10是因爲在裝配時,移動值壓EAX並調用RET,它返回值。

因此,你基本上告訴編譯器,主要是根據你的代碼返回107')' ..這就是爲什麼他們建議你嘗試將0移入eax寄存器。

如果您使用g ++ x64進行編譯,那麼您需要將其移入rax iirc中。雖然不確定,但我確實知道eax是這樣的。

現在至於爲什麼它適用於我和其他人。它可能是平臺相關的或您的編譯器可能是越野車..有些平臺實際上解釋返回代碼意味着什麼。

例如,在某些平臺上返回0以外的任何東西.. os可能會以某種方式查找返回代碼和清除,具體取決於返回代碼的含義。

+0

那麼,在我的編譯器(沒有IDE)中仍然存在ExitFailure,並且鏈接器不會將二進制文件放在指定的目錄中。 –

+0

http://i.imgur.com/ZRBTxKo.png也許檢查你的命令?你在運行什麼操作系統?什麼版本的gcc?你輸入了什麼命令? – Brandon

+0

Windows 7,最新的GCC,其他一切都是最佳的。沒有輸入命令。 –