- RISC-V體系結構編程與實踐(第2版)
- 笨叔
- 1153字
- 2024-09-23 17:56:01
3.2 RISC-V指令編碼格式
RISC-V每條指令的寬度為32位(不考慮壓縮擴展指令),包括RV32指令集以及RV64指令集。指令編碼格式大致可分成如下6類。
● R類型:寄存器與寄存器算術指令。
● I類型:寄存器與立即數算術指令或者加載指令。
● S類型:存儲指令。
● B類型:條件跳轉指令。
● U類型:長立即數操作指令。
● J類型:無條件跳轉指令。
RISC-V指令集編碼格式如圖3.1所示。

圖3.1 RISC-V指令集編碼格式
指令編碼可以分成如下幾個部分。
● opcode(操作碼)字段:位于指令編碼Bit[6:0],用于指令的分類。
● funct3和funct7(功能碼)字段:常常與opcode字段結合在一起使用,用來定義指令的操作功能。
● rd字段:表示目標寄存器的編號,位于指令編碼的Bit[11:7]。
● rs1字段:表示第一源操作寄存器的編號,位于指令編碼的Bit[19:15]。
● rs2字段:表示第二源操作寄存器的編號,位于指令編碼的Bit[24:20]。
● imm:表示立即數。RISC-V中使用的立即數大部分是符號擴展(sign-extended)的立即數。
RV64指令集支持64位寬的數據和地址尋址,為什么指令的編碼寬度卻只有32位[1]?
[1]RISC-V通常使用32位定長指令,不過為了減少代碼量,也支持16位的壓縮擴展指令。
因為RV64指令集是基于寄存器加載和存儲的體系結構設計,所以所有的數據加載、存儲以及處理都是在通用寄存器中完成的。RISC-V一共有32個通用寄存器(通用寄存器都是64位寬的,可以處理64位寬的數據),即x0~x31,其中,x0寄存器的編號為0,以此類推。因此,指令編碼使用5位寬(25 = 32),即索引32個通用寄存器。
對于精簡指令集來說,大部分運算指令最多采用3個寄存器來表示,例如加法指令add rd, rs1, rs2,那么在指令編碼中只需要15個位寬就可以索引3個通用寄存器,剩余的位寬可用于指令分類等。因此32位寬的指令編碼已經綽綽有余,使用32位寬指令編碼比使用64位寬指令編碼更有利于提高指令密度,減小代碼尺寸,從而提高指令高速緩存的命中率,提升程序執行效率。
加載和存儲指令通常采用12位立即數加上2個通用寄存器的方式來表示,下面以lw加載指令為例說明其指令編碼的布局,如圖3.2所示。

圖3.2 lw加載指令的編碼
● 第0~6位為opcode字段,用于指令的分類。
● 第7~11位為rd字段,用來描述目標寄存器rd的編號,可以從x0~x31通用寄存器中選擇。
● 第12~14位為功能碼字段,在加載指令中表示加載數據的位寬。
● 第15~19位為基地址rs1,可以從x0~x31通用寄存器中選擇。
● 第20~31位為offset字段,表示偏移量。
RV64指令集中常用的符號說明如下。
● rd:表示目標寄存器的編號,可以從x0~x31通用寄存器中選擇。
● rs1:表示源寄存器1的編號,可以從x0~x31通用寄存器中選擇。
● rs2:表示源寄存器2的編號,可以從x0~x31通用寄存器中選擇。
● ():通常用來表示尋址模式,例如,(a0)表示以a0寄存器的值為基地址進行尋址。這個前面還可以加offset,表示偏移量,可以是正數或負數。例如,8(a0)表示以a0寄存器的值為基地址,偏移8字節進行尋址。
● { }:表示可選項。
● imm:表示有符號立即數。
- 零基礎學Visual C++第3版
- Pandas Cookbook
- 少年輕松趣編程:用Scratch創作自己的小游戲
- Java程序員面試算法寶典
- Python機器學習實戰
- INSTANT OpenNMS Starter
- PySide GUI Application Development(Second Edition)
- Mastering Apache Maven 3
- Mastering JBoss Enterprise Application Platform 7
- Hands-On Full Stack Development with Go
- Learning AngularJS for .NET Developers
- Spring MVC+MyBatis開發從入門到項目實踐(超值版)
- Cocos2d-x Game Development Blueprints
- Python 3 數據分析與機器學習實戰
- C語言程序設計