计算机组成的一些总结(10)算术运算和逻辑运算
算术运算和逻辑运算
MIPS的运算指令是只能对寄存器进行操作
加法运算示例
CPU通过取指,就会把指令从内存中取出,并放到 IR寄存器,也就是存放指令编码的寄存器,指令译码电路看到这条指令的编码之后,根据 opcode 域为全0,知道了这是一条R型的指令,再根据 function 域的值,分析出这是一条 add 指令,因此控制电路会向 ALU(运算器)发出对应的控制信号,指明接下来要进行加法运算, 同时,指令译码部件分析出第一个源操作数 rs 所在寄存器,第二个源操作数 rt 所在寄存器,控制电路会选通对应的源操作数寄存器,将其内容传送到ALU的输入,同时指令译码部件还会分析出目的操作数 rd 所在寄存器,因此控制电路还会将ALU的输出,连通到目的操作数所在寄存器的输入,在这样的设定下,ALU会根据控制电路给出的信号,将两个输入的源操作数进行加法运算,并送出运算的结果。
算术运算指令(MIPS Core Instruction Set)
R型
add rd , rs , rt # R[rd]=R[rs]+R[rt] (add指令,在加法运算产生溢出时,会向控制器报告异常,由控制器进行处理)
addu rd , rs , rt # R[rd]=R[rs]+R[rt] (addu指令,在发生溢出时不会报出异常)
sub rd , rs , rt # R[rd]=R[rs]-R[rt]
subu rd , rs , rt # R[rd]=R[rs]-R[rt]
I型
addi rt , rs , imm # R[rt]=R[rs]+SignExtImm (将rs寄存器的内容,加上立即数的符号扩展,再存放到rt寄存器。 在加法运算产生溢出时,会向控制器报告异常,由控制器进行处理 。立即数扩展的方法:立即数是16位的,高16位是由这低16位当中的最高位,复制了16次,填充到高16位当中,也就是这32位当中的高16位,都和低16位当中的最高位,完全一样 ,这样的扩展方法称为符号扩展)
addiu rt , rs , imm # R[rt]=R[rs]+SignExtImm (在溢出时,不会产生异常)
逻辑运算指令(MIPS Core Instruction Set)
R型
and rd , rs ,rt # R[rd]=R[rs] & R[rt]
or rd , rs ,rt # R[rd]=R[rs] | R[rt]
nor rd , rs , rt # R[rd]=~( R[rs] | R[rt] ) (或非操作,先进行或,然后再取反)
I型
andi rt , rs , imm # R[rt]=R[rs] & ZeroExtImm (这16位立即数的扩展方式,不是采用符号扩展,而是采用0扩展)
ori rt , rs , imm # R[rt]=R[rs] | ZeroExtImm (0扩展操作,扩展后的高16位全都是0 )
因为算术运算指令会考虑将操作数看做是一个有符号的数,在运算时要考虑正数和负数的这个性质,而逻辑运算指令,是将操作数视为一组二进制的01串,因此采用0扩展,而不是符号扩展。