在Windows中,可以将__asm nop
换成asm volatile("nop");
(用于GCC编译器)并产生相同的结果吗?
我已经读过volatile()
(在GCC中)保证呼叫不会被优化掉。但是,它并没有直接移植到Windows,我很好奇它是否可以简单地删除或者是否需要用类似的构造替换它。
__asm
关键字实现在MSVC中非常简单。它总是不加改变地发出机器代码,优化器不接触它。它也没有对__asm之后的机器状态做出任何假设,它具有击败其他优化的诀窍。
所以,不,不需要类似于volatile()
,它不会消失。普通的__asm { nop }
将永远幸免于难,相当于GCC组装。
请记住,内联汇编不是一个好的长期策略,在x64编译器中完全删除了对它的支持,并且不太可能再回来。您将不得不回归内部函数或链接用汇编语言编写的代码,例如ml64.exe。这确实打败了NOP注入,但优化器已经很好地处理了代码对齐,并且不需要帮助。也许你根本不应该这样做的原因。
对于Microsoft编译器,使用__nop()
intrinsic function发出nop指令,而不会妨碍编译器的优化器。这也是所有Windows目标(32位ARM V7,64位ARM V8,IA32,X64)的跨平台。