计算机组成原理保姆级复习资料一、计算机系统概论二、数据的

@[TOC]

一、计算机系统概论

看书看书,都是文字,(想拿高分)多了解

二、数据的表示和运算

各种进制及其转换

进制 举例
二进制: 0,1 二进制: 101.1 —> 1 × 2! + 0 × 2" + 1 × 2# + 1 × 2%" = 5.5
八进制: 0,1,2,3,4,5,6,7 八进制: 5.4 —> 5 × 8# + 4 × 8%" = 5.5
十进制: 0,1,2,3,4,5,6,7,8,9 十进制: 5.5 —> 5 × 10# + 5 × 10%" = 5.5
十六进制: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 十六进制: 5.8 —> 5 × 16# + 8 × 16%" = 5.5
## 各种进制的常见书写方式
在这里插入图片描述

二进制优越性

①可使用两个稳定状态的物理器件表示
②0,1 正好对应逻辑值 假、真。方便实现逻辑运算
③可很方便地使用逻辑门电路实现算术运算

任意进制→十进制

采用r 进制计数法每个位数的基数×该进制的位权次幂依次相加就可以啦

r 进制计数法

在这里插入图片描述
==基数==:每个数码位所用到的不同符号的个数,r 进制的基数为 r

举例

进制 计算举例
二进制:1 0 0 1 0 0 1 0 . 1 1 0 1 * 2^7 + 1 * 2^4 + 1 * 2^1 + 1 * 2^-1 + 1 * 2^-2 = 146.75
八进制:251.5 2 * 8^2 + 5 * 8^1 + 1 * 8^0 + 5 * 8^-1 = 168.625
十六进制:AE86.1 10 * 16^3 + 14 * 16^2 + 8 * 16^1 + 6 * 16^0 + 1 * 16^-1 = 44678.0625

大家也可以记住常见的二进制各个位的十进制值(右击保存图片收藏)
在这里插入图片描述

二进制↔八进制、十六进制

二进制 —> 八进制

3位一组,毎组转换成对应的八进制符号
在这里插入图片描述

八进制—> 二进制

每位八进制对应的3位二进制
在这里插入图片描述

二进制 —> 十六进制

4位一组,毎组转换成对应的十六进制符号
在这里插入图片描述

二进制 —> 十六进制

4位一组,毎组转换成对应的十六进制符号

在这里插入图片描述

十进制→任意进制

除 x 取余倒排法(x 代表进制数)

完整内容可以参考这个回答:zhidao.baidu.com/question/37…
在这里插入图片描述
如:75.3 小数部分=0.3
在这里插入图片描述
那么我们转化成二进制就是这样

  • 整数部分

在这里插入图片描述- 小数部分
在这里插入图片描述

十进制→二进制(拼凑法)

用这个图直接凑
在这里插入图片描述

真值和机器数

  • 真值:符合人类习惯的数字
  • 机器数:数字实际存到机器里的形式,正负号需要被“数字化”

例如下面两个数
在这里插入图片描述

定点数与浮点数的举例

举例
定点数:小数点的位置固定 Eg:996.007 ——常规计数
浮点数:小数点的位置不固定 Eg:9.96007*102 ——科学计数法

无符号数

概念

==无符号数==:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值。

例如:
在这里插入图片描述

表示范围

8位二进制数有 2^8 种不同的状态
在这里插入图片描述
n位的无符号数表示范围为:0 ~ 2^n -1

有符号数

有符号数的表示

例如
在这里插入图片描述
但是这样小数点的位置会不固定,我们在面对所有数据都不固定小数位的时候我们的心情会是这样

在这里插入图片描述
所以就有了有符号数的定点表示的规定

有符号数的定点表示

定点整数

在这里插入图片描述

定点小数

在这里插入图片描述

注意:

  • 可用 原码、反码、补码 三种方式来表示定点整数和定点小数。

  • 还可用 移码 表示定点整数。

  • 若真值为 x,则用 [x]原、[x]反、[x]补、[x]移 分别表示真值所对应的原码、反码、补码、移码

原码、反码、补码、移码

原码

在这里插入图片描述

反码

  • 若符号位为==0==,则==反码与原码相同==

  • 若符号位为==1==,则==数值位全部取反==

补码

  • 正数的补码 = 原码
  • 负数的补码 = 反码末位+1(要考虑进位)
  • 将负数补码转回原码的方法相同:尾数取反,末位+1

移码

  • 移码: 补码的基础上将符号位取反。

注意:移码只能用于表示整数

用几种码表示定点整数

在这里插入图片描述

各种码的真值0

[+0] [-0]
原码 [+0]原=00000000 [-0]原=10000000
反码 [+0]反=00000000 [-0]反=11111111
补码 [+0]补= [-0]补= 00000000 [+0]补= [-0]补= 00000000
反码 [+0]移= [-0]移= 10000000 [+0]移= [-0]移= 10000000

各种码转换图

在这里插入图片描述

各种码表示范围

在这里插入图片描述

算数移位运算

移位:通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权。可用移位运算实现乘法、除法

原码的算数移位

