自己動手寫處理器之第一階段(3)——MIPS32指令集架構簡單介紹


將陸續上傳本人寫的新書《自己動手寫處理器》(尚未出版)。今天是第四篇。我盡量每周四篇

 

1.4 MIPS32指令集架構簡單介紹

      本書設計的處理器遵循MIPS32 Release 1架構,所以本節介紹的MIPS32指令集架構指的就是MIPS32 Release 1。

1.4.1 數據類型   

      指令的主要任務就是對操作數進行運算。操作數有不同的類型和長度,MIPS32提供的基本數據類型例如以下。

  •   位(b):長度是1bit。

  •   字節(Byte):長度是8bit。

  •   半字(Half Word):長度是16bit。

  •   字(Word):長度是32bit。
  •   雙字(Double Word):長度是64bit。

      此外,還有32位單精度浮點數、64位雙精度浮點數等。

1.4.2 寄存器

      在前文介紹RISC的特點時提到一點:大量使用寄存器。這是由於寄存器的存取能夠在一個時鍾周期內完畢,同一時候也簡化了尋址方式。MIPS32的指令中除載入/存儲指令外,都是使用寄存器或馬上數作為操作數的。

MIPS32中的寄存器分為兩類:通用寄存器(GPR:General Purpose Register)、特殊寄存器。

1、通用寄存器

      MIPS32架構定義了32個通用寄存器,使用$0、$1……$31表示,都是32位。

當中$0一般用做常量0。

      在硬件上沒有強制指定寄存器的使用規則,可是在實際使用中。這些寄存器的使用方法都遵循一系列約定,比如:寄存器$31一般存放子程序的返回地址。MIPS32中通用寄存器的約定使用方法如表1-1所看到的。

在本書大部分章節中,測試程序都是直接使用匯編指令編寫的,對寄存器的約定使用方法還不須要十分在意,可是本書的最后一章移植μC/OS-II時,由於涉及到C語言、匯編混合編程,對寄存器的約定使用方法就須要十分在意了。讀者屆時能夠體會到表1-1中各個寄存器約定使用方法的作用。

2、特殊寄存器

      MIPS32架構中定義的特殊寄存器有三個:PC(Program Counter程序計數器)、HI(乘除結果高位寄存器)、LO(乘除結果低位寄存器)。

進行乘法運算時,HI和LO保存乘法運算的結果,當中HI存儲高32位。LO存儲低32位;進行除法運算時,HI和LO保存除法運算的結果,當中HI存儲余數,LO存儲商。

1.4.3 字節次序

      數據在存儲器中是依照字節存放的。處理器也是依照字節訪問存儲器中的指令或數據,可是假設須要讀出一個字,也就是4個字節,比方讀出的是mem[n]、mem[n+1]、mem[n+2]、mem[n+3]這四個字節。那么終於交給處理器的有兩種結果。

  •  {mem[n],mem[n+1],mem[n+2],mem[n+3]}
  •  {mem[n+3],mem[n+2],mem[n+1],mem[n]}

      前者稱為大端模式(Big-Endian),也稱為MSB(Most Significant Byte),后者稱為小端模式(Little-Endian),也稱為LSB(Least Significant Byte)。在大端模式下,數據的高位保存在存儲器的低地址中。而數據的低位保存在存儲器的高地址中。圖1-4給出0x12345678在兩種模式下的存儲情況。本書實現的處理器採用的是大端模式(Big-Endian)。

1.4.4 指令格式

      MIPS32架構中的全部指令都是32位,也就是32個0、1編碼連在一起表示一條指令,有三種指令格式。如圖1-5所看到的。

當中op是指令碼、func是功能碼。

      (1)R類型:詳細操作由op、func結合指定,rs和rt是源寄存器的編號,rd是目的寄存器的編號。比方:如果目的寄存器是$3。那么相應的rd就是00011(此處是二進制)。MIPS32架構中有32個通用寄存器,使用5位編碼就能夠所有表示,所以rs、rt、rd的寬度都是5位。

sa僅僅有在移位指令中使用。用來指定移位位數。

      (2)I類型:詳細操作由op指定。指令的低16位是馬上數,運算時要將其擴展至32位。然后作為當中一個源操作數參與運算。

      (3)J類型:詳細操作由op指定,通常是跳轉指令,低26位是字地址,用於產生跳轉的目標地址。

1.4.5 指令集

      在“計算機的簡單使用模型”中已經介紹過,能夠直接使用0、1編碼進行程序設計,可是那樣顯然太不方便、easy出錯,於是人們使用一些助記符來表示各種指令。這就是匯編指令,使用匯編程序將匯編指令翻譯為計算機能夠識別的0、1編碼。

也就是將匯編指令翻譯為圖1-5所看到的的格式,這樣處理器就能夠識別了。

MIPS32架構中定義的指令能夠分為下面幾類。

注意:當中不包括浮點指令,由於本書實現的處理器不包括浮點處理單元。也就沒有實現浮點指令,所以此處不介紹浮點指令。

1、邏輯操作指令

      有8條指令:and、andi、or、ori、xor、xori、nor、lui,實現邏輯與、或、異或、或非等運算。本書設計的處理器實現了全部邏輯操作指令,將在第4、5章具體介紹各個邏輯操作指令的格式、作用、使用方法,及事實上現過程。

