计算机组成的一些总结(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进行按位取反,末位加一的操作,于是这个加法器也就变成减法器。