[音乐] 下面我们来看一下n位整数加减运算器是如何实现的。 在介绍这个之前我们先来看一个程序段。 在这个程序段里面,有一个xyz1z2 这四个变量的一个申明,这四个变量都是int型的。 然后有两个赋值语句,一个是做x+y 赋给z1,一个是x-y赋给z2。 那么对于这个程序段来说这个x和y在 机器里面是怎么表示的,也就是x和y的机器数应该是什么? 然后执行了这两个赋值语句以后 z1z2的机器数应该是什么?这个很显然,因为这四个变量都是int型的。 我们知道int型呢就是带符号整数,带符号整数在机器里面我们说使用补码表示的。 所以x的机器数是x的补,y的机器数那就是y的补,z1 是等于x+y的,所以z1的机器数就等于x+y的补码。 z2是x-y的补码,这里面就有一个问题 要能够实现这样一个程序段,实际上 需要机器的硬件能够实现 已知x补y补,求x+ y补和x-y补的这样的一个功能。 实际上也就是说计算机里面需要有一个电路能够实现 xy的补码的表示已经知道的情况下, 要求x+y的补码和x-y的补码。 因为我们最后得到的z1和z2 实际上是一个补码表示,很显然这个补码是和的补码和差的补码。 那么这个到底怎么计算呢,我们在上一周讲过补码定义的公式, 一个真值x它的补码应该是等于 模加上x本身,这个模就是2的n次方,如果有n位的补码的话。 显然这个地方,int型呢是32位机器上。 那它是32位,这样的模当然就是2的32次方。 根据刚才讲的补码公式x+y 应该是等于一个模加上x+y。 那么x+y的补码展开以后根据上面的公式是这样的。 在这样的等式当中实际上是在模2n, 这样的一个前提条件下,也就是当2n是模的时候。 实际上我们加上这个模数,应该等于它本身,所谓模就是 除以这个模以后得到的余数是补码。 加上一个模,在这个模运算系统下面 就相当于不加,因为你这个高位总是会丢掉的,加不加是一样的。 因此这个值应该是等于后面这个值,在模2n的 前提条件下,然后这个展开来就是x的补加上y的补。 那么x-y的补码我们根据公式也是这个模 加上x-y,同样的,我们加上一个模和原来的这个数应该是相等的。 因为加上这个模,在模运算系统里面相当于高位是丢弃的,根据这个公式 在用补码的定义写的话,前面这个实际上是等于x补后面这个等于-y的补。 因此x-y的补码可以用x的补码 加上-y的补码来运算,这些都是在 模运算系统的前提下。 这个里面要计算x+y和x-y的 补码最主要的一个问题是要算-y的补码,因为x的补y的补我们都已经知道了。 而-y的补码我们根据前面讲的已知一个数的补码 求这个数负数的补码的时候是等于各位取反,末位加1. 所以我们可以用这个公式来得到,因此我们得到这样一个补码运算公式 在这个里面我们关键要求这个负数的补码,而负数的补码我们可以用 各位取反,末位加1来实现,因此我们在这个电路里面 可以用一个多路选择器,这是二选一的,二路选择器 可以把这个加数,也就是B可以让它选择是源码输出。 或者选择是各位取反输出。 然后另外一个加法器是我们前面讲到的带标志 的这种加法器,这个加法器它一个输入端 就是这边的这个加数A,A 加上B可以实现A+B的补码。 还有一个就是A加上负B的补码,而-B的补码我们可以是各位取反, 末尾加一,也就是说我们可以让这个sub等于 1的时候就做减法,让sub 等于1的时候做减法,做的就是A 加上B的反 再加上末尾的1 就相当于是A加-B的补码,当sub等于1的时候 很显然二路选择器选择的是这一路 输出,所以B'这个地方 输出的是B反然后再加上这个1。 这个加出来的就是-B的补码和A的 补码相加得到的是A-B,这样的结果就是A-B。 所以这个运算电路实际上 可以实现A+B的补码。 也可以实现A-B的补码。 做A+B还是A-B实际上取决于这个sub 这个输入端,由sub来控制的。 因此在这个运算电路当中我们通过加 标志的这个加法器和一个多路选择器再加上一个反向器 就是非门这个反向器就构造 了一个整数的加减运算器,在这里面可以做 加法也可以做减法。 刚才我们讲的是补码也就是带符号整数的加和减, 实际上无符号整数的加和减也是一样的,也可以在这个电路里面 实现,因为无符号整数就相当于符号为正的 带符号整数,就相当于带符号整数当中的正数就是无符号的整数。 因此带符号正数肯定也是能够在这里面运行的,这四种运算都可以用这个 电路来实现,因此我们称它是整数的加减运算部件。 然后在这个运算部件之上 再加上寄存器、 移位器还有控制逻辑 那就可以实现算术逻辑部件,就是ALU。 也可以实现乘法器除法器,可以实现乘除运算 以及浮点运算,所以所有的这些基本的算数运算 都是建立在这个整数加减运算部件之上的。 那么,这个ALU实际上就是能够实现 基本的算数运算和逻辑运算的部件,我们叫算数逻辑部件。 在这个里面它可以实现无符号整数的加减运算, 因为ALU里面核心部件就是我们刚刚讲的整数的加减运算部件。 当然可以实现无符号数的加和减还有带符号数的加和减。 然后在ALU里面我们再加上一些 与门或门非门异或门等等就可以实现一些逻辑运算。 因此这个ALU就可以实现基本的加减运算和 与或非异或等等的逻辑运算。 这里面的核心电路就是前面讲的带标志的加法器。 再加上一些多路选择器和取反器就可以实现 整数的加减运算,输出呢除了这个 和差以外还有标志信息。 另外如果是做与或非等等的逻辑运算 的话那么result的这个结果就是逻辑运算的结果。 那么在这个里面因为它可以对A和B 做加减或者与或非等的运算因此这个ALU输出的这个result 到底是加的结果减的结果还是与的结果或的 结果等等呢,它是由一个控制端来控制的。 这个控制端叫ALUop,就是控制这个ALU做什么操作的。 这个位数实际上是由ALU里面能够完成的这个操作个数决定的。 比如说ALU里面能够做8种操作的话 那这个地方呢k就是三位, 至少要三位,比如说这个8种操作分别是加减与或 取反异或以及直接传送和还有一些保留的没有用的。 这8种操作我们可以对这个ALUOP进行编码对这个K,这样的K应该等于3, 一共是8种操作,那么就是2的3次方等于8,所以ALUop等于3位。 那000就说明对A和B做加法, 也就是说这个3位是000的话,对AB 做加法,这个result呢就是和。 如果是001 我们规定001呢这个地方输入001的时候是对A 和B做减法,这个地方result呢就是差,当然与或 取反等等都是一样的,也就是说我们可以设计一个ALU 这个ALU可以有控制端,这个控制端决定 输入A和B做什么操作,输出的就是 这个操作的结果,同时会产生一些条件码。 还有向高位的进位,那么这个就是ALU的符号。 ALU实际上在我们前面讲过这个就是 其中的这个ALU这个部件可以用来对操作数 一个操作数或者是两个操作数做某种运算,所以这个控制器 这边会产生ALUop刚才我们看到的那个 操作控制端来控制这边的 送过来的两个操作数到底做什么运算, 运算的结果这个result再送出来。 输出结果可以再继续存到寄存器里面或者写到 存储器里面,这个就是ALU。 [音乐] [音乐]