前言
处于期末考试中,所以…(此处省略一些狡辩的借口) 。其实就是本周除了完成了一个数据结构大作业,其他啥都没学
什么是计算机
- 计算机是一种能对数字化信息进行自动、高效算术和逻辑运算的处理装置。
冯.诺伊曼结构的主要思想
- 计算机应由运算器、控制器、存储器、输入设备和输出设备五个基本部件组成。
存储器
不仅能存放数据,而且也能存放指令,形式上两者没有区别,都是0/1序列,但计算机应能区分数据还是指令;控制器
应能自动取出指令来执行;运算器
应能进行加/减/乘/除四种基本算术运算,并且也能进行一些逻辑运算和附加运算;- 操作人员可以通过
输入设备
、输出设备
和主机进行通信
- 内部以
二进制表示
指令和数据。每条指令由操作码和地址码两部分组成。操作码指出操作类型,地址码指出操作数的地址。由一串指令组成程序。 - 采用
存储程序
工作方式。- 程序由指令组成,程序被启动后,计算机能自动取出一条一条指令执行,在执行过程中无需人为干预。
- 程序由指令组成,程序被启动后,计算机能自动取出一条一条指令执行,在执行过程中无需人为干预。
计算机是如何工作的?
程序在执行前
数据和指令事先存放在存储器中,每条指令和每个数据都有地址,指令按序存放,指令由OP、ADDR字段组成,程序起始地址置PC。
开始执行程序
- 根据PC取指令
- 指令译码
- 取操作数
- 指令执行
- 回写结果
- 修改PC的值,继续执行下一条指令
指令执行过程中,指令和数据被从存储器取到CPU,存放在CPU内的寄存器中,指令在IR中,数据在GPR中。
hello程序的生命周期
hello程序的生命周期是从一个源程序开始的,文件名是hello.c
。为了在系统上运行hello.c
程序,每条C语句都必须被其他程序转化为一系列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序(可执行目标文件)的格式打好包,并以二进制磁盘文件的形式存放起来。
在Unix系统上,从源文件到目标文件的转化是由编译器驱动程序完成的:
linux> gcc -o hello hello.c
在这里,GCC编译器驱动程序读取源程序文件hello.c
,并把它翻译成一个可执行目标文件hello
。
上述的翻译过程一共分为四个阶段(预处理、编译、汇编、链接),执行这四个阶段的程序(预处理器、编译器、汇编器、链接器)一起构成了编译系统。
C程序编译的四个阶段
-
预处理阶段:预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。
比如
hello.c
程序中的第1行的#include <stdio.h>
命令告诉预处理器读取系统头文件stdio.h
的内容,并把它直接插入程序文本中。这样我们就得到了以
.i
为文件扩展名的另一个C程序。 -
编译阶段:编译器(ccl)将文本文件
hello.i
翻译成文本文件hello.s
,hello.s
中包含一个汇编语言程序。该汇编语言程序中的每条语句都以一种文本格式描述了一条低级机器语言指令。
-
汇编阶段:汇编器(as)将
hello.s
翻译成机器语言指令,把这些指令打包成一种叫作可重定位目标程序的格式,并将结果保存在目标文件hello.o
中,hello.o
文件是一个二进制文件。 -
链接阶段:由于
hello
程序调用了printf
函数,而printf
函数存在于一个名为printf.o
的单独的预编译好了的目标文件中,所以这个文件必须以某种方式合并到我们的hello.o
程序中。链接器(ld)就负责处理这种合并,结果就得到
hello
文件,它是一个可执行文件,可以被加载到内存中,由系统执行。