Как использовать ассемблерный код в C ++ и Visual Studio 2008 - PullRequest
0 голосов
/ 07 марта 2012

Я занимаюсь кроссплатформенной работой, портирую код с 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 ]

2 голосов
/ 07 марта 2012

Если ваш вопрос касается использования встроенной сборки, вы все равно можете использовать его в Visual Studio ( ссылка MSDN ), хотя, возможно, вам потребуется настроить его для платформы.

Например:

__asm {
   mov al, 2
   mov dx, 0xD007
   out dx, al
}
1 голос
/ 07 марта 2012

Такие вещи, как "spin_wait", не переносимы и должны быть (пере) записаны в соответствии с целевой платформой.Прошло много времени с тех пор, как я рассмотрел ужасный синтаксис GAS, но xorq означает, что фрагмент предназначен для x86-64, верно?Компиляторы Microsoft не поддерживают встроенную сборку для 64-битных целей.

Будет ли _AcquireSpinLock , возможно, справиться?

Для больших блоков сборки (частей, которые обычно * 1007)* имеет смысл писать в сборке), я бы посоветовал вам использовать внешний модуль сборки с кроссплатформенным ассемблером с нормальным синтаксисом и хорошим набором функций (например, yasm, fasm или nasm).Конечно, это не жизнеспособно для чего-то столь же важного и обязательного для исполнения, как спин-блокировка, хотя:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...