如果你研究现代微处理器,你可能会注意到它们和旧的机械计算设备之间的相似之处更具体地说,微处理器中的算术逻辑单元与旧的机械计算器有许多相似之处ALU可以看作是微处理器的计算器它读取存储在寄存器中的数字,执行加,减或移位操作,并将结果存储回另一个寄存器
微处理器内部的算术逻辑单元执行算术运算这些寄存器被命名为r1,r2和r3
这些基本操作与计算器执行的操作完全相同。它有三个寄存器来保存计算过程中使用的数字:
输入寄存器:一个5位寄存器,你可以拉控制杆来定义输入的数字。
累加器寄存器:一个13位寄存器,用于存储多次计算的结果。
计数寄存器:一个8位数的寄存器,用来记录你做了多少次加法运算。
欧登纳计算器,1873年在俄罗斯发明。
这里不详细解释微处理器ALU或者老式机械计算器我们将进一步追溯到算盘这种不同形式的手动计算机早在罗马时代之前就存在了
为什么想了解珠算及其运算因为了解珠算可以让你看到更深层次的东西,把几千年前处理数字的方法和现代微处理器的方法联系起来现代微处理器非常复杂,当你试图理解它们时,你很容易误入歧途
算盘就像微处理器的ALU现代计算机基于二进制数字系统,其中每个数字称为一位下图所示的算盘最多可以处理四个十进制数算盘上的每一列代表一个数字
典型算盘的插图每一列代表十进制系统中的一个数字
从右数第一列是一位,第二列是第十分之一位,第三列是一百位,依此类推这意味着,如果我想在算盘上代表数字4023,那么我会按上图所示排列珠子利用这种布置,可以容易地执行加法和减法如果我要加12,只需要在单个位置多拉两个珠子,在第十个位置多拉一个珠子
加法和减法都很简单,我们来看看如何在算盘上做乘法乘法的方式与旧的机械计算器和早期的微处理器非常相似他们只有ALU,没有专门的乘法硬件
用算盘相乘
我们来做一个简单的乘法:32 × 4,结果应该是128为此,我们为每一列指定一个特定的含义前两列被转换为计数器寄存器,而第三列被定义为输入寄存器最后,我们让最后两列作为累加寄存器,它将保存最终结果
乘法可以被认为是执行多个加法运算在这个例子中,我们将4 ^ 32次相加
乘以列数
先把累加器加四次单行中的四颗珠子向下移动为了记录我们添加的四个珠子的数量,我们从计数器中移走一个珠子实际上,我们从32倒数到0
我们在累加器上加4,计数器减少到30此时,累加器的值为8我们得再加30个,4个
乘以十列
在单位柱上移动四个珠子超过30次可能会很繁琐幸运的是,我们不必这样做相反,我们执行移位操作来加速加法我们把每个移动的珠子数十乘以四这是怎么做到的每当我们移动计数器第十个数字上的一个珠子,我们就移动累加器第十个数字上的四个珠子执行此操作一次,计数器从30减少到20,累加器增加到48
我们再次重复相同的操作,从而将计数器从20减少到10,并向累加器再加40,其值现在是88。
注意,在上图中,我们不能再向下移动4颗珠子,因为累加器的十列只剩下2颗珠子了我们需要使用第三列,并使用一个累加器来表示数百位我们把第十位的十颗珠子换成第一百位的一颗珠子
另外,十个人一共需要12颗珠子,我们用它来换一百个人一颗珠子,十个人两颗珠子此时,我们已经花光了计数器上的所有珠子,我们可以看到最终结果是128
移位操作
乘除法不能直接用算盘,机械计算器或ALU来做可是,我们可以很容易地乘以10的倍数将输入的数字乘以10,100或1000很容易你所要做的就是移动1,2或3列的珠子做2 × 4需要连续移动4颗珠子两次如果要表演20 × 4,把十排的四颗珠子移动两次如果是200 × 4,就是在百行中移动8颗珠子你所做的实际上是加法和移位的结合
如果你看一下机械计算器,你会看到累加寄存器位于一个滑块上向左滑动一格,从输入寄存器添加的数字将是原来的十倍向左滑动两个凹槽,输入的数字会变成原来数字的100倍我们也可以向右滑动,使添加的数字变小一个有趣的效果是滑杆产生移位,也会影响计数寄存器假设您指定输入寄存器为42接下来,将控制杆向左滑动两个凹槽当您转动手柄将输入添加到累加器时,您将添加4200计数器寄存器上将显示100因此,它看起来就像你拧了一百次把手换句话说,移位可以让我们大幅减少加法运算的次数
这些移位操作和我们在算盘上实现的没什么区别关键区别在于,您需要通过手动移动珠子来更新累加器和计数器
移位操作在微处理器中的应用
移位操作帮助我们在微处理器ALU上加速乘法和除法运算因为现代微处理器使用二进制数字系统,所以移位操作使用的是2的倍数的多个输入因此,我们不是将输入乘以10,100,1000或10000,而是将输入乘以2,4,8,16,32等等
编程初期,这些知识其实很有用20世纪90年代初,个人电脑的普及非常缓慢我们必须使用乘法来计算图形存储器中特定x,y坐标处的像素位置因为屏幕分辨率是320 × 240,所以你得把Y坐标乘以320再加上X坐标,才能得到屏幕内存中的位置
重点是,我要把任意数y乘以320无数次这非常慢解决方法是将计算改为移位和加法的组合
用两次移位运算和一次加法运算代替乘法运算可以显著提高运算速度。
。