例如原码为 10101000 进行算数移位
在这里插入图片描述
原码的算数移位——==符号位保持不变,仅对数值位进行移位。==

  • 右移:高位补0,低位舍弃。若舍弃的位=0,则相当于÷2;若舍弃的位≠0,则会丢失精度
  • 左移:低位补0,高位舍弃。若舍弃的位=0,则相当于×2;若舍弃的位≠0,则会出现严重误差

反码的算数移位

反码的算数移位——==正数的反码与原码相同,因此对正数反码的移位运算也和原码相同。==

  • 右移:高位补0,低位舍弃。
  • 左移:低位补0,高位舍弃

反码的算数移位——==负数的反码数值位与原码相反,因此负数反码的移位运算规则如下,==

  • 右移:高位补1,低位舍弃。
  • 左移:低位补1,高位舍弃。

补码的算数移位

补码的算数移位——==正数的补码与原码相同,因此对正数补码的移位运算也和原码相同。==

  • 右移:高位补0,低位舍弃。
  • 左移:低位补0,高位舍弃。

补码的算数移位——==负数补码===反码末位+1 导致反码最右边几个连续的1都因进位而变为0,直到进位碰到第一个0为止。

规律——==负数补码中,最右边的1及其右边同原码。最右边的1的左边同反码==
负数补码的算数移位规则如下:

  • 右移(同反码):高位补1,低位舍弃。
  • 左移(同原码):低位补0,高位舍弃。

逻辑移位

在这里插入图片描述

  • 逻辑右移:高位补0,低位舍弃。
  • 逻辑左移:低位补0,高位舍弃。

可以把逻辑移位看作是对“无符号数”的算数移位

逻辑移位的应用举例

例如颜色RGB分别存储的数据为:
R = 102 01100110
G = 139 10001011
B = 139 10001011

需要将三个灰度值合成一个才能成彩色图像
在这里插入图片描述

循环移位

在这里插入图片描述

原码的加减运算

原码的加法运算:

  1. 正+正 → 绝对值做加法,结果为正 (可能会溢出)
  2. 负+负 → 绝对值做加法,结果为负 (可能会溢出)
  3. 正+负 → 绝对值大的减绝对值小的,符号同绝对值大的数
  4. 负+正 → 绝对值大的减绝对值小的,符号同绝对值大的数

原码的减法运算,“减数”符号取反,转变为加法:

  • 正-负 → 正+正
  • 负-正 → 负+负
  • 正-正 → 正+负
  • 负+正 → 负-负

补码的加减运算

对于补码来说,无论加法还是减法,最后都会转变成加法,由加法器实现运算,符号位也参与运算。

补充:

1. 求[-B]补

[-B]补 : [B]补连同符号位一起取反加1

2. 负数补 → 原:

①数值位取反+1;
②负数补码中,最右边的1及其右边同原码。最右边的1的左边同反码

例题

我们先看一道例题:设机器字长为8位(含1位符号位),A = 15,B = -24,求[A+B]补和[A−B]补

先将A B的原码补码都求出来
在这里插入图片描述

[A+B]补 = [A]补 + [B]补 = 0,0001111 + 1,1101000 = 1,1110111

原码:1,0001001 真值-9

[A-B]补 = [A]补 + [-B]补 = 0,0001111 + 0,0011000 = 0,0100111
真值+39

我们将题改一下:
其中 C = 124,求[A+C]补和[B−C]补,按照上面方法求出可得:
[A+C]补 = 0,0001111 + 0,1111100 = 1,0001011 真值-117 溢出(实际应该是139,但是溢出后是 -117)
[B−C]补 = 1,1101000 + 1,0000100 =0,1101100 真值+108

溢出判断

溢出条件

  • 只有“正数+正数 ”才会上溢 —— 正+正=负
  • 只有“负数+负数 ”才会下溢 —— 负+负=正

溢出判断:采用双符号位

正数符号为00,负数符号为11
[A+C]补 = 00,0001111 + 00,1111100 = ==01==,0001011 上溢
[B−C]补 = 11,1101000 + 11,0000100 = ==10==,1101100 下溢

记两个符号位为S1 S2 ,则V=S1异或S2

  • 若V=0,表示无溢出;
  • 若V=1,表示有溢出。

乘法运算的思想

手算乘法(二进制)

例如: 算 0.1101×0.1011

列竖式

在这里插入图片描述

移位运算

在这里插入图片描述

原码的一位乘法

补充:运算器相关知识

运算器:用于实现算术运算(如:加减乘除)、逻辑运算(如:与或非)

在这里插入图片描述

  • ACC: 累加器,用于存放操作数,或运算结果。
  • MQ: 乘商寄存器,在乘、除运算时,用于存放操作数或运算结果。
  • X: 通用的操作数寄存器,用于存放操作数
  • ==ALU==: 算术逻辑单元,通过内部复杂的电路实现算数运算、逻辑运算
ACC 被加数、和 被减数、差 乘积高位 被除数、余数
MQ 乘数、乘积低位
X 加数 减数 被乘数 除数

原码一位乘法实现方法:先加法再移位,重复n次

符号位通过==异或==确定;数值部分通过被乘数和乘数绝对值的 n 轮加法、移位完成根据当前乘数中参与运算的位确定(ACC)加什么。

  1. 若当前运算位 =1,则(ACC)+[|x|]原;
  2. 若当前运算位 =0,则(ACC)+0。

