什么是结构FO gcc的汇编输出

问题描述:

我试着去学习汇编,首先我使用NASM的编译名称,但后来我明白,我可以在GCC使用.S文件。这让我非常感兴趣,因为我的目标是能够为自定义语言编写一个编译器,所以这非常有趣,因为它允许我使用c代码进行链接和编译。如此充满激情,我开始用gcc编译c程序集(.s文件),并对它进行了examen。正如我这样做,它接缝的结构与NASM组装不同,只有主标签,f.eks,而不是_start和其他奇怪的结构,并且我不是在谈论Intel-与AT语法。所以后来我的问题如下:什么是结构FO gcc的汇编输出

它是一个不同的结构,在正常的组装和在GCC的.s文件中,或者只是我没有装配足够好的knowlage?如果它是不同的结构,它是否有名字?

我一直在想我的方式谷歌这几个小时,但是当我搜索GCC汇编,和其他的东西我能想到的,我只得到ç内联汇编...

请帮帮忙,IM因为没有弄清楚这一点而变得疯狂。

+3

除非你使用GCC的'-nostartfiles'选项有发生,因为该入口点是在_C_启动运行时代码没有'_start'标签(未在输出'.s'文件所示)。这种情况下的入口点是'main'和'main'符合CDECL调用约定。 –

+2

您可能正在寻找'as':http://sourceware.org/binutils/docs/as/顺便说一下,我认为如果您打算编写LLVM IL而不是汇编语言,你自己的编译器。 – tkausl

+0

即使在NASM中,您也可以编写符合您的目标平台ABI的编译函数,然后您可以将它与C/C++代码连接在一起,这实际上是如何在应用程序中使用汇编的合理方式之一, ASM中很少有关键的小部分,并且大部分都保存在C++中。对于.s文件没有任何额外的魔力,使它们以某种方式更加可用于链接,您可以遵循相同的规则,并在NASM中定义全局标签。然后可以使用gcc进行链接,因为它会默认添加C运行库lib(为您节省一些链接器配置的工作)。 – Ped7g

GCC发出用于全部的存在于翻译单元的功能的定义。 (除非它们是static inlinestatic且未使用,或者它选择将它们内联到任何地方......)。

CRT启动文件(缺省情况下由gcc链接,每次编译时不从源重新构建)提供了_start的定义以及您在拆卸二进制文件时将看到的其他函数。他们只是在链接阶段链接的,不作为编译.c.s的一部分,这样你就不会看到他们在gcc -S输出。

相关:How to remove "noise" from GCC/clang assembly output?上使编译器ASM输出人类可读的提示。