计算机对字节的处理有七种:复制,左移,右移,非,与,或,异或。本篇将回顾一下这几种操作的具体底层实现
四种常见的门结构
到目前为止,我们已经使用了NAND、AND和NOT门。我们需要定义另外两个组合门。第一个是这样建造的:
这种结构的输入和输出关系表为:
在这种情况下,当两个输入都关闭时,输出都关闭,但如果“a”或“b”打开,或者两者都打开,则输出将打开。因此,它有另一个非常简单的名称,称为“OR门”。它没有绘制所有部分,而是有自己的图表,形状类似于屏蔽。图表和图表如下所示
最后一个组合门是“异或”门结构,需要五个基础门构成,但它最终的作用非常简单。一种看待它的方式是如果一个且只有一个输入打开,输出就会打开。还有一种看待输出的方式是:如果输入相同,输出就会关闭,如果输入不同,输出就会开启。
简化的图看起来类似于或门,但在输入端有一条双曲线。图表和图表如下所示
回顾一下,我们现在有四种门,它们接受两个输入并产生一个输出。它们是NAND、AND、OR和XOR。下面是一个图表,它非常简单。对于“a”和“b”这四种可能的输入组合,每种类型的门都有自己的输出状态集,门的名称可以帮助您记住哪个是哪个。
对字节的操作
单独的门在bit上进行操作。两bit进,一bit出。但是RAM一次存储和检索一个字节。总线一次移动一个字节。在CPU中,我们希望能够一次处理整个字节。我们需要一些影响整个字节的“门”。前面关于总线的介绍中,我们看到了字节的内容如何从一个寄存器复制到另一个寄存器。这通常称为移动字节。现在我们将看到这方面的一些变化 。
首先,我们将看到当字节从一个寄存器移动到另一个寄存器时,我们可以通过三种方式来改变它的内容。第二,我们将看到四种方法,我们可以获取两个字节的内容,并让它们相互作用,为第三个字节创建内容。这些都是计算机实际对字节所做的一切。所有的事情最终归结为这七个操作。
左移右移
移动功能很容易构造。它根本不使用任何门,只是把总线连接起来有点奇怪。是这样做的
这显示了由右移位器连接的两个寄存器。移位器只是两个寄存器之间的导线。当R1的“e”位被开启,R2的“s”位被打开然后关闭时,R1中的所有位都被复制到R2中,但它们在一个固定位置上移位。底部的位(移出)可以连接到计算机中的其他位,但通常会连接回顶部的位(移入),当这一操作完成时,最右边的位会环绕到字节另一端的最左边的位。一次右换档器将从0100 0010更改为0010 0001
如果“shift out”连接到“shift in”,则右换档将从0001 1001更改为1000 1100,左换档将从0100 0010更改为1000 0100。左换档的接线方式如下。
简化版本的移位图如下,它们各自有一个“i”和“o”总线,以及一个输入和输出位,如下所示
这有什么用呢?程序员的大脑里想出了各种各样的东西,但这里有一个有趣的东西。假设您使用的是二进制数字代码。R1中的数字是0000 0110。它是十进制数6。现在将代码左移到R2。R2将是0000 1100。这是十进制数字12。你知道吗,我们刚刚将数字乘以2。这是我们计算机中乘法的基础。稍后将看到你如何乘以2以外的数,但这是多么简单,只需移位bit即可。这类似于我们对十进制数所做的事情。如果你想把某个数字乘以10,你只需在右边加上一个零,有效地将每个数字左移一个位置。在二进制系统中,这只会导致乘以2,因为系统基于2。所以这就是移位,没有涉及门结构的操作。
非(NOTter)
此设备将两个寄存器与八个NOT门连接。每个位都将改变为相反的。如果你从0110 1000开始,你将以1001 0111结束。这个操作有很多用途,第一个是在一些算术函数中。在我们描述其他一些事情之后,我们将很快看到这是如何工作的。NOT门的另一个名字是“取反器”,因为它与你给它的东西相反,把它颠倒过来,或者将其反转。
输入和输出都是八根导线,简化图如下:
与(ANDer)
ANDer取两个输入字节,并将这两个字节的每一位与操作为第三个字节。如您所见,“a”输入总线的八位连接到八个与门的上侧。“b”输入总线的八位连接到相同八个与门的下侧。八个与门的输出形成了该组件的总线输出“c”。这样,我们可以将两个字节加在一起形成第三个字节。
这有很多用途。例如,您可以确保ASCII字母代码为大写。如果您在R0 0110 0101中有字母“e”的代码,您可以将位模式1101 1111放入R1,然后将R1和R0进行and运算,并将答案放回R0。除第三位外,R0中的所有位都将被复制回R0中。无论第三位之前是开还是关,它现在将关闭。R0现在将包含0100 0101,即“E”的ASCII代码这适用于所有ASCII字母代码,因为这就是ASCII的设计方式。
下面是ANDer的一个更简单的总线类型图片
或(ORer)
ORer取两个输入字节,并将这两个字节中的每一位OR为第三个字节。如您所见,“a”输入总线的八位连接到八个或门的上侧。“b”输入总线的八位连接到相同八个或门的下侧。八个或门的输出是该组件的总线输出“c”。这样,我们可以将两个字节一起进行OR运算,形成第三个字节
这有什么用?有很多,但这里有一个。假设你有字母“E”的ASCII码,在R0,0100 0101中。如果你想让这个字母变为小写,你可以将位模式0010 0000放入R1,然后对R0和R1进行OR运算,然后将答案放回R0。会发生什么?R0的所有位都将被复制回R0中,除了第三位现在将处于开启状态。R0现在将是0110 0101,“e”的ASCII代码由于ASCII的设计方式,无论R0中的ASCII字母代码是什么,这都会起作用。
下面是ORer的一个简单的总线类型图片
异或(XORer)
XORer接受两个输入字节,并将这两个字节的每一位XOR为第三个字节。如您所见,“a”输入总线的八位连接到八个XOR门的上侧。“b”输入总线的8位连接到相同的8个XOR门的下侧。八个XOR门的输出是此组件的总线输出“c”。有了这个,我们可以将两个字节异或在一起形成第三个字节
这有什么用?同样,富有想象力的人想出了许多用途。但这里有一个。假设你在R1中有一个代码,在R2中有另一个代码。你想知道这两个代码是否相同。所以你将R1和R2异或为R1。如果R1和R1包含相同的模式,那么R1现在将全部为零。R1中的0和1是什么模式并不重要,如果R2包含相同的模式,在XOR之后,R1将全部为零.
由于输入和输出都是八线的,我们将使用总线类型图进行简化