在Linux下编译C文件时出现程序集错误

时间:2012-11-04 22:19:36

标签: c assembly

您好我正在尝试在我的计算机中编译简单的C程序,并在编译时从终端[见图像]下获得类似的消息,说明某种程序集错误。我不知道这是一个计算机内存/堆栈问题(虽然我已经重新启动了我的计算机)或其他任何东西,但我确切知道的是,我过去几天一直在以相同的方式编译C程序。

代码:

   #include <stdio.h>
   main(){
      printf("hello");
   }

输出:

/tmp/cconajAc.s:汇编程序消息: /tmp/cconajAc.s:9:错误:后缀或操作数对于'push'无效

请告诉我如何解决这个问题!

编辑:我刚从工作站换到另一个计算机实验室,它工作正常,没有任何装配错误。我的猜测是在另一个实验室的那些计算机中安装的开发工具中出错。我想现在这对我有用,虽然知道我在另一台计算机上出现问题的根源会很有趣。

5 个答案:

答案 0 :(得分:1)

错误似乎很奇怪,但请尝试向main()添加退货类型:int main()

答案 1 :(得分:1)

在vi编辑器中编写并将文件另存为“hello.c”:

 #include <stdio.h>
 int main() {   printf("hello");   return 0; }

检查是否安装了32位glibc标头 在ubuntu中尝试安装:
# apt-get install gcc-multilib

然后尝试:
# gcc -m32 -o hello hello.c

# gcc Wa,--32其他

# gcc -m32 --32

答案 2 :(得分:0)

如果它对其他人有帮助,对我来说,这似乎是由不匹配的工具链组件引起的 - 我有时必须使用外部dotfiles来修改我的PATH(为了满足复杂的构建系统,叹息)。汇编程序是/usr/bin/as,但gcc是一些古老的版本。

答案 3 :(得分:0)

错误:对于“push”

,后缀或操作数无效

检查您的系统架构:

# arch
x86_64   

# arch
i386

或者使用它:

#uname -m 
x86_64

在装配中: 32位(I386):

pushl instruction  ;notice the suffix is l

64位(x86_64的):

pushq instruction  ;notice the suffix is q

我想知道你的sys的arch是x86_64,当你使用32bit的指令时它会引发这个错误。 要解决这个问题:

#gcc -m32 -o test test.c

请参阅When should -m32 option of gcc be used?

答案 4 :(得分:0)

运行gcc时你在哪个shell?

尝试切换到tcsh / csh。我在bash中遇到同样的错误并将shell切换到tcsh。