hello的实现过程

原创 2017年01月03日 17:34:29

在学习语言一开始我们都学习了打印hello这个字母,

无非就是

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



然后调试执行,屏幕就会输出一个hello的字段。但是我们知道计算机在处理程序时,他是以二进制的形式处理着,那究竟是怎样的呢!!!

我们了解了这些,我们想了解这个hello.c我们称之为源程序是在电脑中怎样走的,也就是说从我们写hello.c到 屏幕上输出hello,都经历了些什么,这让我想起了高中时生物课本里的放射性元素示踪法。

好奇推动的着我去发掘。

于是知道了一个源文件到我们可以可行程序文件的几个步骤      

一个源文件我们就拿hello.c 举例,要经过预处理器的加工再经过编译器的加工再经过汇编器的加工以再经过链接器的加工。最终形成了可执行程序。这又不得不让我想起了高中生物酶的生成过程,核糖体,高尔基体,内质网,还有细胞膜等。

那我们就看看预处理器究竟做了些什么,它在生成可执行程序的过程中起了什么作用。

预处理阶段:预处理(cpp)根据字符#开头的命令,修改原始的C程序。比如我们的hello.c里的第一行的#include<stdio.h>命令告诉预处理读取系统文件stdio.h文件的内容,并把它插入程序文本的中,结果就得到另一个C程序,通常以.i作为文件的扩展名。

我就在linux下编写了一个hello.c我看我将预处理后的文件命名为hello.i 我们就看看hello.i文件中有些什么(因为内容太多,我就截取了一小部分)

                     

我们可以看出我们的#include<stdio.h>被换成了一系列的文件。

2.我们在看看编译阶段是怎样的。

编译阶段:编译器(ccl)Complier Collection:作用将文本文件的hello.i翻译成hello.s 它包括以一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式确切地描述一条低级机器语言指令。汇编语言是非常有用的,最接近机器语言的一种语言,还有不同种的高级语言的不同种编译器器生成的汇编一样。这么说吧,不过你是哪java还是c++还是C写的hello源程序,经过不同的C编译器或者Fortran编译器输出的文件都是一样的。

我们就看看hello.s生成的文件是怎样的。

          

3.汇编阶段。汇编器(as)Assembler将hello.s翻译成机器语言指令,也就是转换为二进制指令,计算机可以真正运行的指令,它是通过这样处理,它 把这些指令打包成可重定位目标程序 并将所有的结果保存在目标文件中hello.o。目标英文(object) 就是一个二进制文件,它的里面装的全是二进制,而不是字符。我们以二进制的形式可以看看hello.o

我是以16进制形式查看的。如果我们文本格式查看直接就是一篇乱码

                                                                                                                          4.链接阶段                                                                                                                                                                                                                 hello调用了printf函数(看hello.s图)。这个函数它是由C编译器提供标准库C库提供的。ptintf函数本身存在一个printf.o的目标文件中,它早已经预处理好了,而这个文件通过某种方式就合并在我们的hello.o文件中,链接器就是负责合并,相当与一个“胶”。结果生成hello文件,这个文件就是我们所说的可执行文件,可以加载到内存中,由系统执行。现在它放在磁盘中。


像不像一个“酶”的产生过程。

还有gcc的一些参数,见下表



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

“hello world”驱动实现过程(ARM板上)

“helloworld”驱动实现过程(ARM板上) 1、  在/home/sxy/目录下新建hello_1文件夹,在此文件夹下编写hello.c和Makefile文件(假设已经编写好了),make生成...

Qt on Android:图文详解QT开发Andriod入门,Hello World全过程

这是系列文章中的一篇,阅读本文前请先阅读《Windows下Qt 5.2 for Android开发入门》,以便确保开发环境和作者一致。     部分文章被转发/转载却没有注明出处,特此声明:版权...
  • guo8113
  • guo8113
  • 2014年11月20日 20:00
  • 892

Hello World!的编译过程(C语言)

几乎所有学C语言编程的同学第一个接触的程序都是Hello World!。但是它是怎么由c文件转换为可执行文件的呢? 源文件(helloworld.c)如下:#include int main() {...

Linux下hello.ko内核模块制作的全过程

Linux下hello.ko内核模块制作的全过程 1. linux系统用的是Redflag 6.0 SP1 下载地址:ftp://ftp.redflag-linux.com/pub/redflag...

hello world解析执行过程

开篇 学习任何一门编程语言,都会从hello world 开始。对于一门从未接触过的语言,在短时间内我们都能用这种语言写出它的hello world。 然而,对于hello world 这个简单程...
  • basycia
  • basycia
  • 2015年12月25日 16:41
  • 873

【GCC】从hello.c到可执行文件的过程之预处理阶段

在Linux中,使用GCC编译程序的过程可以被分为四个阶段: 1、预处理(Preprocessing) 2、编译(Compilation) 3、汇编(Assembly) 4、链接(Linking) ...

Linux下hello.ko内核模块制作的全过程

原文地址::http://blog.csdn.net/jiankangshiye/article/details/6665179 相关文章 1、Linux内核模块自动加载机制 ----http:/...

Qt学习笔记(1) — 深入了解Hello World的创建过程

年初的时候就准备学习Qt了,因为工作原因被搁浅好久,现在开始学也不晚,以后每周更新2遍博文作为总结。学过Windows开发的,会觉得Qt很亲切,学起来不是很费劲(PS: 环境搭建比较简单,本文不作说明...

结合"hello world"探讨gcc编译程序的过程

结合"hello world"探讨gcc编译程序的过程   1. gcc简介   gcc/g++是GNU工程的C和C++编译器。都要用四个步骤中的一个或多个处理输入文件。 ...
  • wzwind
  • wzwind
  • 2011年08月10日 09:31
  • 327

fl2440开发板烧录过程——如何在开发板上运行Hello.c

1.        在虚拟机上交叉编译Hello.c文件; vim  hello.c      /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-g...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hello的实现过程
举报原因:
原因补充:

(最多只允许输入30个字)