встроенный ассемблер gcc сдвиг влево проблема - PullRequest
1 голос
/ 10 июля 2011

У меня проблемы с компиляцией кода ниже.Также могут быть логические ошибки, пожалуйста, помогите.спасибо,

#include <iostream>

using namespace std;

int main()
{
    int shifted_value;
    int value = 2;

    __asm__("shll %%eax,%1;" : "=a" (shifted_value): "a" (value));

    cout<<shifted_value<<endl;

    return 0 ;
}

Ошибка:

Ошибка: суффикс или операнды недействительны для `shl '

Ответы [ 2 ]

3 голосов
/ 10 июля 2011

должно выглядеть

<code>__asm__(("shll %%cl, %%eax;"
            : "=a" (shifted_value)
            : "a" (shifted_value), "c" (value)
           );
Кредит для правильного кода идет к другому ответу для указания, что операнды были в неправильном порядке. Вам не нужно указывать eax как закрытый, потому что eax является выходным регистром.
3 голосов
/ 10 июля 2011

также может работать с shll, являясь мнемоникой GNU для & lt; сдвиг влево длинного слова.Однако ошибка недопустимого операнда вызвана тем, что операнд должен быть первым!Я узнал об этом, когда погуглил эти источники: http://meplayer.googlecode.com/svn-history/r23/trunk/meplayer/src/filters/transform/mpcvideodec/ffmpeg/libavcodec/cabac.h. Я также использовал превосходный http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s6

Вот один способ, который работает, принимая во внимание наблюдение Иисуса Рамоса, что shiftted_value необходимо инициализировать:

jcomeau@intrepid:/tmp$ cat test.cpp; make test; ./test
#include <iostream>

using namespace std;

int main()
{
    int shifted_value = 1;
    char value = 2;

    __asm__("shll %%cl, %%eax;"
            : "=a" (shifted_value)
            : "a" (shifted_value), "c" (value)
           );

    cout<<shifted_value<<endl;

    return 0 ;
}

g++     test.cpp   -o test
4
...