计算机组成原理学习笔记(持续更新)

[toc]

第一章:概论

计算机系统组成

软件+硬件=计算机系统

硬件和软件相辅相成,相互依存,缺一不可。

软硬件相互依存,协同发展,在逻辑上等价。

计算机系统的层次结构

不同层次的使用者看到的计算机功能属性也不同。

存储程序计算机

存储程序计算机特点

  • 由运算器、控制器、存储器、输入设备和输出设备五大部件组成
  • 指令和数据均用二进制数表示
  • 指令和数据以同等地位存放于存储器内,并可按地址访问
  • 指令由操作码和地址码组成
  • 指令在存储器内按顺序存放(下一条指令放在IP中)

计算机硬件组成

总线结构

现代计算机大多采用总线结构,总线将计算机各部件连接在一起,形成为一个完整的计算机硬件系统。总线也成为各部件间传输信息的公共通道。

输入输出

I/O 子系统完成人—机交互功能。包括各种I/O 设备及相应的接口。设备通过接口与主机联系,接收控制器发来的各种控制命令,并完成相应的操作。

输入设备:将人们熟悉的信息形式转换为机器能识别的信息形式

输出设备:将机器运算结果转换为人们熟悉的信息形式

注意显卡也是I/O设备。

主存储器

主存储器(简称主存)是计算机的主要工作存储器,存放正在运行的程序和数据。主存包括存储体、各种逻辑部件及控制电路等。

控制器

由程序计数器PC、指令寄存器IR 、时序逻辑以及控制单元CU 组成。

是计算机的指挥中心,由它发出控制命令。

1569485100489

运算器

进行数据加工处理。核心是算术逻辑运算单元ALU,还包含一些寄存器,用来暂存参与运算的数据以及运算结果。

计算机程序运行

硬件运行程序的必要条件

程序已被转换为机器指令序列,即可执行程序

可执行程序已经加载到主存储器中,并将起始地址置于PC

运行过程

取指令、分析指令

1569486286259

执行指令

1570161714029

计算机系统性能

性能 = 功能 + 质量

硬件子系统性能和软件子系统性能共同决定一台计算机系统的性能。

计算机系统的性能只能通过各类软件在硬件上运行而体现出来。

运算速度

吉普森法:

T_{M} =\displaystyle\sum_{i=1}^{n} f_it_i

TM —— 程序综合运行时间

fi ——第 i 种指令占程序全部指令的百分比数

ti —— 第 i 种指令的执行时间

常用单位:

  • MIPS 每秒执行百万条指令数
  • CPI 执行一条指令所需的时钟周期数
  • FLOPS 每秒浮点运算次数

字、字节、位的关系与区别

位(bit)

位又叫比特,是计算机存储的最小单位

1、0表示一位,00、01、10、11表示两位,以此类推。所以n位可以表示2^n种状态。

字节(Byte)

字节是计算机存储中处理数据的基本单位

一个字节一般规定等于8位,因此一个字节的范围就是00000000b~11111111b(b表示二进制),即1B=8b。

字(word)

字是计算机一次处理数据的最大单位

计算机中大多数寄存器的大小是一个字长。也就是说计算机一次可以处理一个字的数据。

字和字长的关系不是固定的,一般等于字节的整数倍。

64位计算机就说明计算机的机器字长为64位,一次可以处理64位的数据,也就是8字节的数据。

需要注意的是,有种说法是一个字规定为两个字节。这是因为早期8086是16位的,那时候一个字就是两个字节。后来8086发展出了32位,这时候一个字到底是32位还是16位就说不清楚了,为了不混淆,就硬性规定了一个字为两个字节,而把32位的叫双字,后来64位的叫四字。但是在计组这门课中,字还是根据机器字长来决定

KB、MB、GB……到底是10次幂还是2次幂

存储器以二进制计算容量,最小单位是Byte,简写为B。实际上,标准二进制乘数词头(也就是2次幂)的缩写为Ki、Mi、Gi……

  • 1KiB = 1024B = 2^10B(Byte)
  • 1MiB = 1024KiB = 2^20B

而K,M、G等词头则是国际单位制,也就是按10次幂计算

  • 1KB = 1000B = 10^3B
  • 1MB = 1000KB = 10^6B

但是,二进制乘数词头没有被广泛采用,标识为4GB的内存实际上已经是4GiB。

因此,在以后遇到计算容量,就按2次幂计算。但是特别注意在计算存储器带宽时还是用10次幂计算。

第一章例题

Q:你如何理解硬、软件逻辑等价性?

A:

  • 计算机系统结构中,除最基本的功能必须由硬件实现外,其余功能既可以由硬件实现,也可以由软件实现。
  • 对某个特定功能来说,由硬件还是软件实现后所能到达的计算机系统的性能是有差异的。
  • 通常,某个特定的功能由硬件实现比用软件实现的执行速度快,但是成本高。软件实现的灵活性好。

Q:存储程序计算机中,CPU正在执行的程序所包含的指令和数据均以二进制形式存储于主存储器,CPU需要区分指令和数据吗?为什么?CPU如何区分?

A:

  • 需要区分。
  • 因为CPU将指令和数据从存储器中取出后要进行不同的操作。取出指令后放到指令寄存器IR中,然后进行指令译码等操作。而取出数据后放到数据寄存器中,进行算数/逻辑等操作。
  • CPU通过不同的时间段来区分指令和数据。取指周期取出的即为指令,执行周期取出的即为数据。

Q:讨论将程序和数据存放在同一存储器中的优缺点。

