`__asm nop`是Windows的等同于`asm volatile(“nop”);`来自GCC编译器

时间:2014-09-16 21:42:58

标签: c windows gcc assembly

在Windows中,可以__asm nop交换asm volatile("nop");(在GCC编译器中使用)并产生相同的结果吗?

我已经读过volatile()(在GCC中)保证呼叫不会被优化掉。但是,它并没有直接移植到Windows,我很好奇它是否可以简单地删除或者是否需要用类似的构造替换它。

2 个答案:

答案 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)上,这也将是跨平台的。