gcc内联汇编程序左移问题

时间:2011-07-10 07:18:09

标签: gcc assembly

我在编译下面的代码时遇到了问题。它也可能有逻辑错误,请帮忙。感谢,

#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 个答案:

答案 0 :(得分:3)

它也可以使用shll,作为“左移长字”的GNU at&t助记符。但是,无效的操作数错误是由于操作数需要先出现!当我搜索这些来源时,我发现了这一点: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

这是一种有效的方法,考虑到耶稣拉莫斯的观察,即需要初始化shift_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

答案 1 :(得分:3)

看起来应该是这样的     

__asm__(("shll %%cl, %%eax;"
            : "=a" (shifted_value)
            : "a" (shifted_value), "c" (value)
           );
正确代码的信用转到另一个答案,指出操作数的顺序不正确。 您不需要将eax指定为clobbered,因为eax是输出寄存器。