第 4 章:冯诺依曼架构¶
基本组成部分¶
一个冯诺依曼架构的计算机一般由 5 个部分组成:
- 内存
- 计算单元
- 输入
- 输出
- 控制单元
图:冯诺依曼架构
内存 Memory¶
16 GB 内存指什么?GB 在这里是 gigabytes,而 16 giga 等于 \(2^{34}\),后面的 bytes 代表一个内存单元里面有 8 个位(= 1 个字节)。16 GB 内存就是指这内存中有 \(2^{34}\) 个字节。
内存的读写¶
内存有它的两个寄存器,一个是关于地址的(MAR),一个是关于值的(MDR)。
当要读某个地方的内存值的时候,就往 MAR 里面写数据,然后给内存一个控制信号,让它把对应地方的值写进 MDR 里。
而要写某个地方的内存值的时候,就往 MAR 和 MDR 里面都写数据,然后给内存一个控制信号,让它把对应地方的值给改了就好了。
计算单元 Processing Unit¶
有个重量级的东西,叫做 Arithmetic and Logic Unit(ALU)。它可以执行一些操作,比如求两个值的和,以及取 AND、OR、NOT 什么的。
ALU 一般接收的用来运算的数都是定长的。这个长度叫做计算机的字长(word length)。比如现在的 CPU 基本上都是 64 位的字长了;8 位或者 16 位字长一般可以在非常廉价的处理器中看到。
输入、输出¶
可以说是计算机的外设来完成了输入输出,比如键盘、鼠标提供输入,而显示器什么的提供输出。
控制单元¶
它解析机器语言,向上面的所有东西发号施令。
它拥有一个储存机器码指令的寄存器 IR(instruction register);以及一个存储下一条指令的位置的寄存器,这个寄存器由于一些历史原因会被叫做 program counter(PC),不过它有个更好的名字叫 instruction pointer(IP)。
LC-3 是一种冯诺依曼计算机¶
图:LC-3 的数据通路
内存 MEMORY¶
拥有 \(2^{16}\) 个内存地址,每个地址有 16 位长。
它也有一个 MAR 和一个 MDR。
输入输出 INPUT / OUTPUT¶
输入部分由一个键盘负责。它也有两个寄存器:键盘数据寄存器 KBDR,存着现在被按下去的键的 ASCII 码;以及键盘状态寄存器 KBSR,存着键盘上有没有键被按下去。
计算单元 THE PROCESSING UNIT¶
里面有一个 ALU 和 8 个寄存器 R0 到 R7。LC-3 的 ALU 可以干加法、取 AND 和取 NOT。这么少?
控制单元 THE CONTROL UNIT¶
拥有一个 IR 和一个 PC。
指令周期¶
可以分为六步:
- 获得数据 FETCH
- 解码 DECODE
- 分析地址 EVALUATE ADDRESS
- 获取操作数 FETCH OPERANDS
- 执行 EXECUTE
- 存储结果 STORE RESULT
获得数据 FETCH¶
这一步将这一次的指令存到 IR 中。
- MAR 的值变成了 PC,然后把 PC 增加。
- 内存收到指令,把 MAR 对应地方的值放到 MDR 中。
- IR 的值变成了 MDR。
解码 DECODE¶
通过喂给解码器 IR 的 [15:12] 位(opcode),它可以确定到底要执行哪一种指令。(所以说LC-3 最多有 16 种指令。)
分析地址 EVALUATE ADDRESS¶
比如说 LD 指令这样的需要从内存中加载值的指令,有些指令需要动用内存。这一步会计算将要读取的内存的地址。
获取操作数 FETCH OPERANDS¶
这一步会把指令所需要的操作数准备好。比如在 ADD 中,这一步就会把所需要的两个寄存器的值(或者一个寄存器和一个立即数)发送到 ALU 中。
执行 EXECUTE¶
一切都准备好之后,就要开始计算了。
存储结果 STORE RESULT¶
这一步会往应该的地方存储结果,如果有结果的话。
打断:TRAP 指令¶
问题来了,我们怎么控制计算机开始与停止执行指令呢?这里提供了一种叫 TRAP 的指令,翻译成自陷指令,和中断指令差不多,区别在于 trap 是用户程序触发的,中断是硬件触发的。
TRAP 指令和其他指令一样,拥有自己的 opcode。