版权声明:转载,请注明出处 https://blog.youkuaiyun.com/wmaoshu/article/details/50575142
<span style="font-size:18px;">Hello world程序:
#include <stdio.h>
int main()
{
printf("hello, world\n");
}</span>
Hello world 程序的生命周期包括程序创建和程序执行,程序执行又可以细分为 系统运行、输出简单信息、终止程序。通过编译系统程序将程序创建的源文件转化成程序可执行的可执行目标文件。
一、程序创建:
Hello world程序的生命周期是从一个源程序(hello.c)开始的,源文件是由0/1位序列组成,8个位为一个字节,其中每个字节(包括换行符,看如下图就能明白)对应程序中每个文本字符,即ASCII标准。像hello.c这样,只由ASCII标准字符构成的文件为文本文件。其他文件为二进制文件。虽然这些文件都由0/1串构成,但是由于“上下文”环境的不同,所以,即使相同的0/1串被解释的意义可能不同。综上所述,信息是由位串和“上下文”决定的。
二、编译系统:
由于程序先是由高级程序语言编写,但在计算机上运行的只能是低级机器语言指令,为了实现这一步转化,这就由编译系统程序来完成,使得从文本文件转化成二进制文件。 一个编译系统程序包含预处理器(cpp)、编译器(ccl)、汇编器(as)、链接器(ld)构成。
预处理器(cpp):根据源程序中#开头的命令,对源程序做相应的修改,例如:#include <stdio.h>
#后是include <stdio.h>告诉预处理器读取系统头文件stdio.h中内容,并把它直接插入到程序中形成 hello.i被修改的源程序(文本文件)。
编译器(ccl):将高级语言翻译成汇编语言。形成hello.s 汇编程序(文本文件)
为什么选择将高级程序语言编译成汇编语言,而不是别的语言?
一为了统一性,为不同的语言不同的编译器提供通用的输出语言。二汇编语言就是对低级机器语言的包装,本身就是低级机器语言。
汇编器(as):把汇编语言进而转化成低级的机器语言 可hello.o重定位的目标程序(二进制文件)
此时的文件中就不再是字符了而是对应的机器语言。
连接器(ld):将预编译好的目标文件(printf.o)合并到可重定位目标文件中。形成hello可执行的目标文件(二进制文件)。最后可以被加载到内存中,由系统执行。
三、程序执行:
初始时,当我们输入shell命令 ./hello,shell程序将字符逐一读入寄存器中,再把它放入到存储器中。
Unix> ./hello(回车)
键入回车后,然后利用直接存储器存取(DMA)技术将可执行的目标文件中代码和数据从磁盘中复制到主存。
当hello文件加载完成之后,处理器开始从main开始执行这个文件,执行到printf("hello, world\n");时,将hello, world从主存复制到寄存器文件,再从寄存器文件中复制到显示设备上。
---------------------
作者:MaoTr
来源:优快云
原文:https://blog.youkuaiyun.com/wmaoshu/article/details/50575142
版权声明:本文为博主原创文章,转载请附上博文链接!