A:

  • 优点:主存只有一个地址空间,编程简单,管理容易,空间利用率高。
  • 缺点:指令与数据共享存储器访问总线,效率较低。

Q:存储程序计算机中,指令在主存中按顺序存放,其优点是什么?

A:

  • 可以较为方便地按顺序存放和按顺序读取和执行。
  • 顺序执行时指令寻址可以PC自增完成。
  • 顺序执行时,指令中不需要给出下一条指令的地址,有利于缩短指令字长度。

第二章:指令系统

要想学习指令系统,首先要了解指令是如何存放在电脑中的。要想学习指令存储的知识,首先要了解主存储器。

主存编址方式

主存单元的地址编排方式。编址方式决定了主存的能被CPU访问的最小单位.

编址方式

  • 主存的最小编址单位是一个字。
  • 对主存数据的访问只能以字为单位。

字节编址方式

  • 主存的最小编址单位是一个字节。

  • 对主存数据的访问既能以字节为单位、也能以字为单位。

  • 当CPU按字节访问主存时,用字节地址,当CPU按字访问主存时,用字地址。

  • 通常存储字长是字节整数倍

  • 字节地址连续,字地址不连续。

    eg:字节地址为0、1、2、3、4、5、6……

    字长为32位,也就是一个字等于四个字节

    则第一个字地址为0,第二个字地址为4,

    往后为8、12、16……

字节编址编址顺序

  • 大端序 低地址高字节

  • 小端序 低地址低字节

    eg:0x12345678

    大端序:1569429593275

    小端序:1569429691999

字节编址边界问题

  • 边界对齐 空间有浪费

  • 边界不对齐 2次存储器访问

    1569430434590

字编址和字节编址的优缺点

字编址:

  • 优点:机器结构简单、操作简便。主要应用于早期的计算机中。
  • 缺点:数据较短时操作不方便、在非数值应用领域,信息基本寻位是字节,字编址无法支持字节操作。随着机器字长越来越长,字编址的不灵活性越来越突出。

字节编址:

  • 优点:兼具字节寻址和字寻址的功能,灵活性好,存储器空间利用率高。
  • 缺点:机器结构较为复杂。

主存结构

1569466709850

存储体结构

存储体由许多存储单元组成,每个存储单元又包含若干个存储元(或称存储元、存储元件),每个存储元能寄存一位二进制代码“0”或“1”。

1569466311308

存储单元

CPU访问存储器的最小单位就是存储单元。每个存储单元都有一个地址,通过地址总线寻址。

主存性能指标

存储容量

存储容量=存储单元个数*存储字长(按字编址) (注意不要乘开,乘开没有意义)

存储容量=存储单元个数*存储字长/8=字节数(按字节编址)

某机可达存储容量上限由地址总线位数确定。

eg:一个存储器有20根地址总线,8根数据总线,则

按字编址:2^20×8=2M×8位

按字节编址:2^20×8/8=2MB字节

存取速度

存取时间

启动一次存储器操作到操作完成所需要的时间。

存取周期

存储器连续两次独立操作所需最小时间间隔。

通常,存取周期>存取时间,存取周期=存取时间+恢复时间

存储器带宽

单位时间内存储器存取的信息量,单位为字/秒、字节/秒或位/秒。

存储器带宽=存取周期的倒数

eg:存取周期500ns,字长16位,则带宽=1字/500ns=2M字/s=4M字节/s=32位/s

注意:M为10\^6,时间单位的转换,同一般公制单位。

机器字长、存储字长、指令字长、数据字长的关系与区别

机器字长

计算机一次处理的数据的大小,一般就是寄存器的大小,例如一个机器字长为32位,就说明这台计算机一次可以处理32位的数据,它的一个字的长度为32位。通常规定机器字长是2^n倍。

存储字长

存储器中一个存储单元中存储的二进制码位数。

存储器按字节编址时,存储字长为一个字节;按字编址时,存储字长等于机器字长

早期计算机的存储字长一般和机器的指令字长与数据字长相等,故访问一次主存便可取一条指令或一个数据。随着计算机的发展,往往要求指令字长是可变的,数据字长也要求可变。为了适应指令和数据字长的可变性,其长度不由存储字长来确定,而由字节的个数来表示。

指令字长

一条指令中包含的二进制码位数。指令字长=操作码长度+地址码长度*地址码个数

通常指令字长是字节的整数倍。

数据字长

数据字长:计算机数据存储所占用的位数。

指令格式

指令 = 操作码 + 地址码

操作码指出指令要干什么,地址码给出操作对象的位置或者下一条指令的位置

指令结构

等长指令字结构:指令字长相等,通常也等于机器字长

变长指令字结构:指令长度不等

CPU结构

1570187921133

按地址码个数分类

  • 三地址指令

    操作码 A1 A2 A3

    操作:A3 ←(A1)OP(A2)

  • 二地址指令

    操作码 A1 A2

    操作:A1 ←(A1)OP(A2)

  • 一地址指令

    操作码 A

    操作: AC ←(AC)OP(A)

  • 零地址指令

    操作码

    操作数来自(送往)堆栈栈顶

操作码字段

  • 定长操作码:所有指令的操作码位数相同,并将操作码集中安排在指令字的一个固定的字段中
  • 变长操作码:各种指令的操作码位数不一致,并且操作码可以分散在指令字的不同字段中

操作码扩展技术

前提:定长指令字、多种地址码混合用

可利用地址码个数较少的指令空出的地址码字段,增加操作码的位数(增加能表示的指令个数)