標籤:處理器 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章詳述。