引言
计算机中的字由位组成。因此,字可以用二进制数表示。第2章里提到整数可以表示成十进制或者二进制形式,但是其他常数用的数据如何表示?例如:
- 小数和其他实数如何表示?
- 当一个操作数生成了一个无法表示的大数时如何处理?
- 上述问题隐含着一个秘密:怎样用硬件真正地做乘法和除法?
本章的目的就是要揭示这些秘密,包含实数的表示方法、算术的算法、实现这些算法的硬件,以及如何在指令集中表示有关的内容。有了这些知识后,你就能解释在使用计算机的过程中遇到的各种不明白的事情了。另外,我们还将介绍如何使用该技术加速算术运算密集型程序的运行。
章节导图
第一部分
整数的表示
无符号整数 原码 反码
不同于MIPS的32位字,我们先讨论8位整数
将全部8位用来表示绝对值的二进制数叫做无符号整数
其表示范围为 0 ~ +255,即 (2^8-1)
00000000 00000001 00000010……11111111
将最高位用来表示正负号(正数为0,负数为1),其余7位表示绝对值的方法叫做原码>
也称为符号和幅值表示法,其表示范围为 -127 ~ -0 ~ +0 ~ +127,即 (2^7-1)
00000000 00000001 00000010……01111111 10000000 10000001 ……11111111
*原码是带符号整数的表示方法
将最高位为0的原码按位取反来表示负数,叫做反码
其表示范围为 -127 ~ -0 ~ +0 ~ +127
00000000 00000001 00000010……01111111 11111111 11111110 ……10000000
补码 符号扩展 大小端编址
原码和反码不能直接用于二进制加减法,且正负两个0会给编程人员带来麻烦
因此,当今计算机都采用可以直接加减的补码来表示带符号整数
先用 00000000 ~ 01111111 表示零和正整数 0 ~ +127
再用 10000000 ~ 11111111 表示负数 -128,即(-2^7) ~ -1
数x和它的反码相加,必定是11111111 (-1)
即 x + x̅ = -1,x̅ + 1 = x,因此将一个补码整数化为它的相反数,方法就是按位取反再+1
addi指令中,第一个源操作数是32位补码寄存器,第二个源操作数是16位补码立即数
将最高位即符号位,复制到高16位,即可完成符号扩展
对于一个长于1字节的整数,如果高位放在低地址,就称为大端编址
如果高位放在高地址,就称为小端编址
对于大小端编址可以参考《深入理解计算机系统》,有详细的介绍与讲解
对于16位补码 0xFFE0 1)十进制真值为? 2)符号扩展=? 3)大端/小端编址分别=?
第二部分
整数的四则运算ALU
复习题
补码加减的溢出分为哪两种,分别对应哪四个情况?
1
2
3补码加减溢出分别为:上溢和下溢
分别对应:上溢有 正数+正数溢出 和 正数-负数溢出两种
下溢有 负数+负数溢出 和 负数-正数溢出两种为什么最低位ALU不接受进位,也要使用全加器?
为了支持and、or运算,采用哪种数字电路部件来选择信号?nor运算怎么实现?
32位ALU怎样支持slt和条件分支指令?
三组(四位)ALU控制信号的作用分别是什么?
行波进位和超前进位加法器的门延迟分别怎么计算?
1
2
3
4行波进位的门延迟为:位数*2,即 32*2=64
因为每一位要经过一个与门和一个或门
超前进位的门延迟为:位数中4的几次方,并向上取整然后*2+1。即4^2.5+1 -> 3*2+1 = 7改进前的乘法器,控制逻辑实现哪些功能?
1
2
3根据乘数最低位是0还是1,决定被乘数是否加到积上
实现两个移位:被乘数左移,乘数右移
计数:当循环(迭代)进行32次后退出改进后的乘法器和除法器是否可以共用一套硬件?64位寄存器怎么变化?
1
2
3
4
5
6
7
8
9可以。
64位寄存器的变化:
对于乘法
最开始,左边是32位的积,右边是32位乘数
最后经过32步的运算,整个变成64位的积
对于除法
最开始,存放的是64位的被除数(一开始的余数)
最后,变成左边32位的余数,右边32位的商SCU熟练掌握分步列出改进后的乘除法器中寄存器的值【熟练掌握】
1
改进前后的表,改进后都为4次
乘法、除法分别用什么策略实现进一步改进?
1
2乘法:将32个ALU组合起来变成并行树。只需等待log2^32,即5次32位长的加法时间,而不是等待32次加法时间。
除法:采用SRT。通过查找表的方法来尝试猜测每步几个商位。其中查找表基于被除数和余数的高位部分来进行。依赖后面的步骤来修正错误的猜测。