linux - 无法在 x86_32 中编译(错误 _ __asm__ 中的不可能约束)

标签 linux gcc assembly

这段代码我是在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 列表)。相反,使用单个字母来描述寄存器。所以,我们有 a 代表 eaxb 代表 ebx,等等。您可能还想阅读 GCC Inline Assembly HOWTO ,这是获取有关该主题的信息的重要资源。

总而言之,类似的东西应该会更好:

__asm__("nop"
        : /* no output */
        : /* no input */
        : "%eax" /* eax is clobbered */
);

关于linux - 无法在 x86_32 中编译(错误 _ __asm__ 中的不可能约束),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10279767/

相关文章:

php - 旧浏览器中带有https的错误网站

c++ - 尽管安装了 g++,但仍找不到 ncurses.h

c++ - 模板和 decltype 中不完整类型的无效使用

c++ - 编写自定义 GetModuleHandle 函数的原因是什么?

使用 C 中的内联汇编器计算字符串的大小

c - 从 c 调用汇编函数

php - 树莓派相机流媒体不会从 php 开始

java - Netty WebSocket 客户端 channel 在 Linux 服务器上总是处于非 Activity 状态

linux - "memory cache"和 "memory pool"之间的区别

c - 将 C 文件中的符号导入链接描述文件