计算机组成原理

组成原理在计算机系统中的位置:

image-20211025081943461

目的与意义:

构建系统框架,以建立完整计算机系统概念。

image-20211025082245181

学习路线:

image-20211025110640761


00 - 概述

0-1 计算机发展简史

  • IAS通用计算机模型机:冯·诺依曼结构 (真空管/电子管)
  • IBM360系列机:引入兼容性(系列机)概念 (晶体管)
  • DEC PDP-8:引入总线结构 (SSI/MSI 小规模/中规模集成电路)
  • LSI/VLSI/ULSI (大规模/甚大规模/超大规模集成电路)

*注:(普林斯顿高等研究院 the Institute for Advance Study at Princeton,IAS )

0-1-1 第一代(冯·诺依曼)(1946 - 1957)

五个基本部件:运算器 + 控制器 + 存储器 + 输入设备 + 输出设备

  1. 运算器:算术运算 + 逻辑运算 + 附加运算
  2. 控制器:应该能自动执行指令
  3. 存储器:存放数据 + 存放指令
  4. 输入输出设备:操作人员通过I/O与主机进行通信

内部以二进制表示数据和指令【每条**指令由操作码和地址码两部分组成**】;采用“存储程序”工作方式。

0-1-2 第二代(晶体管)(1958 - 1964)

元器件:逻辑元件采用晶体管;内存由磁芯构成;外存由磁鼓和磁带。

特点:变址;浮点运算;多路存储器;I/O处理机;中央交换结构(非总线)

软件:使用高级语言,提供系统软件

0-1-3 第三代(集成电路)(1965 - 1971)

元器件:逻辑元件与主存储器均有集成电路(IC)实现

特点:微程序控制,Cache,虚拟存储器,流水线等

0-1-4 第四代(L/VL/ULSI+半导体)(1972 - )

元器件:微处理器 + 半导体存储 技术发展迅猛

特点:共享存储器,分布式存储器大规模发展并行处理系统


0-2 计算机系统的组成和层次结构

计算机组成

  • 硬件:CPU + MM + I/O
  • 软件:系统软件 + 应用软件

计算机层次结构

  • 硬件和软件的接口:指令系统
  • 计算机软件如何在硬件上执行

0-2-1 计算机组成

image-20211025092558232

  • CPU:中央处理器
    • PC:程序计数器
    • ALU (Arithmetic Logic Unit ):算术逻辑部件
    • IR:指令寄存器
    • MAR:存储器地址寄存器
    • MDR:存储器数据寄存器
    • GPRs:通用寄存器(由若干通用寄存器组成,早期就是累加器)

0-2-2 工作流程

程序由指令组成

  • 执行前(采用“存储程序”工作方式,程序由指令组成,启动后计算机逐条执行)
    • 数据和指令都存放到存储器,每条指令和每个数据都有地址
    • 指令按序存放;由OP, ADDR字段组成
    • 程序起始地址置PC
  • 执行中(指令和数据从存储器提取存放到CPU中的寄存器(指令存放IR,数据存放GPR)中)
    1. 根据PC取指令
      • 操作性质(操作码)
      • 源操作数/源操作数2 (立即数,寄存器编号,存储地址)
      • 目的操作数地址(寄存器编号,存储地址)
    2. 指令译码
    3. 取操作数
    4. 指令执行
    5. 回写结果
    6. 修改PC值
  • 继续执行下一条指令

0-2-3 计算机层次结构

image-20211025103332696

SOFTWARE 软件

  • 系统软件
    • 操作系统
    • 语言处理系统
      • 翻译程序
        • 汇编程序(汇编语言源程序 –> 机器目标程序)
        • 编译程序(高级语言源程序 –> 汇编/机器目标程序)
        • 解释程序(将高级语言语句逐条翻译成机器指令并立即执行,不生成目标文件)
    • 其他实用程序(磁盘碎片整理程序、备份程序)
  • 应用软件


01 - 数据的机器表示

image-20211025112932120

1-1 数值数据的表示

