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