c - 来自 GCC 编译器的 `__asm nop` 在 Windows 中相当于 `asm volatile("nop");`

标签 c windows gcc assembly

在 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/

相关文章:

php - Windows 上的 FFmpeg - 后台转换

c++ - 关于匿名命名空间和内部链接的标准是什么?

c++ - 在 C++ 中构造左填充的 NULL 固定长度字符数组的最有效方法是什么?

c - "radial blur"使用 OpenMP

php - MySqlDump - 使用 Windows 清空转储

c++ - OMP - 线程数多于处理器数?

c# - 杀死资源管理器进程

c - gcc 编译器中关于 fork() 的歧义

c - malloc()'s "完美效率”VS自动变量

c - 使用链接列表的后缀实现的缀