2、移位操作指令

      有6條指令:sll、sllv、sra、srav、srl、srlv。實現邏輯左移、右移、算術右移等運算。

本書設計的處理器實現了全部移位操作指令。將在第5章具體介紹各個移位操作指令的格式、作用、使用方法。及事實上現過程。

3、移動操作指令

      有6條指令:movn、movz、mfhi、mthi、mflo、mtlo。用於通用寄存器之間的數據移動,以及通用寄存器與HI、LO寄存器之間的數據移動。本書設計的處理器實現了全部移動操作指令,將在第6章具體介紹各個移動操作指令的格式、作用、使用方法,及事實上現過程。

4、算術操作指令

      有21條指令:add、addi、addiu、addu、sub、subu、clo、clz、slt、slti、sltiu、sltu、mul、mult、multu、madd、maddu、msub、msubu、div、divu,實現了加法、減法、比較、乘法、乘累加、除法等運算。本書設計的處理器實現了全部算術操作指令,將在第7章具體介紹各個算術操作指令的格式、作用、使用方法,及事實上現過程。

5、轉移指令

      有14條指令:jr 、jalr 、j 、jal、b、bal、beq、bgez、bgezal、bgtz、blez、bltz、bltzal、bne,當中既有無條件轉移。也有條件轉移,用於程序轉移到還有一個地方運行。

本書設計的處理器實現了全部轉移指令。將在第8章具體介紹各個轉移指令的格式、作用、使用方法。及事實上現過程。

6、載入存儲指令

      有14條指令:lb、lbu、lh、lhu、ll、lw、lwl、lwr、sb、sc、sh、sw、swl、swr,以“l”開始的都是載入指令,以“s”開始的都是存儲指令,這些指令用於從存儲器中讀取數據,或者向存儲器中保存數據。

本書設計的處理器實現了全部載入存儲指令,將在第9章具體介紹各個載入存儲指令的格式、作用、使用方法,及事實上現過程。

7、協處理器訪問指令

      有2條指令:mtc0、mfc0,用於讀取協處理器CP0中某個寄存器的值,或者將數據保存到協處理器CP0中的某個寄存器。本書設計的處理器實現了全部協處理器訪問指令,將在第10章具體介紹協處理器、協處理器訪問指令的格式、作用、使用方法,及事實上現過程。

8、異常相關指令

      有14條指令,當中有12條自陷指令。包含:teq、tge、tgeu、tlt、tltu、tne、teqi、tgei、tgeiu、tlti、tltiu、tnei。此外還有系統調用指令syscall、異常返回指令eret。本書設計的處理器實現了全部異常相關指令,將在第11章具體介紹異常相關指令的格式、作用、使用方法,及事實上現過程。

9、其余指令

      有4條指令:nop、ssnop、sync、pref,當中 nop是空指令。ssnop是一種特殊類型的空指令,sync指令用於保證載入、存儲操作的順序,pref指令用於緩存預取。本書設計的處理器對這4條指令進行了簡化並加以實現。將在第5章具體介紹簡化后的實現過程。

 

1.4.6 尋址方式

      MIPS32架構的尋址模式有寄存器尋址、馬上數尋址、寄存器相對尋址和PC相對尋址四種。當中寄存器相對尋址、PC相對尋址介紹例如以下。

      (1)寄存器相對尋址

      這樣的尋址模式主要是載入/存儲指令使用,其將一個16位的馬上數做符號擴展。然后與指定通用寄存器的值相加。從而得到有效地址,如圖1-6所看到的。

      (2)PC相對尋址

      這樣的尋址模式主要是轉移指令使用。在轉移指令中有一個16位的馬上數,將其左移兩位並作符號擴展,然后與程序計數寄存器PC的值相加,從而得到有效地址。如圖1-7所看到的。

1.4.7 協處理器CP0

      協處理器一詞通經常使用來表示處理器的一個可選部件。負責處理指令集的某個擴展,擁有與處理器相獨立的寄存器。MIPS32架構提供了最多4個協處理器,各自是CP0-CP3。

協處理器CP0用作系統控制,CP1、CP3用作浮點處理單元,而CP2被保留用於特定實現。除CP0外的協處理器都是可選的。

協處理器CP0的詳細作用有:配置CPU工作狀態、快速緩存控制、異常控制、存儲管理單元控制等。CP0通過配置內部的一系列寄存器來完畢上述工作。本書設計的處理器實現了CP0的部分功能。將在第10章詳述。

1.4.8 異常

      在處理器運行過程中,會從存儲器中依次取出指令,然后運行。可是有一些事件會打斷正常的程序運行流程,這些事件有中斷(Interrupt)、陷阱(Trap)、系統調用(System Call)等等,統稱為異常。異常發生后,處理器會轉移到一個事先定義好的地址,在那個地址有異常處理例程,在當中進行異常處理。這個地址稱為異常處理例程入口地址。異常處理完畢后,使用異常返回指令eret,返回到異常發生前的狀態繼續運行。本書設計的處理器實現了對硬件復位、中斷(包括軟中斷、硬中斷)、syscall系統調用、無效指令、溢出、自陷等6種異常的處理,將在第11章詳述。


免責聲明!

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



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