计算机组成的一些总结(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扩展,而不是符号扩展。

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