每轮加法后ACC、MQ的内容统一逻辑右移

手算模拟

tips

  • 乘数的符号位不参与运算,可以省略
  • 原码一位乘可以只用单符号位
  • 答题时最终结果最好写为原码机器数

例题

设机器字长为5位(含1位符号位,n=4),x = −0.1101,y = +0.1011,采用原码一位乘法求x·y

解:手动计算是这样
在这里插入图片描述
符号位:1与0进行异或运算,得0。

所以随后结果是:==x·y= -0.10001111==
在这里插入图片描述

补码的一位乘法(Booth算法)

  1. 进行 n 轮加法、移位,最后再多来一次加法
  2. 每次加法可能 +0 、+[x]补、+[-x]补
  3. 每次移位是“补码的算数右移”
  4. 符号位参与运算

在第二个步骤中,需要根据MQ中的最低位、辅助位 来确定加什么:

  • 辅助位 - MQ中最低位 = 1时,(ACC)+[x]补
  • 辅助位 - MQ中最低位 = 0时,(ACC)+0
  • 辅助位 - MQ中最低位 = -1时,(ACC)+[-x]补

手算模拟

例题

设机器字长为5位(含1位符号位,n=4),x = −0.1101,y = +0.1011,采用Booth算法求x·y

解:手动计算是这样
在这里插入图片描述
最后得 [x·y]补 = 11.01110001
即x·y = −0.10001111

做题总结

  1. n轮加法、算数右移,加法规则如下:

辅助位 - MQ中最低位 = 1时,(ACC)+[x]补
辅助位 - MQ中最低位 = 0时,(ACC)+0
辅助位 - MQ中最低位 = -1时,(ACC)+[-x]补
2. 补码的算数右移:
符号位不动,数值位右移,正数右移补0,
负数右移补1(符号位是啥就补啥)
3. 一般来说,Booth算法的被乘数、部分积采用双符号位补码

原码,补码一位乘法的对比

