Ошибка встроенной сборки GCC: спецификатор asm для переменной '% al' конфликтует со списком asm clobber - PullRequest
0 голосов
/ 02 июня 2011

Извините за столько вопросов, но я столкнулся с еще одной загадочной ошибкой при попытке компилировать следующую встроенную сборку (с -fasm-blocks ), которая работает в MSVC , нопо-видимому, не в GCC и не смог с этим справиться:

unsigned char testData = 128;

__asm
{
    // ...
    mov al, testData
    mov ah, al // error: asm-specifier for variable '%al' conflicts with asm clobber list
    shl eax, 16
    // ...
};


Что это за список clobber и что с ним не так?

Я также пытался изменить уровень оптимизации, но это не имело никакого эффекта.

Ответы [ 2 ]

0 голосов
/ 02 июня 2011

Это должно быть какой-то ошибкой в ​​gcc (возможно, блоки __asm ​​имеют неявное дублирование). В любом случае есть много обходных путей:

__asm
{
    // ...
    mov ah, testData
    mov al, ah
    shl eax, 16
    // ...
};

или

__asm
{
    // ...
    mov al, testData
    mov ah, testData
    shl eax, 16
    // ...
};

или

__asm
{
    // ...
    movzx eax, testData
    imul eax, 0x0101
    shl eax, 16
    // ...
};
0 голосов
/ 02 июня 2011

список clobber объясняется здесь: http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html,, но не в контексте вашего синтаксиса __asm, с которым я не знаком.Пытаясь скомпилировать ваш фрагмент, я получаю

jcomeau@intrepid:/tmp$ make test
cc     test.c   -o test
test.c:4: error: expected ‘(’ before ‘{’ token
...