将GNU asm调用转换为VC ++

时间:2012-06-13 07:34:55

标签: visual-c++ assembly

我一直在将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中收到错误提示“操作码中的内联汇编语法错误”;找到“数据类型”。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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

问候, 安迪