在GCC內聯彙編中,有兩種方法可以防止優化:__volatile__
關鍵字並將"memory"
插入到clobber寄存器列表中。GCC內聯彙編 - 與__volatile__和「內存」有什麼不同?
我的問題是與__volatile__
和"memory"
有什麼區別 - 看起來它們是一樣的......但是,今天我遇到了奇怪的情況,這表明它們是完全不同的! (當我使用"memory"
時,我的程序在端口I/O功能上存在一個錯誤,但當我使用__volatile__
時,它會變得很好。)
有什麼區別?
子集?嗯,那麼,有沒有什麼情況應該是'__volatile__',而''memory''是不需要的?你能告訴我其中的一個嗎? – ikh
假設我明白手冊沒問題,從系統時鐘(顯然是'rdtsc'指令)加載一個時間就是其中一種情況。這有幫助嗎? –
子集不正確。這意味着volatile還會執行內存clobber(它不會)。 「記憶」不僅僅意味着你讀/寫記憶也很重要。這是你讀/寫的內存「,除了在輸入和輸出操作數中列出的內容」。例如,如果你只是更新一個輸出參數(「+ m」),你不(必然)需要內存clobber。但是,如果你只是傳遞一個void指針給asm(例如做一個memset),那麼gcc無法弄清楚你可能會改變多少內存。使用內存clobber告訴它假設你改變了一切。 –