二进制浮点数的加减运算
上面我们进行了十进制的浮点数的加减运算,下面我们可以以此类推,也按照上面五个步骤来做
直接看一个例题:已知十进制数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:表示整数,范围 -231 ~ 231-1 ,有效数字32位
float:表示整数及小数,范围 ±[2-126 ~ 2127×(2−2−23)],有效数字23+1=24位
奇偶校验码
概念
由若干位代码组成的一个字叫码字。
将两个码字逐位进行对比,具有不同的位的个数称为两个码字间的距离。
一种编码方案可能有若干个合法码字,各合法码字间的最小距离称为“码距”。
例如:下面两组的码距分别是1和2
其中码距的能力范围是:
- 当d=1时,无检错能力;
- 当d=2时,有检错能力;
- 当d≥3时,若设计合理,可能具有检错、纠错能力
奇偶校验码
- 奇校验码:整个校验码(有效信息位和校验位)中“1”的个数为奇数。
- 偶校验码:整个校验码(有效信息位和校验位)中“1”的个数为偶数。
例1: 给出两个编码1001101和1010111的奇校验码和偶校验码。
设最高位为校验位,余7位是信息位,则对应的奇偶校验码为:
奇校验: 11001101 01010111
偶校验: 01001101 11010111
1
0
例2: 给出两个编码1001101和1010111的奇校验码和偶校验码。
设最高位为校验位,余7位是信息位,则对应的奇偶校验码为:
奇校验: 11001101 01010111
偶校验: 01001101 11010111
偶校验的硬件实现:各信息进行异或(模2加)运算,得到的结果即为偶校验位
例如:将上述例子求偶校验位:
偶数个错误校验不出
例如
总结
三、主存储器
保留,我貌似没学过,不晓得,可能和后面存储系统混了,先看看书
四、指令系统
指令案例文章(必看):https://editor.csdn.net/md/?articleId=116792581
现代计算机的结构
这次就开搞控制器!
学会指令系统就可以更精进之前搞的典型过程了:
https://yangyongli.blog.csdn.net/article/details/116792581
指令格式
指令的定义
指令(又称机器指令):是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。
一台计算机的所有指令的集合构成该机的指令系统,也称为指令集。
注:一台计算机只能执行自己指令系统中的指令,不能执行其他系统的指令。
例如:x86 架构、ARM架构之间不能互相执行对方架构系统的指令。
指令格式
一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。
一条指令通常要包括操作码字段和地址码字段两部分(如下图所示):
操作码就是要表达用户要干什么?
比如:停机中断、求反求补、加减乘除……
地址码就是要说明对谁进行操作?
比如:不需要操作对象、需要一个操作对象、需要两个操作对象……
其中 一条指令可能包含 0个、1个、2个、3个、4个 地址码…
根据地址码数目不同,可以将指令分为 零地址指令、一地址指令、二地址指令…
零地址指令
- 不需要操作数,如空操作、停机、关中断等指令
- 堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压回栈顶
一地址指令
- 只需要单操作数,如加1、减1、取反、求补等
指令含义:OP(A1)→A1 ,完成一条指令需要3次访存:取指→ 读A1 →写A1
- 需要两个操作数,但其中一个操作数隐含在某个寄存器(如隐含在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位地址码的直接寻址范围=2n,若指令总长度固定不变,则地址码数量越多,寻址能力越差
分类
指令-按地址码数目分类
指令-按指令长度分类
可以分为:半字长指令、单字长指令、双字长指令 ——指令长度是机器字长的多少倍
指令字长:一条指令的总长度(可能会变)
机器字长:CPU进行一次整数运算所能处理的二进制数据的位数(通常和ALU直接相关)
存储字长:一个存储单元中的二进制代码位数(通常和MDR位数相同)
指令字长会影响取指令所需时间。如:机器字长=存储字长=16bit,则取一条双字长指令需要两次访存
定长指令字结构:指令系统中所有指令的长度都相等
变长指令字结构:指令系统中各种指令的长度不等
指令-按操作码长度分类
- 定长操作码:指令系统中所有指令的操作码长度都相同(n位 → 2n条指令)
——控制器的译码电路设计简单,但灵活性较低
- 可变长操作码:指令系统中各指令的操作码长度可变
——控制器的译码电路设计复杂, 但灵活性较高
- 扩展操作码指令格式:定长指令字结构+可变长操作码
指令—按操作类型分类
- 数据传送(数据传送类:进行主存与CPU之间的数据传送)
LOAD 作用:把存储器(源)中的数据放到寄存器(目的)中
STORE 作用:把寄存器(源)中的数据放到存储器(目的)中
- 算术逻辑操作
算术:加、减、乘、除、增 1、减 1、求补、浮点运算、十进制运算
逻辑:与、或、非、异或、位操作、位测试、位清除、位求反
- 移位操作
算术移位、逻辑移位、循环移位(带进位和不带进位)
转移操作(程序控制类:改变程序执行的顺序)
无条件转移 JMP
条件转移 JZ:结果为0;JO:结果溢出;JC:结果有进位
调用和返回 CALL和RETURN
陷阱(Trap)与陷阱指令
- 输入输出操作(输入输出类(I/O):进行CPU和I/O设备之间的数据传送)
CPU寄存器与IO端口之间的数据传送(端口即IO接口中的寄存器)
指令格式小结
扩展操作码
指令由操作码和若干个地址码组成。
PS:先回顾一下指令字结构与操作码的概念:
- 定长指令字结构:指令系统中所有指令的长度都相等
- 变长指令字结构:指令系统中各种指令的长度不等
- 定长操作码:指令系统中所有指令的操作码长度都相同
- 可变长操作码:指令系统中各指令的操作码长度可变
定长指令字结构+可变长操作码 → 扩展操作码指令格式(即不同地址数的指令使用不同长度的操作码)
扩展操作码举例
这只是一种设计方法:
设计扩展操作码需注意:
- 不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。(对比哈夫曼树“前缀编码”)
- 各指令的操作码一定不能重复。
通常情况下,对使用频率较高的指令,分配较短的操作码;对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间。
设计扩展操作码例题:
设指令字长固定为16位,试设计一套指令系统满足:
a) 有15条三地址指令
b) 有12条二地址指令
c) 有62条一地址指令
d) 有32条零地址指令
设地址长度为n,上一层留出m种状态,下一层可扩展出m×2!种状态
解:
a) 共24=16种状态
留出16-15=1种
b) 共1 ×24=16种
留出16-12=4种
c) 共4 ×24=64种
留出64-62=2种
d) 共2 ×24=32种
指令操作码
操作码指出指令中该指令应该执行什么性质的操作和具有何种功能。
操作码是识别指令、了解指令功能与区分操作数地址内容的组成和使用方法等的关键信息。
例如,指出是算术加运算,还是减运算;是程序转移,还是返回操作。
操作码分类:
定长操作码:
在指令字的最高位部分分配固定的若干位(定长)表示操作码。
- 一般n位操作码字段的指令系统最大能够表示2n条指令。
- 优:定长操作码对于简化计算机硬件设计,提高指令译码和识别速度很有利; -
缺:指令数量增加时会占用更多固定位,留给表示操作数地址的位数受限。
扩展操作码(不定长操作码) :
全部指令的操作码字段的位数不固定,且分散地放在指令字的不同位置上。
- 最常见的变长操作码方法是扩展操作码,使操作码的长度随地址码的减少而增加,不同地址数的指令可以具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。
- 优: 在指令字长有限的前提下仍保持比较丰富的指令种类;
- 缺 :增加了指令译码和分析的难度,使控制器的设计复杂化。
首先 ,我们还得先回忆一下计算机的工作过程:
https://yangyongli.blog.csdn.net/article/details/116792581
指令寻址
指令寻址: 下一条 欲执行 指令 的 地址(始终由程序计数器PC给出)
即( PC ) + 1→ PC,如下面图片的例子
该系统采用定长指令字结构
指令字长=存储字长=16bit=2B(地址为16位)
主存按字编址
我们将上面例子拆分为: 指令地址、操作码、地址码。如下图形式
顺序寻址
( PC ) + “1” → PC
跳跃寻址
由转移指令指出
JMP:无条件转移把PC中的内容改成地址码数值
例如在前面的例子中
小结
指令寻址 v.s. 数据寻址
寻址方式不同
寻址方式特征包括:(十种)