在 Windows 中,可以将 __asm nop
替换为 asm volatile("nop");
(在 GCC 编译器中使用)并产生相同的结果吗?
我读到volatile()
(在GCC中)保证调用不会被优化掉。但是,它不能直接移植到 Windows,我很好奇它是否可以简单地删除或者是否需要用类似的结构替换。
最佳答案
MSVC 中的 __asm
关键字实现非常简单。它始终发出未更改的机器代码,并且优化器不会触及它。它也不对 __asm 之后的机器状态做出任何假设,这有击败其他优化的诀窍。
所以,不,不需要任何类似于 volatile()
的东西,它不会消失。普通的 __asm { nop }
将始终毫发无伤地生存,相当于 GCC 程序集。
请记住,内联汇编不是一个好的长期策略,x64 编译器已完全删除对内联汇编的支持,并且不太可能恢复。您必须退回到以汇编语言编写并使用 ml64.exe 等程序进行编译的内在函数或链接代码。这确实击败了 NOP 注入(inject),但是优化器已经很好地处理了代码对齐,并且不需要帮助。这也是您可能根本不应该这样做的原因。
关于c - 来自 GCC 编译器的 `__asm nop` 在 Windows 中相当于 `asm volatile("nop");`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25878898/