计算机小白对C语言”hello world“程序运行的深入理解希望对你有所帮助

本文详细解析了C语言HelloWorld程序在计算机系统中的运行步骤,从源文件开始,经过预处理、编译、汇编和链接四个阶段,最终形成可执行文件。文章阐述了预处理器如何处理#include指令,编译器如何生成汇编代码,汇编器如何转为机器指令,以及链接器如何合并目标文件和库函数,形成完整的可执行程序。
摘要由CSDN通过智能技术生成

计算机小白对C语言“hello world”程序的深入理解

这篇文章主要是自身对***hello world***程序在计算机系统中如何运行的理解和体会,希望阅读这篇文章对你有些许帮助,可能在我们的日常编码中,对于hello world程序很熟悉,输出hello world,感觉像1+1=2一样,理所当然,但是往往在编码中,我们不仅仅要知其然,还要知其所以然,废话我就不多说了,下面是我的自身体会。
下面展示一些 内联代码片

// A code block
// hello.c程序代码
#include <stdio.h>;

int main()
{
		printf("hello world\n");
		return 0;
}

代码很简单,首先理解我们需要从生命周期开始,它是从一个源文件开始的,源程序(或者说源文件)实际上就是一个由1和0组成的位(又称为比特)序列,每一个字节表示程序中的某些文本字符。如果说我们用ASCII码将其替换,就会变成文本文件,又称为二进制文件。
为了能在系统上运行hello.c程序,必须把每条C语句变成低级机器语言指令,然后把这些指令按照一种称为可执行目标程序的格式打包好,并且需要以二进制磁盘文件的形式存放起来,目标程序又称为可执行文件,如果说我们在Unix系统上运行,是从源程序到目标文件,由编译器驱动程序完成的。
下面展示一些 内联代码片

// A code block
// Unix系统运行
linux> gcc -o hello hello.c

在这里GCC编译器驱动程序读取源程序文件 hello.c ,并把翻译成一个可执行目标文件 hello。 但是我们需要了解翻译过程可被分成四个阶段完成,执行这四个阶段的程序(预处理器 ,编译器 ,汇编器, 和链接器)一起构成了编译系统。如图一图一

首先是预处理阶段,预处理器(cpp)根据以字符#开头的命令,修改原始的C程序,如代码中的下面展示一些 内联代码片

// A code block
// An highlighted block
#include <stdio.h>;

命令告诉预处理器读取系统头文件stdio.h的内容,把它直接插入程序文本中,会得到另一个C程序,通常是以.i作为文件扩张名。

编译阶段。编译器(ccl)将文本文件hello.i 翻译成文本文件 hello.s,在它之中有一个汇编语言程序,其中还包含了函数 main的定义下面展示一些 内联代码片

// A code block

// An highlighted block
1 main:
2	subq  $8,  %rsp
3	movl  $.LCO,  %edi
4	call  puts
5	movl  $0,  %eax
6	addq  $8,  %rsp
7	ret

在定义中2~7行的每一条语句都以一种文本格式描述了一条低级机器语言指令。

汇编阶段,接下来,汇编器(as)将hello.s翻译成机器语言指令,并把这些指令打包成一种叫做可重定位目标程序的格式,且将结果保存在目标文件hello.o中。此时hello.o文件是一个二进制文件,在他中有17个字节是函数main的指令编码,但是此时我们在文件编辑器中打开hello.o文件时,看到是一堆乱码

最后则是链接阶段,但是我们会注意到,hello程序所调用printf函数,它是C编译器提供的标准库中的函数,所以printf函数会存在一个名为printf.o的单独的预编译好了的目标文件中,因为我们要输出hello world,那么这个文件,必须以某种方式合并到我们的hello.o程序中,而链接器(id)就负责处理这种合并,最后我们便得到一个hello文件,它是一个可执行目标文件,被加载到内存中,由系统执行。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值