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

來源:互聯網
上載者:User

標籤:處理器   mips   開源   軟核   自己動手寫處理器   

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

 

1.4 MIPS32指令集架構簡介

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

1.4.1 資料類型   

      指令的主要任務就是對運算元進行運算,運算元有不同的類型和長度,MIPS32提供的基礎資料型別 (Elementary Data Type)如下。

  •   位(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編碼進行程式設計,但是那樣顯然太不方便、容易出錯,於是人們使用一些助記符來表示各種指令,這就是彙編指令,使用組譯工具將彙編指令翻譯為電腦可以識別的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章詳述。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.