1 //file: hello.c 2 3 #include <stdio.h> 4 5 int main() { 6 printf("hello,world! "); 7 return 0; 8 }
从一个源程序开始:hello.c
- 系统中所有信息都是由一串比特表示
- 只由ASCII字符构成的文件称为文本文件,其他文件都称为二进制文件
源程序hello.c编译过程
编译系统
- 编译过程分为4个阶段完成:预处理器、编译器、汇编器、连接器。
hello.c(源程序)
预处理:预处理器cpp修改源程序,将以字符#开头的代码#include<stdio.h>替换成系统头文件stdio的内容。
编译:编译器ccl 将hello.i 翻译成hello.s 汇编语言程序的文本文件。
汇编:汇编器as将hello.s 翻译成hello.o 机器语言指令(可重定位目标程序的格式)。
链接:hello程序调用了printf 函数,printf函数标准C库的一个函数,存在于printf.o的预编译好的目标文件中,连接器ld将其合并到hello.o程序中得到hello可执行文件。
到此,编译系统的翻译过程大功告成。
执行hello可执行文件
运行hello程序的过程
加载:
- shell程序从键盘读取“./hello”命令后,将字符逐一读入寄存器,再把它存到内存中。
- shell执行指令来加载hello可执行文件,将hello目标文件的代码和数据从磁盘复制到主存。(利用DMA直接存储器存取直接从磁盘到达主存)
运行:
- hello代码和数据被加载到主存,处理器就开始执行hello程序的main中的机器指令。这些指令将“hello,world ”字符串从主存复制到寄存器文件中,再从寄存器文件复制到显示设备,最终显示在屏幕上。