如何在C ++和&amp ;;中使用asm代码Visual Studio 2008

时间:2012-03-07 13:02:29

标签: c++ visual-studio-2008 assembly

我正在做一些跨平台的工作,将代码从Linux移植到Win32,但是当谈到一些汇编代码时,我无法让它工作。 此代码通常在Linux gcc中编译,但在VS2008 --win32中不起作用。

我的一些代码如下。如果我想使用VS2008 --win32平台编译它,我需​​要做什么:

static inline void spin_wait(int n)
{
    int    tmp = n;
    while(tmp > 0) { tmp--; asm("" ::: "memory", "cc"); }
}

__asm__ __volatile__(
    "xorq        %%rdx, %%rdx    \n"
    "xorq        %%rax, %%rax    \n"
    "incq        %%rdx        \n"
    "lock cmpxchgq    %%rdx, (%1)    \n"
    "decq        %%rax        \n"
: "=a" (not_set) : "r" (n) : "%rdx");

2 个答案:

答案 0 :(得分:2)

如果您的问题是关于内联汇编的使用,您仍然可以在Visual Studio(MSDN link)中使用它,尽管您可能需要在平台上调整它。

例如:

__asm {
   mov al, 2
   mov dx, 0xD007
   out dx, al
}

答案 1 :(得分:1)

像“spin_wait”这样的东西不可移植,应该(重新)写入适合目标平台的东西。我已经处理了可怕的GAS语法已经有一段时间了,但xorq意味着代码片段是针对x86-64的,对吗? Microsoft编译器不支持64位目标的内联汇编。

_AcquireSpinLock或许可以解决这个问题吗?

对于较大的汇编块(通常有意义在汇编中写入的部分),我建议您使用带有合理语法的跨平台汇编程序的外部汇编模块和良好的功能集(例如yasm,fasm或nasm)。当然,对于像关键词这样的东西来说这是不可行的,而且必须像螺旋锁一样内联,但是:)