2013-04-13 59 views
1

我決定開始學習一些內聯彙編但是我只剩下一個簡單的問題,對此我無法找到一個明確的答案相同的變量。擴展內聯彙編:輸入和輸出

看看下面簡單的例子,我在執行一個簡單的加法作爲這樣一個教程發現:

int one,two,out; 

one = 1; 
two = 2; 

__asm__ ("add eax, ebx;" : "=a" (out) : "a" (one) , "b" (two)); 

注意,對於我自己的理智與Intel語法工作了一段時間後的緣故,我配置GCC使用英特爾語法而不是AT & T.

現在假設我想省略「out」變量,只是將輸出存儲在「one」中(而不是「所有重要的」)。

我該怎麼做?

回答

1
__asm__ ("add eax, ebx;" 
      : "+a" (one) 
      : "b" (two)); 

"+"的改性劑表示「讀/寫」操作數(和必須在輸出約束可以使用)。

+0

工作就像一個魅力,簡直不敢相信我之前錯過了! – KennyV

0

使用

__asm__ __volatile__(" add %0, %2": "=r" (one): "0"(one), "r" (two)) 

通過使用「= r」和「R」,你不逼不必要的編譯器使用一個特定的寄存器,這有助於寄存器分配。 「0」表示「與(輸出)參數0相同」。

EDIT3:該two參數是%2,而不是在%1,這僅僅是one的第二個副本(同一個寄存器%0)。當應該使用單個時,還修復了雙重%

編輯2:我還添加了__volatile__以確保編譯器不會移動或忽略彙編代碼,如果編譯器不認爲您的代碼執行了任何有用的操作,則會發生這種情況[通常是因爲它不會產生編譯器使用的輸出稍後的]。通過__volatile__,編譯器保證不移動或刪除彙編代碼。

EDIT1:修復了語法。

+0

使用這個例子中,這似乎變量「兩節」添加到本身給我的4而不是預期的結果,因此這將是3,它也做到這一點,如果我使用「=一個」爲「一」變量和「b」爲「兩個」變量 – KennyV

+0

是的,我很愚蠢。今天早上過早開始,現在是午夜半時間是我的藉口,我堅持下去......;)請參閱上面的編輯文本。 –

+0

沒問題,它的工作原理,但我接受了其他的解決辦法,因爲它是清潔 – KennyV