计算机组成原理--ALU 做算术运算

  在前面,分别介绍了 ALU 芯片和它做算术运算的基本功能:
   ALU (算术逻辑单元)、 ALU 的算术运算功能
  下面,针对 ALU 做的算术运算,再作稍加详细一点的介绍。

  ALU 芯片 74LS181 所具有的算术运算功能,共有 16 种。但是,其中有一些与算术运算并没有关系。剔除了无关的,剩下有用的算术功能,就只有 6 种了。可见下表所示。

  上表中的前两种功能,就是典型的加减运算了,本博文打算就这两个功能做一些实验,再写个记录。

  74LS181 的各种算术运算,是以 Si 中的四位二进制数来进行区分的。 仔细看看上表,可看出,在做加减运算时,它们是互相反相的。因此,就可以用一个反相器来控制它们。 当控制信号为 0 时,可令 S2 = S1 = 0,经过反相器则可令 S3 = S0 = 1,这就使 74LS181 工作在 A-B-CN 的状态。 又当控制信号为 1 时,则有 S2 = S1 = 1、S3 = S0 = 0,此时,74LS181 将工作在 A+B+/CN 的状态。

  用一个拨动开关,控制加减运算的电路如下图所示。

  上图是作减法运算时的截图。 作加法运算的截图在下面。

  控制加减运算的拨动开关,位于图中的左上角。 参加运算的两个数字(Ai、Bi)是固定值,由图中上方的两组连线确定。 作加减运算的是两片 74LS181(U1、U2),算出来的结果(Fi),由图中下方的八个 LED 进行显示。 要注意,作加法运算时,CN 和 CN+4,都是负逻辑,而在进行减法运算时,它们又是正逻辑。 因此,就在最后的进/借位处,安装了两个 LED。进行加法运算时,由左边的 LED 显示进位;作减法时,你就看右边的 LED 吧,右边才是借位。

  由图可见,由 ALU 构成的加减电路,还是很简单的。 用两片芯片,就可做八位数的运算,再加上两片,即可做 16 位数的加减了。 要想做 32 位数的运算,也就是这种电路的复制粘贴而已,没有任何难度。


  上面的两个截图,是做八位数的加(或者减)运算。 参加运算的数据,你可以认为是无符号数,也可以认为是号数(补码)。 无论你怎么想,运算结果,肯定都是正确的。

  下面对加法运算的结果,进行分析。 请见下图。

  两个加数,分别是:Ai = 65H、Bi = A7H。 CN = H,所以在运算时,/CN = 0
  经过运算,和,则是:
0 0000 1100。 由于进位是负逻辑,所以,真正的进位是 1。
  如果把 Ai、Bi 当做
无符号数,它们就是 101 167。它们的和,就应该是 268。 而 181 的运算结果是 1 0CH,换算到十进制,正是 268。 运算正确。
  如果把 Ai、Bi 当做
号数(补码),它们就是 101-89。它们的和,就应该是 +12。 而 181 的运算结果是 1 0CH,舍弃进位后,正是 +12。 运算也正确无误。


  下面对减法运算的结果,进行分析。 请见下图。

  本电路做的减法运算是:Ai-Bi-CN = 65H-A7H-0 = 1 BEH,其中的 1,是借位
  
如果把 Ai、Bi 当做无符号数,它们就是 101 167。它们的差就应该是-66。 而 181 运算的八位结果是 BEH = 190,再算上借位的 1 (就是-256),完整的结果正是-66。 运算正确。
  如果把 Ai、Bi 当做
号数(补码),它们就是 101-89。它们的差,应该是 +190。 但是,这个数值,已经超出八位补码所表示的范围,这就是溢出了。 所以,此次运算的结果并非是正确的理论值。 虽然,把 181 运算结果中的进位舍弃,八位的结果,也正是 BEH = 190。 本次运算,貌似,也算是正确吧,只是不能按照八位补码来解释了。

  为了深入理解 74LS181 的减法功能,做而论道又把 Ai、Bi 的数据交换了一下,令 181 做了这样的减法运算:Ai-Bi-CN = A7H-65H-0 = 42H

  如果把 Ai、Bi 当做无符号数,它们就是 167  101。它们的差就应该是 66。 而 181 的运算结果是 0 42H = 66。 运算正确。
  如果把 Ai、Bi 当做
号数(补码),它们就是-89 101。它们的差,应该是-190。 这个数值,又是超出八位补码的表示范围了,发生了溢出。 所以,此次运算的结果并非是正确的理论值。

  从前面的结果数据来看,把 65H、A7H 当做无符号数来相减,结果是完全正确的。 但是,把它们视为号数(补码)时,却都是溢出的。 溢出后的运算结果,就不是所需要的结果了。 其实,溢出的原因,是相减之后的差,超出了 8 位数的表示范围,并不能说是本减法电路不能做号数的减法运算。

  前面所用的数据(65H、A7H)是在网上抄来的。 原作者可能不懂号数的减法运算,所以,就弄这么两个不好用的数据,发到网上,冒充内行。

  既然这两个数据不能验证 ALU 做号数减法运算的正确性,做而论道就另外找了两组数字(C5H、A7H65H、47H),按照同样的方法,做了两数的相减以及颠倒再相减的测试。
  测试结果如下图所示。

  由这些测试结果来看,74LS181 的减法运算,对无符号数号数都是适用的。

  在上图中列出的是:两个负数相减 以及 两个正数相减 的数据分析。 显然,这两次相减的差,都没有(也不会)超出 8 位补码的表示范围,所以,也就没有出现溢出的现象。 既然没有溢出,运算结果,就都是正确的。 这就验证了:74LS181,可以做号数的减法运算

  经过做而论道的测试,可以观察到:利用 ALU ,可以进行数据的减法运算!
  由此可以推论:
“减法,必须用补码相加” 的说法,就是过时的了。

  结论:在 CPU 中,想做减法,立即就可以做了!
  根本就不用闲扯什么:
先求补码、再相加
  
特别是在进行除法运算时,你想减谁就减谁吧,你不必再玩那些 “花活” 了!

--本文完--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值