我想編寫一個使用臨時寄存器的小彙編程序。當我說臨時寄存器時,我的意思是它不是一個輸入或輸出寄存器,用於限制asm
塊。我可以選擇任何寄存器,然後將其包含在clobber列表中,但我認爲編譯器可以選擇更好。處理這個問題的正確方法是什麼?我在網上找到的唯一建議是將其列爲輸出寄存器,然後不實際使用輸出。內聯彙編塊中的臨時寄存器
回答
在clobber列表中不能使用r
(通用寄存器)約束。假設輸入寄存器未被asm語句修改。最好的解決方案是將temp指定爲輸出寄存器,這給編譯器提供了放棄'結果'的選項,並且可以退出寄存器。
unsigned long tmp; /* register 'word' type. */
__asm__ ("..." : "=r" (tmp), ... : <inputs> : <clobbered>);
現在,您可以參考的臨時註冊爲%0
,在這個例子中。如果從不使用tmp
變量,編譯器可以丟棄結果並繼續(重新)使用該寄存器。
好吧,這聽起來不錯。編譯器大概會注意到我之後從來不會使用'tmp'。 –
@MichaelMcLoughlin - 假定使用'%0'的指令對它們可以使用的寄存器沒有任何限制。某些x86指令有這樣的怪癖,例如'q','Q' [constraints](http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Machine-Constraints.html#Machine-Constraints) 。 –
只要注意不要讓編譯器覺得彙編代碼的唯一要點是計算'tmp',否則它可能會丟棄整個事物! – SamB
- 1. 的內聯彙編使用寄存器
- 2. MIPS彙編語言 - 臨時寄存器vs保存的寄存器
- 3. XOR寄存器,寄存器(彙編)
- 4. 在gcc內聯彙編中加載寄存器? (簡單嗎?)
- 5. 如何使用內聯彙編程序保存寄存器值
- 6. GCC內聯彙編:讓編譯器決定使用什麼寄存器來臨時值
- 7. 在GCC中使用內聯ARM彙編時優化使用的寄存器
- 8. PowerPC內聯彙編:將C值加載到寄存器
- 9. 內聯彙編錯誤:垃圾`-4(%EBP) '寄存器後
- 10. 彙編和寄存器
- 11. ARM內聯彙編 - 在x86的內聯彙編指定單個寄存器作爲約束
- 12. 手臂;內聯asm;使用臨時寄存器;
- 13. 內聯彙編中的內存偏移
- 14. 在內聯彙編中讀取非標準大小(IDTR)的寄存器(簡單?)
- 15. 是否有可能強制內聯彙編代碼中的特定寄存器?
- 16. 將字符數組的值移動到寄存器x86內聯彙編中
- 17. 彙編語言 - 什麼是臨時字符串輸入的寄存器
- 18. C51 C編譯器內聯彙編到SDCC內聯彙編
- 19. 幀內指針寄存器'ebx'由內聯彙編代碼修改
- 20. 彙編器反轉XMM寄存器
- 21. 在LC3中打印控制檯寄存器的內容彙編
- 22. 在avr-gcc內聯彙編中使用輸出寄存器有哪些限制?
- 23. 如何在ARM內聯彙編程序中使用特定寄存器
- 24. 使用行內彙編來更新內部系統寄存器
- 25. 如何在構建intel樣式的內聯彙編代碼時使gcc編譯器保留寄存器?
- 26. x86彙編,ROR旋轉,從寄存器或內存計數
- 27. 寄存器和臨時寄存器有什麼區別?
- 28. 彙編sp和bp寄存器
- 29. PIC彙編:遞減寄存器0
- 30. 彙編保持寄存器值?
使用什麼編譯器?在什麼CPU/OS上? –