原码一位乘法: 补码一位乘法:
进行 n 轮加法、移位 进行 n 轮加法、移位,最后再多来一次加法
每次加法可能 +0 、`+[ x
每次移位是“逻辑右移” 每次移位是“补码的算数右移”
符号位不参与运算 符号位参与运算
# 原码除法:恢复余数法(了解,不考)
思路图(打字打不清楚了是)
在这里插入图片描述

补充知识:大小端模式与边界对其

大小端模式

大家一定知道:多字节数据在内存里一定是占连续的几个字节

最高有效字节我们用MSB表示
最低有效字节我们用LSB表示

例如
在这里插入图片描述

  • 大端模式更便于人类阅读
    在这里插入图片描述

  • 小端模式更便于便于机器处理

    在这里插入图片描述

边界对齐

现代计算机通常是按字节编址,即每个字节对应1个地址
通常也支持按字、按半字、按字节寻址。
假设存储字长为32位,则1个字=32bit,半字=16bit。

每次访存只能读/写1个字

  1. 下面是边界对其方式:不够四字节的会填充空的

在这里插入图片描述

  1. 下面是不对齐方式,不够四字节的不填充在这里插入图片描述

浮点数的表示

定点数:如纯小数0.1011和纯整数11110

浮点数表示形式

在这里插入图片描述

==阶码==:常用补码或移码表示的定点整数
==尾数==:常用原码或补码表示的定点小数

浮点数的真值:

在这里插入图片描述
阶码E反映浮点数的表示范围及小数点的实际位置;
尾数M的数值部分的位数n反映浮点数的精度

举个栗子

例题:阶码、尾数均用补码表示,求a、b的真值
a = 0,01;1.1001
b = 0,10;0.01001

解:
a: 阶码0,01对应真值+1
尾数1.1001对应真值-0.0111

a的真值 = 2^1^×(−0.0111) = −0.111
==(相当于尾数表示的定点小数算数左移一位,或小数点右移一位)==

b: 阶码0,10对应真值+2
尾数0.01001对应真值+0.01001

b的真值 = 2^2^×(+0.01001) = +1.001
==(相当于尾数表示的定点小数算数左移2位,或小数点右移2位)==

浮点数尾数的规格化

规格化浮点数:规定尾数的最高数值位必须是一个有效值 。

左归与右归

  • 左规:当浮点数运算的结果为非规格化时要进行规格化处理, 将尾数算数左移一位,阶码减1。

  • 右规:当浮点数运算的结果尾数出现溢出(双符号位为01或10)时, 将尾数算数右移一位,阶码加1。

说白了就是:

  • 左归就是通过算数左移、阶码减1 来规格化

  • 右归就是通过算数右移、阶码加1 来规格化

例题:浮点数加法

例:a = 010;00.1100,b = 010;00.1000,求a+b

解:a = 2^2^×00.1100 ,b = 2^2^×00.1000
a+b
= 2^2^×00.1100 + 2^2^×00.1000
= 2^2^×(00.1100 + 00.1000)
= 2^2^×01.0100
= 2^3^×00.1010

(注:采用“双符号位” ,当溢出发生时,可以挽救。更高的符号位是正确的符号位)

规格化浮点数的特点

1. 用原码表示的尾数进行规格化:

  • 正数为0.1××…×的形式,其最大值表示为0.11…1;最小值表示为0.10…0。

尾数的表示范围为1/2≤M≤(1−2^−n^)。

  • 负数为1.1××…×的形式,其最大值表示为1.10…0;最小值表示为1.11…1。

尾数的表示范围为−(1−2^−n^)≤M≤−1/2。

2. 用补码表示的尾数进行规格化:

  • 正数为0.1××…×的形式,其最大值表示为0.11…1;最小值表示为0.10…0。

尾数的表示范围为1/2≤M≤(1−2−n)。

  • 负数为1.0××…×的形式,其最大值表示为1.01…1;最小值表示为1.00…0。

尾数的表示范围为−1≤M≤−(1/2+2−n)

3. 表示范围

在这里插入图片描述

4. 注意事项(※)

1. 规格化的原码尾数,最高数值位一定是1

2. 规格化的补码尾数,符号位与最高数值位一定相反

3. 补码算数左移,低位补0;补码算数右移,高位补1

浮点数的加减运算

我们可以先通过十进制的浮点数加减运算步骤来类推二进制的

十进制浮点数加减运算步骤:

浮点数加减运算包括五个步骤:① 对阶② 尾数加减③ 规格化④ 舍入⑤ 判溢出

例如:计算9.85211 × 10^12^ + 9.96007 × 10^10^

解:在这里插入图片描述

二进制浮点数的加减运算

上面我们进行了十进制的浮点数的加减运算,下面我们可以以此类推,也按照上面五个步骤来做

直接看一个例题:已知十进制数X=−5/256、Y=+59/1024,按机器补码浮点运算规则计算X−Y,结果用二进制表示,浮点数格式如下:==阶符取2位,阶码取3位,数符取2位,尾数取9位==

解:

首先我们先用补码表示阶码和尾数,

5D = 101B,1/256 = 2^-8^ → X = - 101 × 2^-8^ = - 0.101 × 2^-5^ = - 0.101 × 2^-101^
59D = 111011B,1/1024 = 2^-10^ → Y = + 111011 × 2^-10^ = + 0.111011 × 2^-4^ = + 0.111011 × 2^-100^

再转化成补码形式
X:11011,11.011000000
==(X是负数 转化成补码取反+1 阶码 尾数都一样操作)==
Y:11100,00.111011000

1. 对阶

使两个数的阶码相等,小阶向大阶看齐,尾数毎右移一位,阶码加1

① 求阶差:[ΔE]补=11011+00100=11111,知ΔE=−1
② 对阶:
X:11011,11.011000000 → 11100,11. 101100000
X = - 0.0101 × 2^-100^

2. 尾数加减

-Y:11100,11.000101000
==(求码的负数的方法:连符号位一块取反+1)==

然后让X加上-Y

	11.101100000
+ 	11.000101000
	10.110001000
复制代码

所以X-Y:11100, 10.110001000

3. 规格化

X-Y:11100, 10.110001000 à 11101,11.011000100

4. 舍入

无舍入

5. 判溢出

常阶码,无溢出,结果真值为2−3×(−0.1001111)2

浮点数的加减运算——舍入规则

“0”舍“1”入法:

类似于十进制数运算中的“四舍五入”法,即在尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1,则在尾数的末位加1。这样做可能会使尾数又溢出,此时需再做一次右规。

恒置“1”法:

尾数右移时,不论丢掉的最高数值位是“1”还是“0”,都使右移后的尾数末位恒置“1”。这种方法同样有使尾数变大和变小的两种可能。

例如
在这里插入图片描述

强制类型转换

在这里插入图片描述

转化的可操作性

char → int → long → double
float → double
int → float:可能损失精度
float → int:可能溢出及损失精度

结论:范围、精度从小到大,转换过程没有损失

原因:拿32位来说:
int:表示整数,范围 -2^31^ ~ 2^31^-1 ,有效数字32位
float:表示整数及小数,范围 ±[2^-126^ ~ 2^127^×(2−2^−23^)],有效数字23+1=24位

奇偶校验码

概念

由若干位代码组成的一个字叫==码字==。
将两个码字逐位进行对比,具有不同的位的个数称为==两个码字间的距离==。
一种编码方案可能有若干个合法码字,各合法码字间的最小距离称为“==码距==”。
例如:下面两组的码距分别是1和2

在这里插入图片描述
其中==码距==的能力范围是:

  • 当d=1时,无检错能力;
  • 当d=2时,有检错能力;
  • 当d≥3时,若设计合理,可能具有检错、纠错能力

奇偶校验码

  • 奇校验码:整个校验码(有效信息位和校验位)中“1”的个数为奇数。
  • 偶校验码:整个校验码(有效信息位和校验位)中“1”的个数为偶数。

在这里插入图片描述

例1: 给出两个编码10011011010111的奇校验码和偶校验码。
设最高位为校验位,余7位是信息位,则对应的奇偶校验码为:
奇校验: 11001101 01010111
偶校验: 01001101 11010111

1
0

例2: 给出两个编码10011011010111的奇校验码和偶校验码。
设最高位为校验位,余7位是信息位,则对应的奇偶校验码为:
奇校验: 11001101 01010111
偶校验: 01001101 11010111

偶校验的硬件实现:各信息进行异或(模2加)运算,得到的结果即为偶校验位

在这里插入图片描述
例如:将上述例子求偶校验位:
在这里插入图片描述

偶数个错误校验不出

例如
在这里插入图片描述

总结

在这里插入图片描述

三、主存储器

保留,我貌似没学过,不晓得,可能和后面存储系统混了,先看看书

四、指令系统

指令案例文章(必看):editor.csdn.net/md/?article…

现代计算机的结构

在这里插入图片描述
这次就开搞控制器!

学会指令系统就可以更精进之前搞的典型过程了:yangyongli.blog.csdn.net/article/det…

指令格式

指令的定义

==指令(又称机器指令)==:是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。

一台计算机的所有指令的集合构成该机的指令系统,也称为==指令集==。

注:一台计算机只能执行自己指令系统中的指令,不能执行其他系统的指令。

例如:x86 架构、ARM架构之间不能互相执行对方架构系统的指令。

指令格式

一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。

一条指令通常要包括操作码字段和地址码字段两部分(如下图所示):
在这里插入图片描述

==操作码==就是要表达用户要干什么?
比如:停机中断、求反求补、加减乘除…...

==地址码==就是要说明对谁进行操作?
比如:不需要操作对象、需要一个操作对象、需要两个操作对象…...


其中 一条指令可能包含 0个、1个、2个、3个、4个 地址码…

根据地址码数目不同,可以将指令分为 零地址指令、一地址指令、二地址指令…

零地址指令

在这里插入图片描述

  1. 不需要操作数,如空操作、停机、关中断等指令
  2. 堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压回栈顶

一地址指令

在这里插入图片描述

  1. 只需要单操作数,如加1、减1、取反、求补等

指令含义:OP(A1)→A1 ,完成一条指令需要3次访存:取指→ 读A1 →写A1
2. 需要两个操作数,但其中一个操作数隐含在某个寄存器(如隐含在ACC)
指令含义: (ACC)OP(A1)→ACC,完成一条指令需要2次访存:取指→ 读A1

注:A1 指某个主存地址, (A1)表示 A1 所指向的地址中的内容

二、三地址指令

在这里插入图片描述
==常用于需要两个操作数的算术运算、逻辑运算相关指令==

指令含义:(A1)OP(A2)→A1
完成一条指令需要访存4次,取指→读A1→读A2→写A1

在这里插入图片描述
==常用于需要两个操作数的算术运算、逻辑运算相关指令==

指令含义:(A1)OP(A2)→A3
完成一条指令需要访存4次,取指→ 读A1→读A2 →写A3

四地址指令

在这里插入图片描述
指令含义:(A1)OP(A2)→A3,A4=下一条将要执行指令的地址

完成一条指令需要访存4次,取指 →读A1 →读A2 →写A3

正常情况下:取指令之后 PC+1,指向下一条指令
四地址指令:执行指令后,将PC的值修改位 A4 所指地址

小杨同学表示:事真多!
在这里插入图片描述

地址码的位数有什么影响?

n位地址码的直接寻址范围=2^n^,==若指令总长度固定不变,则地
址码数量越多,寻址能力越差==

分类

指令-按地址码数目分类

在这里插入图片描述

指令-按指令长度分类

可以分为:半字长指令、单字长指令、双字长指令 ——指令长度是机器字长的多少倍

==指令字长==:一条指令的总长度(可能会变)
==机器字长==:CPU进行一次整数运算所能处理的二进制数据的位数(通常和ALU直接相关)
==存储字长==:一个存储单元中的二进制代码位数(通常和MDR位数相同)

指令字长会影响取指令所需时间。如:机器字长=存储字长=16bit,则取一条双字长指令需要两次访存

定长指令字结构:指令系统中所有指令的长度都相等
变长指令字结构:指令系统中各种指令的长度不等

指令-按操作码长度分类

  1. 定长操作码:指令系统中所有指令的操作码长度都相同(n位 → 2^n^条指令)

——控制器的译码电路设计简单,但灵活性较低
2. 可变长操作码:指令系统中各指令的操作码长度可变
——控制器的译码电路设计复杂, 但灵活性较高
3. 扩展操作码指令格式:定长指令字结构+可变长操作码

指令—按操作类型分类

  1. 数据传送(==数据传送类:进行主存与CPU之间的数据传送==)

LOAD 作用:把存储器(源)中的数据放到寄存器(目的)中
STORE 作用:把寄存器(源)中的数据放到存储器(目的)中

  1. 算术逻辑操作

算术:加、减、乘、除、增 1、减 1、求补、浮点运算、十进制运算
逻辑:与、或、非、异或、位操作、位测试、位清除、位求反
3. 移位操作
算术移位、逻辑移位、循环移位(带进位和不带进位)
4. 转移操作(==程序控制类:改变程序执行的顺序==)
无条件转移 JMP
条件转移 JZ:结果为0;JO:结果溢出;JC:结果有进位
调用和返回 CALL和RETURN
陷阱(Trap)与陷阱指令
5. 输入输出操作(==输入输出类(I/O):进行CPU和I/O设备之间的数据传送==)
CPU寄存器与IO端口之间的数据传送(端口即IO接口中的寄存器)

指令格式小结

在这里插入图片描述

扩展操作码

指令由操作码和若干个地址码组成。

PS:先回顾一下指令字结构与操作码的概念:

  • 定长指令字结构:指令系统中所有指令的长度都相等
  • 变长指令字结构:指令系统中各种指令的长度不等

  • 定长操作码:指令系统中所有指令的操作码长度都相同
  • 可变长操作码:指令系统中各指令的操作码长度可变

定长指令字结构+可变长操作码 → 扩展操作码指令格式(==即不同地址数的指令使用不同长度的操作码==)

扩展操作码举例

这只是一种设计方法:
在这里插入图片描述

设计扩展操作码需注意:

  1. 不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。(==对比哈夫曼树“前缀编码”==)
  2. 各指令的操作码一定不能重复。

通常情况下,对使用频率较高的指令,分配较短的操作码;对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间。

设计扩展操作码例题:

设指令字长固定为16位,试设计一套指令系统满足:
a) 有15条三地址指令
b) 有12条二地址指令
c) 有62条一地址指令
d) 有32条零地址指令

设地址长度为n,上一层留出m种状态,下一层可扩展出m×2!种状态

解:
a) 共2^4^=16种状态
留出16-15=1种

b) 共1 ×2^4^=16种
留出16-12=4种

c) 共4 ×2^4^=64种
留出64-62=2种

d) 共2 ×2^4^=32种

0000 -1110 A1(取的合法范围) A2 A3
1111 XXXX XXXXXXXX 1111 0000 -1011 A1 A2
1111 11XX XXXX XXXX 1111 1100 –1110
1111
0000 –1111
0000 –1101
A1
1111 1111 111X XXXX 1111 1111 1110 –1111 0000 -1111

指令操作码

==操作码==指出指令中该指令应该执行什么性质的操作和具有何种功能。

==操作码==是识别指令、了解指令功能与区分操作数地址内容的组成和使用方法等的==关键信息==。
例如,指出是算术加运算,还是减运算;是程序转移,还是返回操作。

操作码分类:

定长操作码:

==在指令字的最高位部分分配固定的若干位(定长)表示操作码。==

  • 一般n位操作码字段的指令系统最大能够表示2^n^条指令。
  • 优:定长操作码对于简化计算机硬件设计,提高指令译码和识别速度很有利; - 缺:指令数量增加时会占用更多固定位,留给表示操作数地址的位数受限。

扩展操作码(不定长操作码) :

==全部指令的操作码字段的位数不固定,且分散地放在指令字的不同位置上。==

  • 最常见的变长操作码方法是扩展操作码,使操作码的长度随地址码的减少而增加,不同地址数的

指令可以具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。

  • 优: 在指令字长有限的前提下仍保持比较丰富的指令种类;
  • 缺 :增加了指令译码和分析的难度,使控制器的设计复杂化。

首先 ,我们还得先回忆一下计算机的工作过程:yangyongli.blog.csdn.net/article/det…
在这里插入图片描述

指令寻址

==指令寻址==: ==下一条== 欲执行 ==指令== 的 ==地址==(始终由程序计数器PC给出)

即( PC ) + 1→ PC,如下面图片的例子
在这里插入图片描述

该系统采用==定长指令字结构==
指令字长=存储字长=16bit=2B(地址为16位)
主存==按字编址==

我们将上面例子拆分为: 指令地址、操作码、地址码。如下图形式

在这里插入图片描述

顺序寻址

( PC ) + “1” → PC

跳跃寻址

由转移指令指出

JMP:无条件转移把PC中的内容改成地址码数值

O(∩_∩)O哈哈~

例如在前面的例子中
在这里插入图片描述

小结

在这里插入图片描述

指令寻址 v.s. 数据寻址

寻址方式不同

在这里插入图片描述

寻址方式特征包括:(十种)

在这里插入图片描述

数据寻址

我们在原有的寻址方式上加上四个bit位,也就是==寻址特征==(告诉后面的形式地址用什么方式来解读),就构成了==数据寻址==。

一地址指令形式:

在这里插入图片描述
最终解读完后得到一条有效地址(求出操作数的真实地址,称为==有效地址(EA)==。)

二地址指令形式:

在这里插入图片描述

以下寻址方式前提:假设指令字长=机器字长=存储字长,假设操作数为3

十种寻址方式

直接寻址

在这里插入图片描述

间接寻址

在这里插入图片描述

寄存器寻址

在这里插入图片描述

寄存器间接寻址

在这里插入图片描述

隐含寻址

在这里插入图片描述

立即寻址

在这里插入图片描述

偏移寻址

内容太多:请移驾另一篇博客:
yangyongli.blog.csdn.net/article/det…

堆栈寻址

内容太多:请移驾另一篇博客:
yangyongli.blog.csdn.net/article/det…

数据寻址小结

在这里插入图片描述

CISC和RISC对比(整的少,要高分看书上的背)

CISC: Complex Instruction Set Computer RISC: RISC: Reduced Instruction Set Computer
类比 有很多库函数的C语言 没有库函数的C语言
设计思路 一条指令完成一个复杂的基本功能。 一条指令完成一个基本“动作”;多条指令组合完成一个复杂的基本功能。
CISC的思路:除了提供整数的加减乘指令除之外,还提供矩阵的加法指令、矩阵的减法指令、矩阵的乘法指令 RISC的思路:只提供整数的加减乘指令
代表 x86架构,主要用于笔记本、台式机等 ARM架构,主要用于手机、平板等
指令与电路 一条指令可以由一个专门的电路完成 一条指令一个电路,电路设计相对简单,功耗更低
实现 有的复杂指令用纯硬件实现很困难 → 采用“存储程序”的设计思想,由一个比较通用的电路配合存储部件完成一条指令 “并行”、“流水线”

将上面分的更细一下,如下表格
在这里插入图片描述

举个栗子

举个栗子,拿之前的计算机工作原理图来说,忘了的小伙伴可以点击下面链接再看一下:
blog.csdn.net/weixin_4552…
在这里插入图片描述
其中,乘法指令可以访存,一定是CISC
在这里插入图片描述

五、中央处理器

在这里插入图片描述

CPU的功能

  1. 指令控制。完成取指令、分析指令和执行指令的操作,即程序的顺序控制。
  2. 操作控制。一条指令的功能往往是由若干操作信号的组合来实现的。CPU管

理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件,
从而控制这些部件按指令的要求进行动作。
3. 时间控制。对各种操作加以时间上的控制。时间控制要为每条指令按时间
顺序提供应有的控制信号。
4. 数据加工。对数据进行算术和逻辑运算。
5. 中断处理。对计算机运行过程中出现的异常情况和特殊请求进行处理。

运算器和控制器的功能

  • ==运算器==:对数据进行加工
  • ==控制器==

协调并控制计算机各部件执行程序的指令序列,
基本功能包括取指令、分析指令、执行指令

- 取指令:自动形成指令地址;自动发出取指令的命令。
- 分析指令:操作码译码(分析本条指令要完成什么操作);
- 产生操作数的有效地址。
- 执行指令:根据分析指令得到的“操作命令”和“操作数地址”,形成操作信号控制序列,控制运算器、存储器以及I/O设备完成相应的操作。
- 中断处理:管理总线及输入输出;处理异常情况(如掉电)和特殊请
求(如打印机请求打印一行字符)
复制代码

更形象点,如下图:
在这里插入图片描述

运算器的基本结构

运算器包括:==算术逻辑单元与通用寄存器组。==

  1. ==算术逻辑单元==:主要功能是进行算术/逻辑运算。
  2. ==通用寄存器组==:如AX、BX、CX、DX、SP等,用于存放操作数(包括源操作数、目的操作数及中间结果)和各种地址信息等。SP是堆栈指针,用于指示栈顶的地址。

例如下图:(当然没有这么简单,这只是个概图,肯定不是这么简单的了,大家可以先参考一下)

在这里插入图片描述

专用数据通路方式:根据指令执行过程中的数据和地址的流动方向安排连接线路。

问题探究

如果按照上图直接用导线连接,相当于多个寄存器同时并且一直向ALU传输数据???

那肯定是不行的呀,这样数据不就传输混乱的嘛,那么我们怎样解决呢?

解决方法1. 使用多路选择器

根据控制信号选择一路输出
在这里插入图片描述

解决方法2. 使用三态门

可以控制每一路是否输出
如:

R0out为1时R$中的数据输出到A端,
R0out为0时R$中的数据无法输出到A端
复制代码

优缺点:性能较高,基本不存在数据冲突现象,但结构复杂,硬件量大,不易实现。

运算器真正的基本结构

CPU采用内部单总线方式:==将所有寄存器的输入端和输出端都连接到一条公共的通路上。==

在这里插入图片描述

  1. ==算术逻辑单元==:主要功能是进行算术/逻辑运算。
  2. ==通用寄存器组==:如AX、BX、CX、DX、SP等,用于存放操作数(包括源操作数、目的操作数及中间结果)和各种地址信息等。SP是堆栈指针,用于指示栈顶的地址。
  3. ==暂存寄存器==:用于暂存从主存读来的数据,这个数据不能存放在通用寄存器中,否则会破坏其原有内容。
  4. ==累加寄存器==:它是一个通用寄存器,用于暂时存放ALU运算的结果信息,用于实现加法运算。
  5. ==程序状态字寄存器==:保留由算术逻辑运算指令或测试指令的结果而建立的各种状态信息,如溢出标志(OP)、符号标志(SF)、零标志(ZF)、进位标志(CF)等。PSW中的这些位参与并决定微操作的形成。
  6. ==移位器==:对运算结果进行移位运算。
  7. ==计数器==:控制乘除运算的操作步数。

优缺点

结构简单,容易实现,但数据传输存在较多冲突的现象,性能较低。

控制器的基本结构

在这里插入图片描述

  1. 程序计数器:用于指出下一条指令在主存中的存放地址。CPU就是根据PC的内容去主存中取指令的。因程序中指令(通常)是顺序执行的,所以PC有自增功能。
  2. 指令寄存器:用于保存当前正在执行的那条指令。
  3. 指令译码器:仅对操作码字段进行译码,向控制器提供特定的操作信号。
  4. 微操作信号发生器:根据IR的内容(指令)、PSW的内容(状态信息)及时序信号,产生控制整个计算机系统所需的各种控制信号,其结构有组合逻辑型和存储逻辑型两种。

5.时序系统:用于产生各种时序信号,它们都是由统一时钟(CLOCK)分频得到。
5. 存储器地址寄存器:用于存放所要访问的主存单元的地址。
6. 存储器数据寄存器:用于存放向主存写入的信息或从主存中读出的信息。

我们上面运算器与控制器合起来,构成一个CPU。

CPU整体的基本结构

在这里插入图片描述
我们将标注上ALU 寄存器 CU 中断系统后是这个样子。
在这里插入图片描述

小结

在这里插入图片描述

指令周期

==指令周期==:CPU从主存中每取出并执行一条指令所需的全部时间。
指令周期常常用若干机器周期来表示,机器周期又叫CPU周期

一个机器周期又包含若干时钟周期(也称为节拍、T周期或CPU时钟周期,它是CPU操作的最基本单位)。

每个指令周期内机器周期数可以不等,每个机器周期内的节拍数也可以不等。如下图可分为定长的机器周期与不定长的机器周期。
CLK:时钟脉冲
在这里插入图片描述

几种常见的指令周期

每个指令周期内机器周期数可以不等,每个机器周期内的节拍数也可以不等。

在这里插入图片描述

指令周期流程

在这里插入图片描述
四个工作周期都有CPU访存操作,只是访存的目的不同。

  1. 取指周期是为了==取指令==
  2. 间址周期是为了==取有效地址==
  3. 执行周期是为了==取操作数==
  4. 中断周期是为了==保存程序断点。==

这四个周期在计算机内部是用触发器控制的

触发器,可以存放1个二进制位。

CLK(时钟脉冲)通过判断四个触发器的状态来判断该指令执行的是哪个周期。具体状态判断如下图
在这里插入图片描述

指令周期的数据流

取指周期

取指周期步骤:

  1. 当前指令地址送至存储器地址寄存器,

记做:(PC) → MAR
3. 将MAR所指主存中的内容经数据总线
送入MDR,记做:M(MAR) → MDR
2. CU发出控制信号,经控制总线传到主
存,这里是读信号,记做:1 → R
4. 将MDR中的内容(此时是指令)送入IR,
记做:(MDR) → IR
5. CU发出控制信号,形成下一条指令地
址,记做:(PC)+1 → PC

具体数据流向图如下图所示:
在这里插入图片描述

间址周期

间址周期步骤:

  1. 将指令的地址码送入MAR,

记做:Ad(IR) → MAR
Ad(MDR) → MAR
2. CU发出控制信号,启动主存做读操作,
记做:1 → R
3. 将MAR所指主存中的内容经数据总线
送入MDR,记做:M(MAR) → MDR
4. 将有效地址送至指令的地址码字段,
记做:(MDR)→ Ad(IR)

具体数据流向图如下图所示:
在这里插入图片描述

执行周期

执行周期的任务是根据IR中的指令字的操作码和操作数通过ALU操作产生执行结果。

不同指令的执行周期操作不同,因此没有统一的数据流向。

中断周期

==中断==:暂停当前任务去完成其他任务。

为了能够恢复当前任务,需要保存断点
一般使用堆栈来保存断点,这里用SP表示栈顶地址,假设SP指向栈顶元素,进栈操作是先修改指针后存入数据

中断周期步骤:

  1. CU控制将SP减1,修改后的地址送入MAR

记做: (SP)-1 → SP(SP) → MAR
本质上是将断点存入某个存储单元,假设其
地址为a,故可记做:a → MAR
2. CU发出控制信号,启动主存做写操作,
记做:1 → W
3. 将断点(PC内容) 送入MDR,
记做:(PC) → MDR

  1. CU控制将中断服务程序的入口地址

(由向量地址形成部件产生)送入PC,
记做:向量地址→ PC

具体数据流向图如下图所示:
在这里插入图片描述

指令执行方案

一个指令周期通常要包括几个时间段(执行步骤),每个步骤完成指令的一部分功能,几个依次执行的步骤完成这条指令的全部功能。

方案1.单指令周期

对所有指令都选用相同的执行时间来完成 。

==指令之间串行执行;==

指令周期取决于执行时间最长的指令的执行时间。

缺点:

对于那些本来可以在更短时间内完成的指令,要
使用这个较长的周期来完成,会降低整个系统的
运行速度。

方案2.多指令周期

对不同类型的指令选用不同的执行步骤来完成 。

==指令之间串行执行;==

可选用不同个数的时钟周期来完成不同指令的执行过程 。

缺点:

需要更复杂的硬件设计。

方案3.流水线方案

在每一个时钟周期启动一条指令,尽量让多条指令同时运行,但各自处在不同的执行步骤中 。

==指令之间并行执行==

例如这个样子
在这里插入图片描述

本章小结

在这里插入图片描述

微程序控制器

(如果我有时间,就整,建议看书,我的版本可能和学校教的不一样)

六、存储系统

都是概念,看书

七、IO(没学,不会)