三要素:

  • 进位计数制(二进制、八、十、十六进制 及 相互转换
  • 定点、浮点表示(解决小数点问题)
    • 定点正数、定点小数
    • 浮点数(一个定点整数和一个定点小数来表示)
  • 如何用二进制编码(解决正负号问题)
    • 原码、补码、反码(少见)、移码

1-1-1 补码的表示

特性——模运算( ‘+’ 和 ‘-‘ 的统一)。

结论1:一个负数的补码等于模减该负数的绝对值。

结论2:对于某一确定的模,某数减去小于模的另一数,总可以用该数加上另一数负数的补码来代替。

二进制中,一个负数的补码等于对应正数补码的“各位取反、末位加1”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//例如,十二进制中
-4的补码 ≡ 12 - |-4| ≡ 8
e.g.
7-4
≡ (7+8) mod 12
≡ 15 mod 12
≡ 3

//二进制
e.g.
0111 1111 - 0100 0000
≡ 0111 1111 + 1100 0000 mod 2^8
≡ 1 0011 1111 mod (1 0000 0000)
≡ 0011 1111

e.g.3 8-bit range

image-20211025151114274

1101 0110 -010 1001+0000 0001 = -010 1010 = -(2+8+32)=-42

1-1-2 移码的表示

一般来说,当编码位数为n时,偏置常量取 2^(n-1)

1
2
3
4
5
6
7
8
9
E.g. 
n=4 : E移 = E+ 23 ( bias= 2^3 =1000B)

-8 (+8) ~ 0000B
-7 (+8) ~ 0001B

0 (+8) ~ 1000B

+7 (+8) ~ 1111B

特性:移码主要用来表示浮点数阶码!便于浮点数加减运算时的对阶操作(比较大小)。

image-20211025152331395

1-1-3 无符号整数 vs 有符号整数

① 扩充操作

e.g. MIPS提供了两种加载指令(load byte unsigned / load byte)

- 无符号数 lbu $t0, 0($s0) 【$t0高24位补0】(0扩展)
- 有符号数 lb $t0, 0($s0) 【$t0高24位补符】(符号扩展)
② 数的比较
  • 无符号数:MSB为1的数比MSB为0的数大(MSB:最高有效位)
  • 带符号整数: MSB为1的数比MSB为0的数小
1
2
3
4
5
6
7
8
//若
$s0 = 1111 1111 1111 1111 1111 1111 1111 1111
$s1 = 0000 0000 0000 0000 0000 0000 0000 0001

sltu $t0, $s0, $s1 //无符号数 (set less than unsigned)
slt $t1, $s0, $s1 //带符号整数 (set less than)
//结果
// $t0 : 0; $t1 : 1
③ 溢出判断
  • MIPS规定:无符号数运算溢出时,不产生“溢出异常”

1-1-4 科学计数法 & 浮点数

① IEEE754标准 - 32位浮点数

image-20211025174516124

image-20211025173851707

  • E是阶码,用移码表示
  • M是尾数,表示值为1.M,1为隐含值
  • 1≤E≤254: X = (-1)s * 2^(E-127) * 1.M 规格化的浮点数
  • E=0, M=0: 表示机器0
  • E=255, M=0: 表示一个无穷大的数
  • E=255, M!=0: 表示一个非数值
② IEEE754标准 - 64位浮点数

image-20211025175113316

image-20211025175124076


1-2 非数值数据的表示

1-2-1 逻辑数据

  • 表示
    • 用1位表示。例如,真:1 / 假:0
    • n位二进制数可表示n个逻辑数据,或一个位串
  • 运算
    • 按位进行
    • 如,按位与 / 按位或 / 逻辑左移 / 逻辑右移 等
  • 识别
    • 逻辑数据和数值数据在形式上并无差别,也是一串0/1序列,机器靠指令来识别
  • 位串
    • 用来表示若干个状态位或控制位(OS中使用较多)

1-2-2 西文字符

  • 特点
    • 只对有限个字母和数学符号、标点符号等辅助字符编码
    • 所有字符总数不超过256个,使用7或8个二进位可表示
  • 表示(常用编码为7位ASCII码)
    • 十进制数字:0/1/2…/9 【48-57】
    • 英文字母:A/B/…/Z/a/b/…/z 【65-90;97+122】
    • 专用符号:+/-/%/*/&/……
    • 控制字符(不可打印或显示)
  • 操作
    • 字符串操作。如:传送/比较 等

1-2-3 汉字

  • 特点
    • 数量巨大,总数超过6万字
    • 给汉字在计算机内部的表示、汉字的传输与交换、汉字的输入和输出等带来了一系列问题
  • 编码形式
    • 输入码:对汉字用相应按键进行编码表示,用于输入
    • 内码:用于在系统中进行存储、查找、传送等处理
    • 字模点阵或轮廓描述:描述汉字字模点阵或轮廓,用于显示/打印

1-3 数据宽度、存储排列、纠/检错

1-3-1 数据的基本宽度

  • bit是计算机中处理、存储、传输信息的最小单位
  • byte是二进制信息的计量单位
    • 计算机存储器按byte编址,byte是最小可寻址单位
  • 字 (word) /字长
    • “字”表示被处理信息的单位,用来度量数据类型的宽度。
    • “字长”等于CPU内部总线的宽度、运算器的位数、通用寄存器的宽度等
    • 字和字长的宽度可以一样,也可不同。

1-3-2 数据量的度量

  • 容量 KB/MB/GB/TB (Byte)
  • 通讯中带宽 Kb/s Mb/s Gb/s Tb/s (bit)

1-3-3 程序中数据类型的宽度

C声明 典型32位机器 Compaq Alpha 机器
char
short int
int
long int
1
2
4
4
1
2
4
8
char* 4 8
float
double
4
8
4
8

1-3-4 ★数据的存储和排列顺序

ISA设计需要考虑到的问题

  • 如何根据一个地址取到一个32的字【字的存放问题】
  • 一个字能否存放在任何地址边界【字的边界对齐问题】
① 大端方式 Big Endian

MSB所在地址是数的地址,如,IBM 360/370, Motorola 68k, MIPS, Sparc, HP PA

【高位字节排放在内存的低地址端】

② 小端方式 Little Endian

LSB所在地址是数的地址,如,Intel 80x86, DEC VAX

【低位字节排放在内存的低地址端】

③ 例

image-20211026102730194

1-3-5 字节交换问题

  • 每个系统内部是一致的,但在系统间通信时可能会发生问题!
  • 因为顺序不同,需要进行顺序转换

例如,音、视频和图像等文件格式或处理程序都涉及到字节顺序问题

  • Little endian: GIF, PC Paintbrush, Microsoft RTF, etc
  • Big endian: Adobe Photoshop, JPEG, MacPaint, etc

1-3-6 对齐

要求数据的地址是相应的边界地址。

目前机器字长一般为32位或64位,而存储器地址按字节编址,指令系统支持对**字节、半字、字及双字的运算**,也有位处理指令。

各种不同长度的数据存放时,有两种不同的处理方式

  • 按边界对齐(以存储字的宽度为32位,按字节编址为例)
    • 字地址:4的倍数(低2位为0)
    • 半字地址:2的倍数(低位为0)
    • 字节地址:任意
  • 不按边界对齐
    • 坏处:可能会增加访存次数

1-3-7 校验码

① 奇偶校验码

在数据码之外增加1位校验码。

  • 奇校验码:使整个校验码的1的个数为奇数。
    • image-20211026112125990
  • 偶校验码:使整个校验码的1的个数为偶数。
    • image-20211026112137004

例子

数据码 偶校验码 奇校验码
0 0 0 1 0 0 0 1 1 0 0 0 1 0
0 1 0 1 0 1 0 1 0 0 1 0 1 1
② 海明检错与纠错码

太复杂不想看了

③ 循环冗余码(CRC)

计算机网络里学


02 - 运算方法和运算部件

2-1 运算和运算部件

不同层次程序员看到的运算及ALU。

2-1-1 高级语言程序中涉及的运算

  • 算术运算
    • 无符号数、带符号整数、浮点数的 + - * / 运算
  • 按位运算
    • 用途:对位串实现掩码操作或其他处理(主要用于多媒体数据或状态/控制信息进行处理)
    • 操作:|(按位或) &(按位与) ~(按位取反) ^(按位抑或)
  • 逻辑运算
    • 用途:关系表达式 e.g. or and not
    • 操作:|| && !
  • 移位运算
    • 用途:提取部分信息;扩大/缩小数值 2 4 8 …… 倍
    • 操作:>> <<
  • 位扩展和位截断运算
    • 用途:类型转换时可能需要数据扩展或截断
    • 操作:无专门运算符

2-1-2 ALU

image-20211026124227162

  • 全加器、串行加法器、先行进位加法器
  • 串行ALU、先行进位ALU(单级/多级)
  • MSI芯片级联、直接做在CPU芯片内

2-2 定点数运算

2-2-1 n位整数加/减法运算器

2-3 浮点数运算


03 - 指令系统

Instruction Set

  • 指令系统的设计
  • 程序的机器级表示

3-1 指令系统的设计

指令系统处在计算机软件/硬件的交界面上,同时被硬件设计者和系统程序员所关注,也决定了计算机的性能和成本。

  • 硬件设计者:指令系统为CPU提供功能需求,要求易于硬件设计
  • 系统程序员:通过指令系统来使用硬件,要求易于编译器的实现

3-1-1 指令内容

一条指令应该明显或隐式包含的信息有哪些?

  • 操作码:指定操作类型
    • 操作码长度:固定/可变
  • 源操作数参照:一个或多个源操作数所在的地址
    • 操作数来源:主(虚)存 / 寄存器 / I/O端口 / 指令本身
  • 结果值参照:产生的结果存放何处(目的操作数)
    • 结果地址:主(虚)存 / 寄存器 / I/O端口
  • 下一条指令地址
    • 下条指令地址 :主(虚)存
    • 正常情况隐含在PC中,改变顺序时由指令给出

3-1-2 指令的类型

  • 零地址:op
  • 一地址:op a1
  • 二地址:op a1 a2
  • 三地址:op a1 a2 a3
  • 多地址:用于成批数据处理的指令,如:向量 / 矩阵等运算的SIMD指令。

3-1-3 指令执行周期

image-20211026172350684

3-1-4 操作数类型和存储方式

操作数是指令处理的对象,与高级语言数据类型对应。

  • 地址(指针)
    • 视作无符号数,用来参加运算/确定主(虚)存
  • 数值数据
    • 定点数(整数):一般用二进制补码表示
    • 浮点数(实数):大多数机器用IEEE
  • 位、位串、字符和字符串
    • 文本、声音、图像
  • 逻辑(bool)数据
    • 按位操作

3-1-5 ★寻址方式

根据地址找到指令或操作数的方法。地址码编码由操作数的寻址方式决定。

编码原则:

  • 指令地址码尽量短
  • 操作数存放位置灵活,空间应尽量大
    • 利于编译器优化,产生高效代码
  • 地址计算过程尽量简单
① 指令寻址
  • 正常:PC增值
  • 跳转(jump / branch / call / return):同操作数的寻址
② 操作数寻址
  • 操作数来源:寄存器、外设端口、主(虚)存、栈顶
  • 操作数结构:位 / 字节 / 半字 / 字 / 双字 / 一维表 /二维表 / ……

通常寻址方式特指操作数的寻址方式。

③ 方式的确定
  • 无专门的寻址方式位(由操作码确定寻址方式)
    • 如MIPS指令,一条指令中最多仅有一个主(虚)存地址,且仅有一到两种寻址方式,Load/store型机器指令属于这种情况。
  • 有专门的寻址方式位
    • 如x86指令,一条指令中有多个操作数,且寻址方式各不相同,需要各自说明寻址方式,每个操作数都有专门的寻址方式位
④ 基本寻址方式

A:地址字段值 R:寄存器编号 EA:有效地址 (X):X中的内容

方式 算法 主要优点 主要缺点
立即 操作数=A 指令执行速度快 操作数幅值有限
直接 EA=A 有效地址计算简单 地址范围有限
间接 EA=(A) 有效地址范围大 多次存储器访问
寄存器 操作数=(R) 指令执行快,指令短 地址范围有限
寄间接 EA=(R) 地址范围大 外存储器访问
偏移 EA=A+(R) 灵活 复杂
堆栈 EA=栈顶 指令短 应用有限
⑤ ★偏移寻址方式 EA=A+(R)

R可以为 PC、B、I。( B:基址寄存器 I:变址寄存器)

  • 相对寻址 EA = A + (PC)
    • 相对于当前指令处位移量为A的单元
    • 指令地址码给出一个偏移量(带符号数)A
    • 基准地址隐含由PC给出
    • 用来实现程序(公共子程序)的浮动指定转移目标地址
  • 基址寻址 EA = A + (B)
    • 相对于基址(B)处位移量为A的单元
    • 指令地址码给出一个偏移量A
    • 基准地址明显或隐含由基址寄存器B给出
    • 用来实现多道程序重定位过程调用中参数的访问
  • 变址寻址 EA = A + (I)
    • 相对于首址A位移量为(I)的单元
    • 指令地址码给出一个基准地址A
    • 循环重复操作提供一种高效机制,实现对线性表的操作
⑥ 指令格式

3-2 程序的机器级表示

【未完 学半道发现不考】

dark
sans