【问题标题】:Converting GNU asm calls to VC++将 GNU asm 调用转换为 VC++
【发布时间】:2012-06-13 07:34:54
【问题描述】:

我一直在将 linux 应用程序移植到 windows 平台。

这里是linux代码,

 __asm__ __volatile__ ("lock; cmpxchgl %1, %2"
                      : "=a" (prev)
                      : "q" (new_value), "m" (*ptr), "0" (old_value)
                     : "memory");

我尝试使用 _asm volatile,但在 Visual Studio 2012 中出现错误提示“'opcode' 中的内联汇编语法错误;发现 '数据类型'”。

我需要一些 Windows 等效代码。 请提供任何信息/建议。

【问题讨论】:

  • 你的编译器肯定有原子操作的内在函数吗?无需编写自己的汇编程序...

标签: visual-c++ assembly


【解决方案1】:

一般来说,我更喜欢外部汇编模块而不是内联汇编——它更便携(是的,便携和汇编在同一个句子中使用)。 nasmyasm 等汇编程序可用于多个平台,并且可以生成多种目标文件格式。

外部汇编模块不适合像您的代码这样对性能至关重要的单行代码 - 考虑使用编译器内在函数而不是内联汇编。您可能想查看Portable Compare And Swap

【讨论】:

    【解决方案2】:

    我认为这里的主要问题是 Visual Studio 使用 Intel 风格的内联汇编语言,而您没有使用它。

    检查一下: http://msdn.microsoft.com/en-us/library/4ks26t93%28v=vs.80%29.aspx

    关于 volatile 说明符和重新排序,即使使用 o2 优化,我还没有看到 VS 2010 或 2012 重新排序 __asm 块。

    您好, 安迪

    【讨论】:

      猜你喜欢
      • 2021-01-29
      • 1970-01-01
      • 2013-10-25
      • 2015-12-29
      • 1970-01-01
      • 2011-03-23
      • 2011-11-29
      • 2014-09-11
      • 1970-01-01
      相关资源
      最近更新 更多