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

问题描述 投票:0回答:2

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

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

c windows gcc assembly
2个回答
2
投票

__asm关键字实现在MSVC中非常简单。它总是不加改变地发出机器代码,优化器不接触它。它也没有对__asm之后的机器状态做出任何假设,它具有击败其他优化的诀窍。

所以,不,不需要类似于volatile(),它不会消失。普通的__asm { nop }将永远幸免于难,相当于GCC组装。

请记住,内联汇编不是一个好的长期策略,在x64编译器中完全删除了对它的支持,并且不太可能再回来。您将不得不回归内部函数或链接用汇编语言编写的代码,例如ml64.exe。这确实打败了NOP注入,但优化器已经很好地处理了代码对齐,并且不需要帮助。也许你根本不应该这样做的原因。


1
投票

对于Microsoft编译器,使用__nop() intrinsic function发出nop指令,而不会妨碍编译器的优化器。这也是所有Windows目标(32位ARM V7,64位ARM V8,IA32,X64)的跨平台。

© www.soinside.com 2019 - 2024. All rights reserved.