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

How to use asm code in C++ & Visual Studio 2008

本文关键字:asm 代码 2008 Studio C++ Visual      更新时间:2023-10-16

我正在做一些跨平台的工作,将代码从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");

如果您的问题是关于内联程序集的使用,您仍然可以在Visual Studio(MSDN链接)中使用它,当然您可能需要根据平台对其进行调整。

例如:

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

像"spin_wait"这样的东西是不可移植的,应该(重新)写入适合目标平台的内容。我已经有一段时间没有处理过糟糕的GAS语法了,但xorq意味着这个片段是针对x86-64的,对吧?Microsoft编译器不支持64位目标的内联程序集。

_AcquirePinLock可能会起作用吗?

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