計算機組成的一些總結(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擴展,而不是符號擴展。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM