蒙珣的博客

活好当下,做好今天该做的事情。

0%

CH3-计算机的算术运算

引言

计算机中的字由位组成。因此,字可以用二进制数表示。第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. 补码加减的溢出分为哪两种,分别对应哪四个情况?

    1
    2
    3
    补码加减溢出分别为:上溢和下溢
    分别对应:上溢有 正数+正数溢出 和 正数-负数溢出两种
    下溢有 负数+负数溢出 和 负数-正数溢出两种
  2. 为什么最低位ALU不接受进位,也要使用全加器?

  3. 为了支持and、or运算,采用哪种数字电路部件来选择信号?nor运算怎么实现?

  4. 32位ALU怎样支持slt和条件分支指令?

  5. 三组(四位)ALU控制信号的作用分别是什么?

  6. 行波进位和超前进位加法器的门延迟分别怎么计算?

    1
    2
    3
    4
    行波进位的门延迟为:位数*2,即 32*2=64
    因为每一位要经过一个与门和一个或门

    超前进位的门延迟为:位数中4的几次方,并向上取整然后*2+1。即4^2.5+1 -> 3*2+1 = 7
  7. 改进前的乘法器,控制逻辑实现哪些功能?

    1
    2
    3
    根据乘数最低位是0还是1,决定被乘数是否加到积上
    实现两个移位:被乘数左移,乘数右移
    计数:当循环(迭代)进行32次后退出
  8. 改进后的乘法器和除法器是否可以共用一套硬件?64位寄存器怎么变化?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    可以。
    64位寄存器的变化:
    对于乘法
    最开始,左边是32位的积,右边是32位乘数
    最后经过32步的运算,整个变成64位的积

    对于除法
    最开始,存放的是64位的被除数(一开始的余数)
    最后,变成左边32位的余数,右边32位的商
  9. SCU熟练掌握分步列出改进后的乘除法器中寄存器的值【熟练掌握】

    1
    改进前后的表,改进后都为4次
  10. 乘法、除法分别用什么策略实现进一步改进?

    1
    2
    乘法:将32个ALU组合起来变成并行树。只需等待log2^32,即532位长的加法时间,而不是等待32次加法时间。
    除法:采用SRT。通过查找表的方法来尝试猜测每步几个商位。其中查找表基于被除数和余数的高位部分来进行。依赖后面的步骤来修正错误的猜测。