[英]compiling linux 0.0.1 => error: ‘asm’ operand has impossible constraints __asm__(“cld\n”
[英]Not compile in x86_32 ( error _ impossible contraint in __asm__ )
我在x86_64中编写此代码,并编译并运行良好,
__asm__("nop"
: "=eax"(foo)
: //"eax"(foo),"ebx"(bar)
: "eax"
);
但是当我尝试在其他机器(x86_32)上进行编译时,gcc会触发错误:S
inline1.c:6: error: impossible constraint in _asm_
我无法解决..:S
GCC版本::
未编译 :
tur@aso:~$ gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5.1' -- with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable- languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch -- enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
线程模型:posix gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5.1)
编译
git@srvcode:/home/git/code/asm$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6.1/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.1- 9ubuntu3' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++,go --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
线程模型:posix gcc版本4.6.1(Ubuntu / Linaro 4.6.1-9ubuntu3)
谢谢大家!
阿图尔
nop
是无操作数的指令。 如果内联中没有使用任何操作数,则gcc无法为使用的操作数分配任何寄存器,这可能是设置任何输入/输出寄存器失败的原因。 但是,指令没有修改寄存器,所以我很好奇为什么您认为需要保留eax
。
其次,在旧版本的gcc中,寄存器不能同时在输入/输出列表和Clobber列表上。 当然,自然会假定输入/输出列表上的寄存器是“密集的”。 为了向后兼容,最好调整该行为。
另外,您应该记住,内联汇编中的寄存器操作数不是使用其实际名称指定的(Clobber列表除外)。 而是使用描述寄存器的单个字母。 因此,对于eax
,我们有a
;对于ebx
,我们有b
,依此类推。 您可能还想阅读GCC内联汇编HOWTO ,它是有关该主题的信息的绝佳资源。
总结一下,类似的东西应该会更好:
__asm__("nop"
: /* no output */
: /* no input */
: "%eax" /* eax is clobbered */
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.