2013-02-04 27 views
4

GCC內聯彙編程序要求您分別列出輸入和輸出約束。但是,它還要求您在輸出約束之前指定「=」,該輸出約束根據the manual表示「此操作數是隻寫的」。沒有修飾符意味着只讀。現在,在我看來,只讀/只寫和輸入/輸出之間存在細微差別,因此這些處理方式不同。但是,如果gcc如果不相同,gcc如何區分「輸入」和「只讀」?有沒有人會在輸入約束中放​​置「=」,或者在輸出約束上忽略它?對於「+」(讀和寫)參數,將該參數放入輸入區和輸出區是否有區別?將參數指定爲「+」約束與將其指定爲如下之間有區別嗎?爲什麼GCC內聯彙編程序要求您根據位置和約束來指定輸入/輸出?

"some instruction" : "=r" : 0 : 

回答

3

爲GCC-4.7.2的texinfo手冊指出,「=」是強制性的輸出限制,並在輸出操作數「+」意味着它也可以是一個輸入。規則有些複雜,仔細閱讀手冊。

據我瞭解, '=' 上的輸入是沒有意義的(一個只寫輸入?!)。如果輸入被修改,將其列爲輸出(可能有幾個!),也許將它關聯到一個垃圾變量,並將其與輸出綁定在一個數字約束中。

是的,這一切都相當混亂。這些約束來自於GCC用來描述操作的內部語言,並且隨着時間的推移而發展(有一些向後兼容性將其引入到spice中)。採取一些風格,堅持下去。請記住,編譯器會將您的asm()代碼片段視爲黑匣子,通過將其中的告訴和其他內容替換爲參數來複制,就像處理預處理器宏一樣。它不會檢查您的指令的尋址模式是否有意義,如果指令是針對您當前的機器,則無。只需將文本擴展並複製到程序集輸出中即可。仔細檢查你是在說你的意思(希望儘可能像指令的尋址模式一樣寬鬆,你不希望編譯器通過扭曲來遵守不受限制的限制;但不允許指令不處理)。檢查生成的程序集!

+0

謝謝。我其實不太確定「只寫輸入」是沒有意義的。在理解asm模型(問題在於這是否正確)的一種方式中,「輸入」意味着分配一些東西來將東西移到彙編之前,而「輸出」意味着分配東西來在彙編之後移動東西。因此,例如,列出一個作爲只寫輸入寫入的內存位置實際上可能會更加正確。但沒有人這樣做,所以這可能是錯誤的。 – user2040142

+0

你說:「約束來自於GCC用來描述操作的內部語言,並且隨着時間的推移而發展(有一些向後兼容性將其引入了spice)」,但我認爲這是我試圖解決這個問題的問題。你應該不需要知道的「內部語言」在這裏已經流露出來了,就像人們訪問彙編程序一樣,我擔心,不瞭解內部語言,我的代碼可能會與未來(或過去)的編譯器斷裂即使它編譯我今天的打算。 – user2040142

相關問題