【问题标题】:Is `__asm nop` the Windows equivalent of `asm volatile("nop");` from GCC compiler`__asm nop` 是 GCC 编译器的 `asm volatile("nop");` 的 Windows 等价物吗
【发布时间】:2014-09-16 21:42:58
【问题描述】:

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

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

【问题讨论】:

  • 这是一条nop 指令,它明确什么都不做。您可能需要提供更多上下文来揭示为什么它可能首先被包含在内。
  • MSVC++ 代码优化器不会与内联汇编混淆。所以,是的。
  • @GregHewgill 我的理解是,如果您在 GCC 中使用 volatile 命令,它不会被优化掉,并允许各种功能(即非锁定数据结构等)。我还应该提到,我不关心为什么有人会选择编写这段代码,我只关心如何移植它并获得相同的结果。
  • @HansPassant 请将您的回复放在网站上并将其放入答案中,以便我接受。谢谢!

标签: c windows gcc assembly


【解决方案1】:

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

所以,不,不需要任何类似于volatile() 的东西,它不会消失。普通的__asm { nop } 将永远安然无恙,相当于 GCC 程序集。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 2014-11-03
      相关资源
      最近更新 更多