2014-03-12 152 views
0

我想編寫一個使用臨時寄存器的小彙編程序。當我說臨時寄存器時,我的意思是它不是一個輸入或輸出寄存器,用於限制asm塊。我可以選擇任何寄存器,然後將其包含在clobber列表中,但我認爲編譯器可以選擇更好。處理這個問題的正確方法是什麼?我在網上找到的唯一建議是將其列爲輸出寄存器,然後不實際使用輸出。內聯彙編塊中的臨時寄存器

+2

使用什麼編譯器?在什麼CPU/OS上? –

回答

2

在clobber列表中不能使用r(通用寄存器)約束。假設輸入寄存器未被asm語句修改。最好的解決方案是將temp指定爲輸出寄存器,這給編譯器提供了放棄'結果'的選項,並且可以退出寄存器。

unsigned long tmp; /* register 'word' type. */ 

__asm__ ("..." : "=r" (tmp), ... : <inputs> : <clobbered>); 

現在,您可以參考的臨時註冊爲%0,在這個例子中。如果從不使用tmp變量,編譯器可以丟棄結果並繼續(重新)使用該寄存器。

+0

好吧,這聽起來不錯。編譯器大概會注意到我之後從來不會使用'tmp'。 –

+0

@MichaelMcLoughlin - 假定使用'%0'的指令對它們可以使用的寄存器沒有任何限制。某些x86指令有這樣的怪癖,例如'q','Q' [constraints](http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Machine-Constraints.html#Machine-Constraints) 。 –

+0

只要注意不要讓編譯器覺得彙編代碼的唯一要點是計算'tmp',否則它可能會丟棄整個事物! – SamB

相關問題