我在编译下面的代码时遇到了问题。它也可能有逻辑错误,请帮忙。感谢,
#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'
,后缀或操作数无效答案 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是输出寄存器。