將陸續上傳本人寫的新書《自己動手寫處理器》(尚未出版)。今天是第四篇。我盡量每周四篇
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章詳述。