在《计算机组成原理》课程中,用于算术运算的器件,是从加法器开始介绍的。 先后学习了:半加器、全加器、串行进位加法器、超前进位加法器。 最后,稍稍接触了一点减法器。 这门课程,就这么慢慢腾腾的,学这些陈芝麻烂谷子,可以说,一点用处都没有。 计算机中,早就有了 ALU (算术逻辑单元),加法运算、减法运算、各种逻辑运算,都是手到擒来的事! ALU 的集成电路芯片 74LS181,早都问世许多年了,使用这块芯片,就可以轻而易举的验证二进制数的各种算术运算和逻辑运算。 利用这块芯片,就可以更快更直接的理解计算机内部的运算方法,也可以更深入的体会到计算机编程语言的思路。
在之前的博文中,做而论道也曾经用门电路设计出来了 “真正的减法器”。 虽然,做而论道仅仅给出了两位数减两位数的电路,但是,该电路还具有来自低位借位的输入端,这就比用加法器冒充的减法器更具有实用意义了。 针对这个仅有两位数减法运算功能的电路,你当然还可以继续扩充位数。 但是,用门电路来搭建更多位的运算电路,就太复杂了,基本上就偏离了学习《计算机组成原理》的初衷。
使用 ALU 芯片就可以方便的实现多位数的运算电路了。
在前面几篇博文中,做而论道介绍了:算术逻辑运算单元、逻辑运算、算术运算、用 ALU 做算术运算。 博文中的给出各种运算电路,都是简单直观的,仅仅通过几个预定的数字,对 ALU 芯片进行功能验证。 下面,做而论道给出一个能够全面验证减法运算的完整电路。 利用这个电路,你可以进行八位数-八位数-低位借位的运算。每个八位数,都可以全面涵盖 0 ~ 255 的范围。
电路如下所示。
上图中的两片 ALU 芯片,是级联在一起的,此时,它们就构成了八位的 ALU。 在芯片的 M 引脚接上低电平,就确定了 ALU 要做算术运算。 芯片的 S3S2S1S0 引脚分别接上了 0110,就令 ALU 芯片做减法运算(Ai-Bi-CN)。
上图中的左上角,有 16 个拨动开关,你可以用它们输入被减数和减数的数值。 低位借位,则由左中部的拨动开关来输入。 ALU 的运算结果,是由下方的 9 个 LED 显示的。
在上图中,被减数 Ai = 1000 0000 = 128,减数 Bi = 0000 1111 = 15,低位借位 CN = 0。经过减法运算,借位和差值就是:0 0111 0001 = 113,运算完全正确。
用这个电路,再计算几组数字吧。 下图就是:0000 0000-0000 0001-0 = -1 的截图。
上图中下方的 9 个 LED,都是发光的,这表明,ALU 的运算结果是:1 1111 1111。
你可以先看低八位的差值, 8 个 1,这就是十进制的 255。 而借位 1,则代表-256。 综合在一起,就是:255-256 = -1。 运算正确。
如果忽略借位,仅看低八位的 1111 1111,这正是-1 的补码。
下图则是:1111 0000-1111 0101-1 = -6 的截图。
上图中差值是:1111 1010 = 250。 借位 1,则代表了-256。 综合,正是-6。
如果只看八位的差值,1111 1010,这正是-6 的补码。
当然,还可以列举更多的数值减法计算。 限于篇幅,就在这里,做个总结吧。
结论:
1、当代计算机中,都具有 ALU,可以随时做减法运算。不必取反加一再相加。
2、在 ALU 中,无论是何种数字来参加运算,无论是一般的二进制数或者是补码(带符号数),ALU 的算法,都是一样的。 减法时,就是借一当二,加法时,就是逢二进一。
3、如果你的被减数和减数,都是一般的二进制数(即无符号数),运算结果,就要把借位考虑进去。 运算结果就是 9 位数,借位 1,就是-256。
4、如果你的被减数和减数,都是所谓的补码(即带符号数),那么,运算结果,就不要考虑借位了。 八位的差值,正是 “差的补码” 。
以上拙见,如有不当之处,欢迎留言评论。
--本文完--