Встроенные проблемы сборки - PullRequest
1 голос
/ 12 мая 2011

Я попытался скомпилировать с GCC встроенным кодом сборки, который прекрасно скомпилирован с MSVC , но получил следующие ошибки для основных операций:

// var is a template variable in a C++ function
__asm__
{
    mov edx, var //error: Register name not specified for %edx
    push ebx //error: Register name not specified for %ebx
    sub esp, 8 //error: Register name not specified for %esp
}


Просматривая документацию , охватывающую эту тему, я обнаружил, что, вероятно, мне следует преобразовать (даже если меня интересует только x86) Intel код сборки в стиле AT & T стиль.Однако после попытки использовать стиль AT & T я получил еще более странные ошибки:

mov var, %edx //error: Expected primary-expression before % token
mov $var, edx //error: label 'LASM$$s' used but not defined


Следует также отметить, что я пытался использовать LLVM-GCC , но он с треском провалился из-за внутренних ошибок после обнаружения встроенной сборки.

Что мне делать?

Ответы [ 2 ]

3 голосов
/ 12 мая 2011

Для gcc от Apple вы хотите -fasm-blocks, который позволяет опустить требование цитирования gcc для встроенного asm, а также позволяет использовать синтаксис Intel.

// test_asm.c

int main(void)
{
    int var;

    __asm__
    {
        mov edx,var
        push ebx
        sub esp,8
    }

    return 0;
}

Скомпилируйте это с помощью:

$ gcc -Wall -m32 -fasm-blocks test_asm.c -o test_asm

Протестировано с gcc 4.2.1 на OS X 10.6.

2 голосов
/ 12 мая 2011
Встроенный ассемблер

g ++ гораздо более гибкий, чем MSVC, и гораздо более сложный.Он трактует директиву asm как псевдоинструкцию, которая должна быть описана на языке генератора кода.Вот рабочий пример из моего собственного кода (для MinGW, а не Mac):

// int BNASM_Add (DWORD* result, DWORD* a, int len)
//
//   result += a

int BNASM_Add (DWORD* result, DWORD* a, int len)
  {
  int carry ;
  asm volatile (
".intel_syntax\n"
"    clc\n"
"    cld\n"

"loop03:\n"
"    lodsd\n"
"    adc     [edx],eax\n"
"    lea     edx,[edx+4]\n"   // add edx,4 without disturbing the carry flag
"    loop    loop03\n"

"    adc     ecx,0\n"         // Return the carry flag (ecx known to be zero)
".att_syntax\n"
: "=c"(carry)                   // Output: carry in ecx
: "d"(result), "S"(a), "c"(len) // Input: result in edx, a in esi, len in ecx
) ;
  return carry ;
  }

Документацию можно найти по адресу http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Extended-Asm.

...