这是一个 CSAPP-like 的系列博客
通用电子计算机历史
第一台通用电子计算机是宾夕法尼亚大学于1946年研制的ENIAC,它采用十进制,是可编程、图灵完备的电子计算机。
随后,Von Neumann 加入ENIAC的研制组,进行新的 “存储程序式通用电子计算机” EDVAC的研制,
为此冯诺依曼以"关于EDVAC的报告草案"为题发表了全新的"存储程序式通用电子计算机方案",
在该方案中,提出了冯诺依曼体系结构
然而第一台完成的存储程序计算机,是1949年剑桥大学研制的EDSAC,而非1951年完成的EDVAC
计算机系统的基本组成与基本功能
计算机是一种能对数字化信息进行自动、高速算术和逻辑运算的处理装置
冯·诺依曼结构
几乎所有的现代通用计算机都采用冯·诺依曼结构
冯·诺依曼结构的主要思想是:
- 计算机由运算器、控制器、存储器和 I/O设备 五个基本部件组成
- 各部件的基本功能是:
- 存储器不仅能存放数据,而且也能存放指令,形式上两者没有区别都是01序列(而是通过存储位置区分)
- 控制器可以自动取出指令,逐条执行
- 运算器能进行加减乘除四则运算,并且可以进行一些逻辑运算和附加运算
- 操作人员可以通过输入设备、输出设备和主机进行通信
- 计算机内部以二进制表示指令和数据,每条指令由操作码和地址码组成,操作码指出操作类型,
地址码指出操作数的地址;程序由一系列指令组成 - 采用存储程序工作方式
计算机要完成的工作都要先被编写成程序,然后将程序和原始数据送入主存并启动执行
一旦程序启动,计算机能在不需要人工干预的情况下,自动完成逐条取出指令并执行指令的任务
冯·诺依曼结构的计算机也称为冯·诺依曼机器
早期部件间用分散方式连接,现在部件间大多使用总线方式连接
计算机的工作方式:"存储程序"工作方式
数据和指令都按序存放在存储器中,存储器上每个存储单元都按一定的存储单位编址
- 指定起始PC位置
- 根据PC取指令
- 指令译码
- 取操作数
- 执行指令
- 回写结果
- 修改PC值
- 执行下一条指令
指令执行过程中,指令和数据被从存储器取到CPU,存放在CPU的寄存器中;指令在IR中,数据在GPR中;
指令中需给出的信息:
- 操作码(操作性质)
- 源操作数1 或/和 源操作数2 (单目运算/双目运算) (操作数形式:立即数、寄存器型号、存储地址)
- 目的操作数地址(结果:寄存器编号、存储地址)
存储地址的描述与操作数的数据结构有关
计算机实现的所有任务都是通过执行一条一条指令完成的
计算机中的基本部件(微结构)
CPU:中央处理器;PC:程序计数器;MAR:存储器地址寄存器;
ALU:算术逻辑部件;IR:指令寄存器;MDR:存储器数据寄存器;
GPRs:通用寄存器组(由若干通用寄存器组成,早期就是累加器);
总线:地址总线(AddressBus,AB),控制总线(ControlBus,CB),数据总线(DataBus,DB),
其中:
- 运算器(数据运算):ALU、GPRs、标志寄存器等
- 存储器(数据存储):存储阵列、地址译码器、读写控制电路
- 总线(数据传输):数据(MDR)、地址(MAR)和控制线
- 控制器(控制):对指令译码生成控制信号
程序开发和执行过程
机器语言
早期,程序都是用机器语言编写的,机器语言即是用01序列表示指令与数据
程序记录在纸带或卡片上,穿孔表示0,未穿孔表示1
使用按钮、开关输入;指示灯等输出
例如下面一段机器代码程序,此处假设0010表示某种跳转指令
0 : 0101 0110
1 : 0010 0100
2 : .... ....
3 : .... ....
4 : 0110 0111
5 : .... ....
6 : .... ....
上述程序在执行至第1条指令时,跳转到第四条指令
若逻辑程序逻辑稍稍改变,比如在2与3间加入一条指令
那么指令1就要重新计算跳转的地址了,再重新制作打孔卡片
且机器语言是与机器相关的,不同机器可能使用不同的机器语言
总之,虽然机器语言能直接被计算机执行,但机器语言并不适合写程序
汇编语言
在机器语言的基础上发展出了汇编语言
汇编语言程序由汇编指令构成,
汇编指令是用助记符和标号来表示、与机器指令一一对应的指令
指令:
包含操作码和操作数或其地址码
只能描述 存/取一个数;两个数间的运算(加减乘除与或 等);根据运算结果判断是否转义执行
add B
jc L0
......
......
L0: sub C
......
B: ......
C: ......
如上述程序,增加某行指令,无须再重新计算指令地址
汇编语言使用更便于阅读的符号,且增减指令无须修改其他指令中的指令地址
但是计算机并不能直接执行汇编语言程序,汇编语言程序需要用汇编程序(汇编器)转换为机器语言
且汇编语言与机器相关,可移植性差
汇编语言与机器语言均面向硬件,有时合称为机器级语言
总之,在程序的编写上,汇编语言优于机器语言,但是还是有点难办
高级程序语言
随着计算机科学与技术的发展,出现了许多高级编程语言
- 与具体机器结构无关(
辣鸡C语言,狗头) - 面向算法描述,抽象能力更强
- 一条语句可能对应几条,几十条,甚至几百条指令
- 有编程思想之分(面向过程、面向对象等)
- 处理逻辑基本包括:顺序结构,选择结构,循环结构
- 有两种转换方式
- 编译执行:将高级语言源程序转换为机器级目标程序,执行时只要启动目标程序即可
- 解释执行:每次执行时将高级语言程序逐条翻译成机器指令并立即执行,不生成目标文件
hello world 程序的转换处理过程
编辑好源程序hello.c,hello.c肯定是不能直接在计算机上执行的
在GCC/Linux平台下,hello.c(源程序 文本) 经预处理得到hello.i(源程序 文本),
再经编译得hello.s(汇编语言程序 文本),继续经过汇编得到hello.o(可重定位目标程序 bin),
hello.o与其他可能用到的.o文件(如 printf.o )链接后,得到可执行二进制程序hello
不同层次语言之间的等价转换入下
程序开发与运行环境
早期的程序由于是由机器语言编写,直接输入指令和数据,
启动时把第一条指令地址送入程序计数器PC即可
而高级语言需要复杂的支撑环境
语言处理系统:
编辑器:编辑源代码
翻译程序:
编译方式:预处理程序、编译器、汇编器、链接器
解释方式:解释器
操作系统:
人机接口:
图形用户界面(GUI)
命令行用户界面(CUI)
语言的运行时系统
操作系统内核
指令集体系结构
计算机硬件
语言处理系统运行在操作系统之上,操作系统利用指令管理硬件
计算机系统层次结构
计算机系统层次是与编程语言的抽象过程对应的
机器语言 | 汇编语言 | 高级语言 (现代(传统)计算机系统的层次) |
---|---|---|
应用程序 | 应用程序 | |
汇编程序 | 语言处理系统 | |
应用程序 | 操作系统 | 操作系统 |
指令集体系结构 | 指令集体系结构 | 指令集体系结构 |
计算机硬件 | 计算机硬件 | 计算机硬件 |
指令集体系结构是对计算机硬件的抽象,而机器语言直接编写指令,故应用程序直接构筑在指令集体系结构上
汇编语言出现之后,应用程序需要通过汇编程序翻译为指令,
而汇编语言程序的编写需要有与计算机交互的界面等,这些由操作系统来提供
现代高级语言出现后,高级语言编写的应用程序需要语言处理系统转换为机器指令,
程序的编写环境、运行环境也由操作系统提供
计算机系统的抽象层
下图中,上层是下层的抽象与应用。下层是上层的具体实现
且程序的执行结果不仅取决于算法、程序编写,而且取决于语言处理系统(翻译)、
操作系统(服务例程)、ISA及微体系结构
计算机系统的不同用户所在的层次:
可以看出,ISA是非常重要的层次,它是硬件的抽象,所有的软件都建立在ISA之上,ISA是软件和硬件的接口
指令集体系结构
指令集体系结构(ISA,Instruction Set Architecture,指令系统)
ISA是通用计算机系统中必不可少的一个抽象层,它是一种规约(Specification),规定了如何使用硬件,包括:
- 可执行的指令的集合,包括指令格式,操作种类,操作数类型等
- 操作数所能存放的寄存器组的结构,包括每个寄存器的名称、编号、长度和用途
- 操作数所能存放的存储空间大小、存放方式(大小端)和编址方式
- 指令获取操作数的方式,即寻址方式
- 指令执行过程的控制方式,包括程序计数器(PC)、条件码定义等
ISA和计算机组成(微结构)(IA-32、MIPS、ARM等)有很大关系,因为不同微结构的硬件组成有差别
计算机组成必须能够实现ISA规定的功能,如提供GPR等
同一ISA可以有不同的计算机组成,如有些指令可以由不同的硬件实现
本系列博客的内容:
2019/8/9