簡體   English   中英

Windows上的`__asm nop`是否等同於GCC編譯器的`asm volatile(“ nop”);`?

[英]Is `__asm nop` the Windows equivalent of `asm volatile(“nop”);` from GCC compiler

在Windows中,可以將__asm nop交換為asm volatile("nop"); (用於GCC編譯器)並產生相同的結果?

我已經讀過volatile() (在GCC中)確保不會優化調用。 但是,它不能直接移植到Windows,我很好奇它是否可以簡單地刪除或是否需要用類似的結構替換。

__asm關鍵字的實現在MSVC中非常簡單。 它始終會發出未更改的機器代碼,並且優化程序不會對其進行處理。 對於__asm之后的機器狀態,它也不做任何假設,因為它具有擊敗其他優化的訣竅。

因此,不需要,不需要任何類似於volatile()東西,它不會消失。 普通__asm { nop }將始終毫發無損,並且等同於GCC程序集。

請記住,內聯匯編不是一個好的長期策略,在x64編譯器中完全取消了對內聯匯編的支持,而且不太可能再出現。 您將不得不使用內在函數或鏈接到用匯編語言編寫並使用例如ml64.exe進行編譯的代碼。 那確實擊敗了NOP注入,但是優化器已經很好地處理了代碼對齊問題,並且不需要幫助。 這也是您可能根本不應該這樣做的原因。

對於Microsoft編譯器,可以使用__nop()內在函數來發出nop指令,而不會影響編譯器的優化器。 在所有Windows目標(32位ARM V7、64位ARM V8,IA32,X64)上,這也將是跨平台的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM