计算机组成的一些总结(13)逻辑算术单元的实现

逻辑运算的实现

  与运算的实现

    and  rd , rs , rt  把32个与门并排连起来,将32位的输入分别连接到这32个与门上 ,这32个与门的输出组成了32位的数。在这条与运算的指令控制下,rs 所指定的寄存器内容会被传送到这个端口,rt 寄存器所指向的内容会被传送到另一个端口,经过这些与门之后,得到的运算结果,会被传送到 rd 所指定的寄存器当中,这样就完成了与运算。

  

  或运算的实现

    or  rd , rs , rt  需要32个或门

半加器(Half  Adder)

  功能是将两个一位二进制数相加,由一个异或门和一个与门组成,它由两个输入端口A和B,就是要相加的两个一位二进制数,两个输出端口,其中一个是S,相当于这两个一位二进制数相加对应产生的和,而C则是它们产生的进位,有进位就是1,没有进位就是0,半加器缺点是不能将第一位产生的进位作为输入参与运算。

全加器(Full Adder)   也是将两个一位二进制数相加

  全加器由两个半加器构成,全加器有三个输入,除了两个源操作数A和B,还有一个进位输入Cin,它的输出有两个,运算的结果S和进位输出Cout,这样三个输入总共有8种组合的情况。

“溢出”的检查方法

  “最高位的进位输入”不等于“最高位的进位输出”

  加法器的硬件实现,对于有符号数和无符号数的处理都是一样的。

MIPS对溢出的处理方式

  (1)将操作数看做有符号数,发生“溢出”时产生异常

      add  rd , rs , rt    #  R[rd]=R[rs]+R[rt]

      addi  rt , rs , imm     #  R[rt]=R[rs]+SignExtImm

  (2)将操作数看做无符号数,不处理“溢出”

      addu  rd , rs , rt    #  R[rd]=R[rs]+R[rt]

      addiu  rt , rs , imm    #  R[rt]=R[rs]+SignExtImm  

X86对溢出的处理方式

  溢出标志OF(Overflow Flag)  X86的运算指令,如果产生了溢出,并不会直接由控制电路检查到并进行处理,而是将加法器产生的溢出信号传送到了标志寄存器,若发生溢出,则会自动设置标志寄存器当中的OF=1,否则OF=0。

减法运算    (可转换为加法运算,计算机中用补码表示二进制数,补码表示的二进制数的相反数,转换规则,按位取反,末位加一,由来是假如有一个数X,按位取反,就是将X中的每一位由0变成1,由1变成0,那么得到了X按位取反以后的值,如果我们把这两个值相加,那么它们的和,显而易见,每一位都是1,而在补码表示中,全1的二进制数,就代表着-1,由这个运算得到 X+(~X)=-1 ,  即 (~X)+1=-X )

  A + (-B) = A + (~B+1)

      硬件实现的方式是在原来的加法器,原来的输入A和B都不变,我们增加了一个新的输入,只有1个比特,称为减法模式(sub-mode),它首先控制了一个二选一的多选器(2-to-1 Mux),如果这个信号为0,代表是执行加法操作,会将多选器的这一条通路选通,也就是直接将B传送到下面的全加器,这和加法运算是一样。而且我们还知道这个选择信号还连接到了最低位全加器的进位输入,但是因为它现在是0,所以仍然和刚才的加法操作是一样的,这时候就该执行一个加法的运算。 如果这个信号为1,代表要执行一个减法的运算,二选一的多选器会选择将B这个信号的输入每一位都接上一个非门,相当于按位取反,将按位取反的B送到每一个全加器与A相加,因为这个选择信号为1,所以最低位的全加器的进位输入也是1,这样就实现了对B进行按位取反,末位加一的操作,于是这个加法器也就变成减法器。

原文地址:https://www.cnblogs.com/dreamingoutloudly/p/13138298.html