如何编译由GCC生成的asm?


74

我在玩一些汇编代码,有些事情困扰着我。

我编译这个:

gcc file.c -S -o file.S此产生一个很好的小片的汇编代码:

我的下一个问题确实是,我该如何编译此输出,我可以让GCC替我做吗?

Answers:


90

是的,您可以使用gcc来编译您的asm代码。使用-c进行如下编译:

这将给出名为file.o的目标代码文件。要调用链接器,请在上述命令之后执行以下操作:


30
您也可以使用gcc file.S -o file
BrenoLeitão2015年

“> as -o hello.o hello.s”怎么样?如www3.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html所示。好像处理的顺序是预处理(.i文件),编译( .s文件),组装(.o文件)和链接( .exe文件)。
user1677716

@ user1677716:是的,gcc -c如果给它一个.s文件,那就是运行的内容。您可以gcc -v用来查看其运行的命令,例如gcc -v -c foo.sgcc -v foo.s汇编和链接。链接部分比仅仅复杂ld foo.o; 它必须与CRT启动代码和包括libc(-lc)的库链接。
彼得·科德斯

51

gcc可以将汇编文件用作输入,并根据需要调用汇编器。不过有一个微妙之处:

  • 如果文件名以“ .s”(小写的“ s”)结尾,则gcc调用汇编器。
  • 如果文件名以“ .S”(大写的“ S”)结尾,则gcc在源文件上应用C预处理程序(即,它识别诸如的指令#if并替换宏),然后在结果上调用汇编程序。

因此,总的来说,您希望执行以下操作:


看起来工作正常,但收到错误消息:“格式错误的Mach-o文件”
Martin Kristiansen

我认为你必须使用.S前缀(大写),否则GCC检测到另一个文件类型(与失败.asm的实例)
让·弗朗索瓦·法布尔

11

您可以将汇编代码嵌入普通的C程序中。这是一个很好的介绍。使用适当的语法,您还可以告诉GCC您要与C中声明的变量进行交互。以下程序指示gcc:

  • eax应该是foo
  • ebx应该是bar
  • 执行汇编代码后,eax中的值应存储在foo中

\ n


4

是的,gcc还可以编译汇编源代码。另外,您可以调用as,它是汇编程序。(gcc只是一个“驱动程序”程序,它使用启发式方法来调用C编译器,C ++编译器,汇编器,链接器等。)


1
如何确定gcc会用作什么?
马丁·克里斯蒂安森

另外,我还有Intel的icc,他们使用什么汇编程序?
马丁·克里斯蒂安森

4
@Martin,要求gcc -v叙述其行动。
SK-logic



-1

2
这是一个简短的答案。您能补充些解释吗?也许您可以告诉我们这些参数的作用以及与其他答案相比您所做的不同。
GameDroids 2014年

GCC不会生成NASM语法,而是使用AT&T或生成GAS .intel_syntax noprefix。没有GCC和NASM选项的组合,您可以使用GCC将C编译为asm,然后使用NASM进行汇编。
彼得·科德斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.