2016-11-18 328 views
1

我試圖在Linux中使用nano文本文件轉換內聯彙編代碼。GCC內聯彙編錯誤

__asm__ ("MOV AX, morales1\n\t" 
     "MOV BX, morales2\n\t;" 
     "ADD AX, BX\n\t;" 
     "MOV morales, AX;" 
     ); 

士氣1和2被簽名爲短褲。我收到以下錯誤:

"Error: ARM register expected -- mov AX,morales1'"`

+1

你在使用ARM芯片嗎?您需要提供有效寄存器名稱的芯片架構文檔。 AX可能不適用於給定的目標架構。您可能從這裏開始:http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001m/QRC0001_UAL.pdf –

+1

ARM處理器需要ARM彙編代碼,而不是x86彙編代碼。 –

+0

是的,我是。即時通訊工作與覆盆子pi。所以格式不正確?像寄存器一樣? – Brian

回答

0

您似乎對編譯器的功能有些模糊。最簡單的方法是,c編譯器獲取帶有c指令的文件,並將它們轉換爲適合在特定處理器上執行的彙編語言指令。

但是那裏有很多處理器,並且每個處理器家族都使用不同的彙編指令。 c編譯器如何處理這個問題?答案是給定的編譯器(通常)只支持單個輸出格式。所以你可能有一個編譯器輸出x86代碼,另一個輸出x64,一個用於ARM,MIPS等。雖然他們都採用c語言輸入文件,但他們每個都輸出適合其目標的彙編指令。

這意味着編譯器可以將常規c指令(case,break,printf,scanf等)轉換爲適當的彙編程序。但是,當您使用asm指令時,您告訴編譯器不要執行任何c->彙編器轉換。它必須完全輸出您提供的特定彙編程序指令。

這一切與你的問題有什麼關係?

如果您從一個平臺(例如x86)獲取彙編程序指令並嘗試在另一個平臺(如ARM)上使用它,您會發生什麼情況?那麼,主要發生的是它不起作用。 (作爲一個虛構的例子)如果你試圖使用add x, y和處理器期望u32.xadd x, x, y,它會變得非常困惑,並且把你的彙編器當成廢話。

那麼,你如何「修復」這個?那麼,最明智的計劃就是停止在你的c代碼中使用匯編語言。它看起來像你只是想添加2個數字。 c已經有可以做到的說明。

強調:編寫c代碼並讓編譯器輸出代碼幾乎總是更好的方法。嘗試使用內聯彙編需要您知道c語言,目標處理器的彙編語言以及特定編譯器選擇使用的接口規則(每個編譯器似乎稍微有點不同)。這是很多知道和嘗試做對的。而且(正如你所發現的那樣)它使得從一個編譯器/處理器轉移到另一個痛苦的。

但是,如果您絕對需要必須使用使用匯編程序,您需要從學習處理器的彙編程序指令開始。谷歌搜索應該爲這些說明提供各種資源。一旦你知道了,你可以更新你的asm命令以包含正確的說明。