zoukankan      html  css  js  c++  java
  • 计算机组成的一些总结(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扩展,而不是符号扩展。

  • 相关阅读:
    SignalR的三个Demo
    SignalR的一点点东西
    如何在appconfig中配置服务的ip
    IP分片丢失重传
    以太网之物理层
    以太网数据格式与封装解封
    OSI七层模型与TCP/IP五层模型
    边沿检测方法-FPGA入门教程
    如何用ModelsimSE仿真IP核-以PLL为例
    搭建Modelsim SE仿真环境-使用do文件仿真
  • 原文地址:https://www.cnblogs.com/dreamingoutloudly/p/13089929.html
Copyright © 2011-2022 走看看