繁体   English   中英

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

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

我正在做一些跨平台的工作,将代码从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位目标的内联汇编。

_AcquireSpinLock可能会成功吗?

对于较大的汇编块(通常可以用汇编编写的部分),我建议您将外部汇编模块与具有合理语法和良好功能集的跨平台汇编器一起使用(例如yasm,fasm或nasm)。 当然,这对于像自旋锁这样的关键且必须内联的东西并不可行,但:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM