第六章 计算机的运算方法
6.1 无符号数和有符号数
6.1.1 无符号数
寄存器的位数,反映无符号数的表示范围
6.1.2 有符号数
1、机器数与真值
真值:带符号的数
机器数:符号数字化的数 0表示正号,1表示负号
根据小数点的位置可以分为:小数定点机(小数点的位置在符号位的后面)和整数定点机(小数点在数值后面)
这里补充一个重要的点:三种机器码的表示数值的范围https://blog.csdn.net/pingpingwuqi123/article/details/105124086
2、原码表示法
(1)定义
①整数:正数在前面加一个0,负数在前面加一个1
实际上是带符号的绝对值表示
②小数:正数用0表示小数点前的数,用1表示小数点0之前
eg.-0.1101的原码是1.1101
0.100000的原码是0.100000(需要注意的是小数点之前的两个零的
意义不同)
(2)举例
求x=0的原码:0的正负的不一样
不能表示-1.0000
(3)原码的特点:简单直观
但用原码做加法时,会出现问题:加减法运算不归一
3、补码表示法(减法变成加法)
(1)补的概念:对有模的数,eg时钟的模12,那么-3和+9互为补数
一个负数加上模,即得到该负数的补数;一个正数和一个负数互为补数时,他们的绝对值之和即为模数。
在计算机中,eg存储数据有4位,那么模就是24=16,超出四位的进位会被直接丢弃。
eg. 模16:1011到0000? 有两种方法①减1011 ②加0101(高位被舍弃了)即-1011==+0101
(2)正数的补数即为为其本身,然后加一个符号位0
负数的补数是数值加上模值,然后再加一个符号位1
(3)补码定义
这个位数不包括符号位
eg x=-0.1100000 [x]补=2+(-0.1100000)=1.0100000(模为2的补码)
(4)求补码的快捷方式
①正数:就是原码
②负数:符号位不变,数值为原码每位都取反再末位加一(真值从右往左数第一个1保留,后面往左所有的值取反)
负数的补码到原码也是每位取反,末位加一!
+0的补码和-0的补码是相同的(不管是整数还是小数的0)
(5)模数为4时,形成了双符号位的补码,这种双符号位的补码称为变形补码,在阶码运算和溢出判断中有特殊的作用。
4、反码表示法
(1)定义
①整数
②小数
(2)求0的反码:+0:0,000 -0:1,1111 +0.0000:0.0000 -0.0000:1.1111 +0和-0的反码表示方法不同
三种机器码小结
(1)
由于0在补码中只有一种表示形式,因此补码可以比原码和反码多表示一个负数(即-128)
(2)已知[y]补 求[-y]补
[y]补连同符号位在内,每位取反,末位加一即得到[-y]补
5、移码表示法
补码表示很难直接判断其真值的大小,因此引入了移码表示法
(1)移码定义(只有整数定义)
整体多加了一位,最高位为0表示正数,最高位为1表示负数
一般用来表示浮点数中的阶码部份
(2)移码和补码的比较
移码和补码只有符号位相反,数值部分完全相同!
(3)移码的特点
①+0和-0的移码表示相同
②最小真值的移码为全0
6.2 数的定点表示和浮点表示
6.2.1定点表示
小数点按约定的方式标出
(1)小数点在数符的后面:小数定点机
小数放在数值的后面:整数定点机
(2)表示范围
定点机 | 小数定点机 | 整数定点机 |
原码 | -(1-2-n)~+(1-2-n) | -(2n-1)~+(2n-1) |
补码 | -1~+(1-2-n) | -2n~+(2n-1) |
反码 | -(1-2-n)~+(1-2-n) | -(2n-1)~+(2n-1) |
6.2.2 浮点表示(重点)
为什么要引入浮点数:编程困难,程序要调节小数点的位置;数的表示范围很小,为了能表示两个大小相差很大的数据,需要很长的机器字长;数据单元的利用率很低
1、浮点数的表示形式
N=S×rj
S---尾数,小于等于1,可正可负、j---阶码,整数、可正可负、r---尾数的基值,取2、4、8、16等
eg r=2,N=11.0101=0.11
2、浮点数的表示范围
尾数的长度影响所表示的数的精度,要保证最大精度,需要尾数尽可能地长
3、浮点数的规格化形式
为了尽可能保证数据的精度,让尾数S有效的位数尽可能的多
r=2时,尾数最高位为1
r=4时,尾数最高2位不全为0
r=8时,尾数最高3位不全为0
4、浮点数的规格化
就是把尾数进行左移/右移
(1)r=2时,左规:尾数左移一位,阶码减一
右规:尾数右移一位,阶码加一
r=4时,左规:尾数左移两位,阶码减一
右规:尾数右移两位,阶码加一
r=4时,左规:尾数左移三位,阶码减一 右规:尾数右移三位,阶码加一
(2)基数r越大,可表示的浮点数的范围越大;浮点数的精度越低
机器零
当浮点数尾数为0时,不论其阶码为何值,按机器零处理。
当浮点数阶码小于等于他所表示的最小数时,不论尾数为何值,按机器零处理
eg m=4 n=10
①用补码表示时
x,xxxx;0.0000000000 是机器零
1,0000;x.xxxxxxxxxx 是机器零
②用移码表示时,机器零为
0,0000;0.000000000 这种形式更有利于机器中“判0”电路的实现
6.2.3 定点数和浮点数的比较
相同位数的 | 定点数 | 浮点数 |
数的表示范围 | 小 | 大 |
数的精度 | 高 | 低 |
溢出处理 | 对数值本身进行判断,复杂,数的表示范围小 | 数的表示范围大,仅当阶码上溢时才停止运算 |
程序编写 | 复杂,为防止溢出,必须选比例因子 | 不用考虑比例因子 |
运算 | 规则简单,速度快,硬件实现容易 | 运算分阶码和尾数两部分,而且运算结果要求 规格化,运算步骤复杂,速度低,运算线路复杂 |
6.2.4 IEEE 754标准
6.3 定点运算(书 笔记)
6.3.1 移位运算
1、移位运算的数学意义
2、算数移位规则
符号位不变,符号位不参与移位!!!!
| 码制 | 填补代码 |
正数 | 原码、补码、反码 | 0 |
负数 | 原码 | 0 |
补码 | 左移 在右侧添0 | |
右移 在左侧添1 | ||
反码 | 1 |
对于负数,原码左移时高位丢1,结果出错;右移时低位丢1,影响精度;
补码左移时高位丢0,结果出错;右移时低位丢1,影响精度;
反码左移时高位丢0,结果出错;右移时低位丢0,影响精度;
3、算术移位的硬件实现
4、算术移位与逻辑移位的区别
逻辑移位不管怎么移都是添0
6.3.2 加减法运算
1、补码加减法运算的公式
连同符号位一起相加,符号位产生的进位自然丢掉
2、溢出的判断
(1)用一位符号位判断溢出
即为溢出,为0即为不溢出。即两个进位不同时产生了溢出!
(2)用两位符号位判断溢出
用模4的补码,最高位有两位符号位
结果的双符号位相同表示:未溢出
结果的双符号位不同表示:溢出
最高位的符号为代表真正的符号
同样的,在浮点机中,当阶码的阶符用两位符号位表示时,判断溢出的原则与小数的完全相同;
3、补码加减法的硬件配置
采用双符号位方案时,寄存器或主存中的操作数只需要保留一位符号位(因为正确的结果所得到的两个符号位应该是相同的,只要在运算的时候,寄存器中一位富豪的值同时送到加法器的两位符号输入端即可)
4、补码加减法运算控制流程
6.3.3 乘法运算
1、笔算乘法的分析
2、笔算乘法的改进
n位数相加,需要n次加法运算和n次乘法运算
3、原码的乘法运算(符号位单独运算)
(1)原码一位乘运算规则
绝对值运算,逻辑运算;用移位的次数判断乘法是否结束,n次加法n次移位结束就是结束了。
(2)原码一位乘所需的硬件配置
(3)原码一位乘控制流程
(4)原码两位乘
即用两位乘数位来判断是加零还是加一倍,两倍还是三倍;之后再右移两位
当乘数为偶数时,需做n/2次移位,最多要做n/2+1次加法;当乘数为奇数时,乘数高位前加一个0,需做n/2+1次移位,要做n/2+1次加法
都是重复相加和移位的思想,采用并行阵列乘法器可以大大提高乘法速度。
4、补码的乘法运算(符号位参与运算)booth算法
(1)补码一位乘运算规则
通过矫正法而来的,Booth算法;
mod2的前提下,[-x]补=-[x]补
booth算法的部份积取双符号位,乘数因符号位参加运算,所以要多取一位。
(2)补码两位乘
①实际上是三位判断位组成了两组判断结果
②此时部份积和被乘数都采用三位符号位
③此时,当乘数数值位为偶数时,乘数取2位符号位,共需要n/2次移位,最多做n/2+1次加法,最后一步不移位;
当n为奇数时,可以补0变成偶数位,简化逻辑操作,也可以对乘数取1位符号位,此时共进行n/2+1次加法运算和n/2+1次移位。
6.3.4 除法运算
1、分析笔算除法
2、原码除法——符号位单独运算
原码除法和乘法一样都是符号位单独处理
(1)恢复余数法
①规则:
余数为正,上商1;余数左移一位
余数为负,上商0并且恢复余数;余数左移一位
②特点
上商n+1次,第一次上商判溢出,移位n次
在恢复余数法中,每当余数位负时,都需恢复余数,这延长了机器除法的时间,操作也很不规则,对线路结构不利
(2)加减交替法(不恢复余数法)
①规则
余数为正,上商1,余数左移一位,加[-y*]补;
余数为负,上商0,余数左移一位,加[y*]补。
②特点
上商n+1次,第一次上商判溢出,移位n次,加n+1次,用移位的次数判断除法是否结束
注意在机器除法中,被除数和除数都不能是0
在整数除法中,被除数的位数可以使除数的两倍,但是高n位要比除数(n位)小,否则会产生溢出。
3、补码除法(阿唐未讲!呜呜呜!他是不是恨补码!)(符号位参与运算)
(1)恢复余数法(用的少书上都没讲)
(2)加减交替法
①规则
[Ri]补和[y]补同号,商为正,则够减时上商1,不够减时上商0,左移一位,加[-y]补;
[Ri]补和[y]补异号,商为负,则够减时上商0,不够减时上商1(按反码规则上商),左移一位,加[y]补;
注意,在上第一步商之前,x为Ri,同号先加[-y]补,异号先加[y]补得到第一个[Ri]补,不用移位不用上商,然后再开始循环如上的判断
在所有移位结束后,商的末位添0,采用“末位恒置1”法,操作简单,易于实现,误差仅为2-n。
②特点
上商n+1次,末位恒置1,第一次上商可用来判断是否溢出;
移位n次,用移位的次数判断除法是否结束。
6.4 浮点四则运算
6.4.1 浮点加减运算
1、对阶
使两数的小数点位置对齐
(1)求阶差
小阶向大阶看齐,尾数右移(尾数右移丢掉了右边的低位,只影响数据的精度,不会影响数据的正确性,而尾数左移,若丢掉了高位的一,很影响数据的正确性。)
2、尾数求和
按照补码的加减运算进行
3、规格化
(1)一些前提
基值r=2时,尾数S的规格化形式为 1/2<=|S|<1
当采用双符号位的补码时,
S>0时,补码规格化格式为:[S]补=00.1xxx
S<0时,补码规格化格式为:[S]补=11.0xxx
即:尾数的最高位数值与符号位不同时,即为规格化形式(对于补码)
规格化数的判断 | |||
S>0 | 规格化形式 | S<0 | 规格化形式 |
真值 | 0.1xx...xxx | 真值 | -0.1xx...xxx |
原码 | 0.1xx...xxx | 原码 | 1.1xx...xxx |
补码 | 0.1xx...xxx | 补码 | 1.0xx...xxx |
反码 | 0.1xx...xxx | 反码 | 1.0xx...xxx |
补码 符号位与第一位数位不同 即可判断为规格化数
特例:-1/2的补码是1.1000000,发现他不是规格化的数;
-1的补码是1.000000,发现是规格化数
(2)左规
(2)左规
左规时,尾数左移一位,阶码减一,直到数符和第一数位不同(符合补码的规格化表示)为止。
这背后的原理!其实很简单!但是很巧妙!你看,当数符是11,那就是说这个数的真值是负数,当需要左规时,左规丢掉的高位是1,其实代表了真值中的0,就是说不会出现任何数据的丢失
同理,如果数符是00,那就是说这个数的真值是正数,当需要左规时,左规丢掉的高位是0,代表的就是真值中的0,也不会出现任何数据的丢失!!
4、舍入
在进行对阶和右规时,都发生了尾数的右移;这种情况下虽然不会使数据发生错误,但是丢掉了末位的0或1影响了尾数的精度,可以采用舍入的方法来提高尾数的精度
(1)“0舍1入”法
(2)“恒置1”法
5、溢出判断
这里指的不是运算过程中尾数的溢出,因为尾数溢出时,就是符号位出现了01或者10的情况,这时只要通过右规一位就可以解决这样的溢出。
这里讨论的溢出是整个浮点数运算结果的溢出,根据阶码来判断
需要注意的是,在补码表示形式下,11.0000000表示绝对值最大的负数-1;00.11111表示绝对值最大的正数2n;11.0111111表示绝对值最小的负数-2-1-2-n,00.100000表示绝对值最小的正数2-1(因为必须是规格化的数)
因此,浮点机的溢出可由阶码的符号决定,
阶码[j]补=01,xxxxxx为上溢,必须做溢出中断处理;
阶码[j]补=10,xxxxxx为下溢,做机器零处理。
6.4.2 浮点乘除运算
浮点数的乘除运算,就是对应的阶码相加减,对应的尾数相乘除
1、阶码运算
阶码做相应的加减运算,需要进行溢出判断;
(1)阶码运算
用移码表示阶码,那么[jx+jy]移=[jx]移+[jy]补;[jx-jy]移=[jx]移+[-jy]补,具体推导可以看书p276,其实也很简单。
(2)溢出判断
在移码的符号位的前面(即高位)再增加一个符号位,并且规定这个符号位恒为1;那么当运算结果:
移码的最高符号位来表示是否溢出,1为溢出,0为未溢出;低符号位来表示数值的大小,1代表正数,0代表负数。(注意这里用的是移码,所以正好与补码所表示的正负相反!)
因此01代表负数,未溢出;00代表负数未溢出;
10代表上溢,11代表下溢
2、尾数运算
尾数做相应的乘除运算
(1)浮点乘法尾数运算
①判0:判断两个尾数中是否有0,若有0,直接得到0
②乘法:用前面讲的,定点小数的任意一种乘法运算完成。采用规格化尾数的时候,相乘的结果可能要进行左规;左规后可能会出现阶上溢or阶下溢;
③舍入:乘完之后会得到一个双倍字长的数,如果规定只能取一倍字长,则要进行舍入操作。
A.截断处理:直接丢掉低位字长
B.0舍1入:对原码0舍1入,对补码,丢失的为0xxxx或100000时直接舍;其他情况在末位加一修正。不管对正数还是负数,舍使绝对值变小,入使绝对值变大。
(2)浮点除法尾数运算
①判0:检测被除数是否为0,若为0,则直接得到0;拣择除数是否为0,若为0,则商为无穷大,另作处理。
②除法:可用定点数的任何一种除法运算完成。采用规格化尾数的时候,要先判断被除数绝对值是否比除数大,若比除数大,则要先把被除数右移一位,阶码加一,再做尾数相除,这样得到的结果一定是规格化定点小数。
王道补充
C语言中的浮点数类型及类型转换
6.5 算数逻辑单元 ALU
6.5.1 ALU电路
ALU电路是一个组合逻辑电路,没有记忆功能
其中Ai和Bi是要进行运算的两个输入变量,ki为控制信号,Fi为输出函数。
6.5.2 快速进位链
1、并行加法器
可以看出,最影响运算速度的是进位的产生
进位Ci=AiBi+(Ai+Bi)Ci-1
本地进位AiBi可记为di,与低位无关;传递进位(Ai+Bi)Ci-1,与低位有关,可称Ai+Bi为传递条件,记作ti,则Ci=di+tiCi-1
由Ci的组成可以把逐级传递进位的结构转换成以进位链方式实现快速进位
进位链:就是传送进位的电路
2、串行进位链
进位串行传送
设与非门的级延迟为ty,n位全加器的最长进位时间为2n*ty
3、并行进位链
n位进位同时产生(代入,运算出一个复杂的表达式),并行传送。又称先行进位、跳跃进位等
(1)单重分组跳跃进位
设与或非门的延迟时间为1.5ty,那么当diti形成后,只需要2.5ty就可以产生全部的进位。
这种情况下线路太复杂了,这才4位。下
将n位全加器分成若干个小组,小组内的进位同时产生,小组与小组之间采用串行进位。是一种组内并行、组间串行的进位链。
(2)双重分组跳跃进位链
n位全加器分若干大组,大组中又包含若干小组。让每个大组中小组的最高位进位同时产生。大组与大组之间采用串行进位。
第七章 指令系统
7.1 机器指令
7.1.1 指令的一般格式
操作码字段 | 地址码字段 |
1、操作码
(1)长度固定的操作码
便于硬件设计,指令译码时间短,广泛用于字长较长(计算机字长32及以上,常用定长操作码)的、大中型计算机和超级小型计算机以及RISC中
(2)长度不固定的操作码(扩展操作码)
①特点:操作码分散在指令字的不同字段中,可以有效地压缩操作码的平均长度。但是增加指令译码时间,控制线路也会更加复杂;
通常采用扩展操作码的技术,在地址码少时增加操作码的位数,以达到压缩指令长度的效果。
②扩展操作码的指令格式(这里可以看书上我的笔记)
2、地址码
地址码用来指出该指令的源操作数的地址(一个或者两个)、结果的地址、下一条指令的地址
(1)四地址指令
OP | A1 | A2 | A3 | A4 |
两个操作数的源地址,一个存放运算结果的目的地址,一个下一条指令的地址
指令完成(A1)OP(A2)→A3的操作
完成一条四地址指令需要访存4次
(2)三地址指令
把指令地址用程序计数器PC来存放,可以省去A4
两个操作数的源地址,一个存放结果的目的地址
指令完成(A1)OP(A2)→A3的操作
完成一条三地址指令需要访存4次(还是要取指)
(3)二地址指令
把运算结果存放在寄存器中,eg.ACC,可以省去A4
两个操作数的源地址
指令完成(A1)OP(A2)→A1的操作
完成一条三地址指令需要访存4次(还是要取指)
若(A1)OP(A2)→ACC,则只需要三次访存
(4)一地址指令
将一个操作数的地址隐含在运算器的ACC中,可以去掉A2
指令完成(ACC)OP(A1)→ACC的操作
(5)零地址指令
不需要操作数的指令,eg.空操作、停机
子程序返回、中断返回等操作数的地址隐含在堆栈指针SP中的指令
7.1.2 指令字长
(1)指令字长是可变的,既可以大于也可以小于机器字长;指令字长一般取字节的整数倍
把指令长度等于机器字长的指令称为单字长指令、以此类推还有半字长指令、双字长指令等。
常用的指令一般设计成单字长指令或短字长指令。
(2)若所有指令的长度都是相等的,则称为定长指令字结构;这种结构执行速度快,控制简单
指令长度随指令功能而异的指令称为变长指令字结构。
7.2 操作数类型和操作类型
7.2.1操作数类型
地址、数字、字符、逻辑数据
7.2.2 数据在存储器中的存放方式
存储字长
边界对齐
大端存储、小端存储
7.2.3 操作类型
1、数据传送
eg.出栈入栈、置1清0等
2、算术逻辑运算
3、移位
4、转移(属于程序控制指令)
(1)无条件转移指令 JMP
(2)条件转移指令
(3)调用(CALL)与返回(RET)
需要注意:CPU要记住返回地址,返回地址可以存在:①寄存器 ②子程序的入口地址内 ③堆栈
(4)陷阱与陷阱指令
一般是一种隐指令,在发生了意外事故中断后,CPU自动产生并执行。
注:调用指令和转移指令的区别:调用指令必须保存下一条指令的地址(返回地址),而转移指令不用保存。
程序控制指令
5、输入输出I/O指令
在I/O单独编址的计算机有专门的输入输出指令
6、其他
eg.停机、等待、空操作、开中断、关中断、置条件码等
7.3 寻址方式
7.3.1 指令寻址
(1)顺序寻址:PC自动加一
(2)跳跃寻址:转移类指令
跳跃到的地址分为绝对地址(由标记符直接得到)和相对地址(相对于现在指令地址的偏移量)
注:跳跃的结果是当前指令修改PC的值,因此下一条指令仍然通过程序计数器PC给出。
因此总是PC中存放指令地址
7.3.2 数据寻址
指令中必须给出寻址方式和形式地址,二者共同确定操作数的真实地址,称这个真实地址为有效地址EA
注:(A)代表的是地址A中存储的数值;eg.EA=(A)代表有效地址存放在A中
操作码 | 寻址特征 | 形式地址A |
寻址方式 | 特点 | 优点 | 缺点 | 注 |
立即寻址 | A是立即数(补码形式存放 | 执行阶段不用访存,指令执行时间最短 | A的位数限制了立即数的范围 | |
直接寻址 | A=EA | 寻找操作数简单,不用专门计算操作数地址; 指令执行阶段只访存一次 | A的位数限制了操作数的寻址范围 必须修改A的值才能改操作数地址 | |
隐含寻址 | 操作数地址隐含在操作码或某个寄存器中 eg.一个操作数隐含在ACC中 | 指令字中少了一个地址,有效缩短指令字长 | 需增加存储操作数或隐含地址的硬件 | |
间接寻址 | 不直接给出操作数地址,而是指出EA所在 地址,即 EA=(A) | 扩大了寻址范围,便于编制程序(调用返回) | 指令执行阶段需要访存多次(取决于间接的次数) 访存速度过慢,一般不用;一般为了扩大寻址范围, 用寄存器间接寻址 | 有一次间接寻址、多次间接寻址等;可以设 标记字段,当主存字第一位为1时,表示取出的 仍不是操作数的地址,即多次间址 |
寄存器寻址 | 有效地址是寄存器编号,EA=Ri,地址码A给出 寄存器的编号,操作数存在寄存器中 | 访问寄存器而不是主存,指令执行阶段不用 访存寄存器编码都比较短,节省了存储空间 | 寄存器价格昂贵,CPU中寄存器个数有限 | |
寄存器间接寻址 | 不直接给出操作数地址,而是指出EA所在 地址,这个地址在寄存器中,EA在主存中 EA=(Ri) | 比间接寻址少访存一次 | | |
基址寻址 | EA=A+(BR),形式地址与基地址相加 基地址BR存在基址寄存器中,BR不变,A变 基址寄存器是面向OS的,内容由OS和管理程序确定 | 扩大操作数的寻址范围;用户不必考虑自己的程序 存于主存的哪个空间区域,有利于多道程序设计 可用于编 | 偏移量A的位数较短 | 基址寄存器有显式和隐式两组 隐式是计算机专门设有基址寄存器BR 显式是用户指明用哪个寄存器当作BR 常用于操作系统来分配存储空间 |
变址寻址(数组、循环 | EA=A+(IX),形式地址与变址寄存器IX的内容相加 A不变,IX变 | 扩大操作数的寻址范围 | | 注意基址寻址和变址寻址的区别!!课本P316 还可以和间接寻址或基址寻址合用 |
相对寻址(跳转 | EA=A+(PC),形式地址A加PC,这里的A相当 于一个相对位移量 | 操作数的地址不是固定的,便于程序浮动 | | 可以和间接寻址配合使用 广泛用于转移指令 |
堆栈寻址 | 每次进栈(SP)-Δ→SP,出栈(SP)+Δ→SP Δ与存储字长有关,存储字长是几个字节,Δ就取几 | | | 又分为硬堆栈(寄存器堆栈)和 软堆栈(从内存中划一块) |
注:基址寻址和变址寻址的区别
基址寻址面向系统,主要用于为多道程序或数据分配存储空间,因此基址寄存器的内容由OS或管理系统确定,在程序的执行过程中其值不可变,而A可变;
变址寻址面向用户,主要用于处理数组问题,编写循环程序,变址寻址中,变址寄存器的内容由用户设定,在程序执行在其值可变,而A不可变(eg.A是数组首地址)
7.4 指令格式举例
7.4.1 指令格式应考虑的各种因素
高档机必须能兼容低档机的程序运行,称之为向上兼容
①操作类型
②数据类型
③指令格式
④寻址方式
⑤寄存器个数
7.4.2 指令格式举例(只做了一些简单阅读)
王道补充 X86汇编指令入门(看王道书)
7.5 RISC技术
RISC:Ruduced Instruction Set Computer
CISC:Complex Instruction Set Computer
7.5.1 RISC的产生和发展
7.5.2 RISC的主要特征
计算机执行程序所需的时间:P=I*C*T(I是高级语言编译之后在机器上运行的机器指令数,C为执行每条机器指令所需要的平均机器周期,T是每个机器周期执行的时间)
RISC比CISC的I要略大,但C和T都要小得多,所以RISC的性能要优于CISC2~5倍
1、RISC与CISC的主要特点
| RISC | CISC |
① | 简单指令组合成复杂指令,复杂指令的 功能由频度搞得简单指令的组合来实现 | 指令系统复杂庞大, 各种指令使用频度相差很大 |
② | 指令长度固定 指令格式种类少 寻址方式种类少 | 指令长度不固定 指令格式种类多 寻址方式种类多 |
③ | 只有取数/存数指令访存,其余 指令的操作都在寄存器中完成 | 可以访存的指令不受限制 |
④ | CPU中有多个寄存器 | CPU中没有专用寄存器 |
⑤ | 采用流水线技术 大部分指令在一个时钟周期内完成 采用超标量和超流水线技术,可以使 每条指令的平均执行时间小于一个时钟周期 | 绝大多数指令需要多个时钟周期才能执行完毕 |
⑥ | 控制器采用组合逻辑控制,不用或很少用微程序控制 | 采用微程序控制器 |
⑦ | 采用优化的编译程序,以减少程序执行的时间 | 难以用优化编译生成高效的目标代码 |
2、举例(只做了简单阅读!懒🐖)
CISC:X86系列
RISC:ARM、MIPS等
3、RISC指令系统的扩充(随便看了看P333)
7.5.3 RISC与CISC的比较
与CISC相比,RISC的主要优点
1、充分利用VLSI芯片的面积
因为RISC用的组合逻辑控制,占电路板的面积小;
而CISC用的是微程序控制器,但芯片面积50%以上
RISC已经占领了市场,尤其是工作站领域有明显优势
2、提高计算机的运算速度
3、便于设计,可降低成本,提高可靠性
4、有效支持高级语言程序
注:
①CISC大多能实现软件兼容,但RISC大多不能与老机器兼容
第八章 CPU的结构和功能
8.1 CPU的结构
8.1.1 CPU的功能(控制器)
CPU包括运算器和控制器两大部分
控制器专门负责协调并控制计算机各部件执行程序的指令序列,基本功能是取指令、分析指令、执行指令
1、取指令
自动形成指令地址,发出取指令的命令,将对应地址的指令取到控制器中
2、分析指令
要做什么操作,操作数地址
3、执行指令
发出操作控制信号序列
注:CPU必须具有指令控制、操作控制、时间控制、数据加工和中断处理的功能。
8.1.2 CPU结构框图
功能决定结构
CU:执行指令中发出各种控制信号
ALU:算逻运算单元(实际上只对CPU内部寄存器的数据进行运算)
寄存器:PC、IR等
中断系统
王道补充 CPU的基本结构的另一种表示方法
左侧是CPU
(1)运算器
又包括了ALU,MQ,ACC,X,PSW,移位器、计数器CT等
(2)控制器(用于执行指令)
有包括了PC、IR、指令译码器、很多把MAR、MDR也集成在CPU中,还有时序系统和微操作信号发生器(分为组合逻辑型和存储逻辑型)
分为硬布线控制器(组合逻辑控制单元)和微程序控制器两种类型
8.1.3 CPU的寄存器
1、用户可见寄存器
(1)通用寄存器
可以存数据,也可以做实现各种寻址方式的通用寄存器,eg做BR、IR、SP等
(2)数据寄存器
存操作数,有的时候操作数是地址也可以存
(3)地址寄存器
存地址,做实现各种寻址方式的专用寄存器
(4)条件码寄存器(部分透明)
存放条件码,eg正负零溢出
有些条件码可以设置,置位和复位
2、控制和状态字寄存器(都是专用寄存器)
用于控制CPU的操作或运算,大部分对用户是透明的
①MAR
②MDR
③PC
④IR
⑤PSW:程序状态字
⑥有的还有中断标记寄存器
8.1.4 控制单元和中断系统
控制单元提供完成计算机全部指令操作的微操作命令序列;
微操作命令序列的形成有两种方式:
①组合逻辑设计:硬连线逻辑
②微程序设计:存储逻辑
8.2 指令周期
8.2.1 指令周期的基本概念
1、各种各样的周期合集
(1)指令周期:包括取指阶段和执行阶段;又可分为下面的四个周期,其中(2)(4)不一定有
(2)访存周期(存取周期):访问一次存储器进行一次读/写的时间
(6)存取周期:存储器进行两次独立的存储器操作(连续两次读或写操作)所需的最小时间间隔
(3)CPU的工作周期:就是一个完整的指令周期(包含以下四个周期)
(4)时钟周期:机器主频的倒数(又叫节拍),一个时钟周期有一个工作脉冲(工作脉冲是控制器的最小时间单位)
(5)机器周期(CPU周期):包含若干个时钟周期
2、指令周期的组成
(1)取指周期
(2)间址周期
(3)执行周期
(4)中断周期
这四个机器周期都需要进行方寸操作,只是访存的目的不同,取指周期为了取指令,
间址周期为了取有效地址,执行周期为了取操作数,中断周期为了存断点(eg.PC存在主存地址为0的地址单元中)
对这四个周期设置了CPU工作周期触发器FE、IND、EX、INT,对设计控制单元有利。
注意:中断周期中的进栈操作是SP-1,和传统意义上的进栈操作相反,因为计算机中的堆栈都是向低地址增加
8.2.2 指令周期的数据流
1、取指周期的数据流
PC→MAR→AB→M
PC+1⬅CU→CB→M
IR⬅MDR⬅DB⬅M
2、间址周期的数据流
CU先检查IR,看有没有间址寻址,若是有的话,在进行下面的数据流,没有直接跳过间址周期
MDR→MAR→AB→M
CU→CB→M
MDR⬅DB⬅M
3、执行周期的数据流
多种多样,不做分析
4、中断周期的数据流
重点是保存PC的值
CU→SP-1→MAR→AB→M
CU→CB→M
PC→MDR→DB→M
PC(跳转)⬅CU
王道补充:指令执行方案
(1)单指令周期
每条指令的执行时间相同,执行周期取决于最长的指令执行时间
串行执行
执行时间短的指令要等待,降低整个系统的运行速度
(2)多指令周期
每条指令的执行时间不同,执行周期可以不同
串行执行
(3)流水线方案
每个时钟周期都启动一条指令,尽量让多条指令同时运行,但各自处在不同的执行步骤
并行执行,大大提高了指令执行的效率,缩短了平均指令周期
王道补充 数据通路的功能和基本结构
一、数据通路的功能
数据在功能部件之间传送的路径称为数据通路,路径上的部件称为数据通路部件
数据通路描述了信息从什么地方开始,中间经过哪个寄存器或多路开关,最后传送到哪个寄存器,这些都需要加以控制
数据通路中专门进行数据运算的部件称为执行部件或功能部件,数据通路由控制部件控制,控制部件根据每条指令功能的不同生成对数据通路的控制信号,并正确控制指令的执行流程。
数据通路的功能是实现CPU内部的运算器与寄存器及寄存器之间的数据交换
二、数据通路的基本结构
(1)CPU内部单总线方式
结构简单,但总线冲突多,性能较低
(2)CPU内部三总线方式
提高了一定的效率
(3)专用数据通路方式(不采用CPU内部总线方式的数据通路)
根据指令执行过程中的数据和地址的流动方向安排连接线路,避免使用共享的总线
性能较高,基本不出现数据冲突的现象但硬件量大,结构复杂,不易实现
1、寄存器之间的数据传送
2、主存与CPU之间的数据传送
3、执行算术或逻辑运算
8.3 指令流水
王道补充:
1、流水线方式的特点
1)一个任务分解成几个有联系的子任务
2)流水线的每个功能段后面都要有一个缓冲寄存器,或称锁存器,其作用是保存本流水段的执行结果,供下一流水段使用
3)流水线中各功能段的时间应尽量相等
4)尽量是连续的任务
5)有装入时间和排空时间
2、流水线的分类
(1)部件功能级流水线、处理机级流水线、处理机间级流水线
(2)单功能流水线、多功能流水线
(3)动态流水线和静态流水线
(4)线性流水线和非线性流水线
8.3.1 指令流水原理
重叠
指令流水段个数以最复杂的指令所用的功能段个数为准,流水段的长度以最复杂的操作所花的时间为准;
流水线方式不能缩短一条指令的执行时间,但是对于整个程序来说,大大增加指令执行的吞吐率
8.3.2 影响流水线性能的因素(三个相关)
流水线冲突(冒险)
1、结构相关(资源冲突)
(1)不同指令争用功能部件产生资源冲突
(2)解决方法:①停顿(加入气泡);②指令和数据分开存储器存储(哈弗结构);③指令预取技术
2、数据相关(数据冲突)
(1)分为:写后读(WAR),读后写(RAW),写后写(WAW)
(2)解决方法:①后推法(有硬件阻塞stall和软件插入NOP两种方法;②旁路技术(前向通道、定向技术)
③通过编译器对数据相关的指令编译优化的方法,调整指令顺序来解决数据相关
3、控制相关(控制冲突)
(1)转移指令造成的
(2)尽早判别转移是否发生;预取转移成功和转移不成功两个控制流方向上的指令;加快和提前形成条件码;提高转移方向的猜准率等。
8.3.3 流水线性能
1、吞吐率
单位时间内流水线所完成的任务数量或输出结果的数量
TP=n/Tk
(1)最大吞吐率
(2)实际吞吐率
2、加速比Sp
不用流水线所用的时间/用流水线需要的时间
3、效率E
指流水线中各功能段的时空区利用率、即设备利用率
n→∞时,效率Emax=1
8.3.4 流水线中的多发技术
1、超标量技术
多个功能部件、指令译码电路、寄存器端口、总线;同时执行多个操作;
编译程序决定哪几条指令可并行执行
2、超流水线技术
流水线再分段
3、超长指令字技术
类似于超标量技术,但是把可以并行操作的指令组合成一条具有多个操作码的超长指令