c语言 - 此文件不应该以汇编语言开头吗



http://lxr.linux.no/#linux+v3.0.3/arch/x86/boot/header.S

这是CPU首先读取的第一个文件。这不应该从汇编语言开始吗。它以#include开头,所以include是C中的一个方法?

#include是预处理器的指令,而不是汇编程序的指令。预处理器与编译器无关。

这是文件的源代码。在作为操作系统的一部分使用之前,它会被编译成机器语言。

假设它是AT&T语法,您应该做的第一件事是查看GAS的手册,它是GNU binutils集合的一部分:

http://sourceware.org/binutils/docs-2.21/as/Preprocessing.html#Preprocessing

根据手册:

"您可以使用gnu C编译器驱动程序,通过给输入文件一个`.S'后缀来获得其他"CPP"风格的预处理。">

这意味着要通过GCC前端运行.S汇编文件来进行汇编,GCC前端为宏和#include命令应用C预处理器,然后将结果传递给GNU binutils汇编程序。

这是一个.S文件,因此它可以由C预处理器处理,其中#include是一个有效的C预处理器指令。如果它只是一个.s文件,那么它通常会被认为是一个"纯"gas语法汇编文件,至少从gcc的角度来看是这样。

#include是一个预处理器语句。编译器根本看不到它。

您正在查看一个源文件。它将被编译以生成汇编代码,然后通过链接器(在某些情况下是编译器(进行链接。链接器要做的是查看链接表和标题中的部分。S归档并以正确的方式排列。

这是预处理程序,在预处理状态之后,它将被一些其他代码取代,这些代码将包括文件的内容。之后,编译器将编译代码,其输出将由汇编程序汇编,由CPU读取并解码。

无论你用什么语言写什么代码,在执行之前都会被转换成机器代码。所有的C程序和所有其他程序都首先被转换成机器代码,然后CPU将读取该代码,而不是C语言语法。

最新更新