RISC-V 指令格式和6種基本整數指令


指令格式是指令使用二進制編碼表示的結構形式,一般一條指令分為操作碼和地址碼兩部分:

在這里插入圖片描述

一、操作碼

操作碼表示指令的屬性功能和執行的指令類型。操作數對應的二進制位數決定了計算機能夠實現的最大指令數目。例如,操作碼是 7 位的二進制碼,計算機能夠實現的最大指令數目是 128(2^7)。操作碼根據二進制位數是否具有可變性將其細分為固定長度和可變長度兩種。

  • 固定長度操作碼就是保持二進制位數不變,所有指令的操作碼長度都等於某一固定值,並且它們必須在一個字段中。它的優點主要有:規整的指令格式,簡化的底層硬件設計,非常短的指令譯碼時間,提高了計算機系統的整體性能。但是指令的編碼效率低,具有很大的信息的冗余度,使代碼的總長度大大增加,可擴展性差。RISC- V 采用的方案就是固定長度操作碼。

  • 可變長度操作碼,也被稱作擴展操作碼,它是對相關操作碼的擴展,可以對操作碼的二進制長度進行改變和重新設置,並且可同時存在於多個字段中。可變長度的操作碼通常會將特定的字段作為對應的操作碼,而剩余的指令部分,會使用擴展的方式對應到地址碼。

二、地址碼

地址碼的功能是不同於操作碼的,地址碼的主要功能是用來表明指令操作的對象,獲得被操作對象的地址、操作數的存儲地址以及寄存設備地址等。地址碼的結構比操作碼要更復雜的多,主要包括存儲源操作數的地址、存儲結果的目的操作數地址、以及將要跳轉鏈接的下一條指令的地址。下一條指令的地址一般都是隱式存在的,必須通過計算分析才能夠得到。根據一條指令中操作數地址數量,將地址碼划分成以下幾種類型。

1、零地址碼

零地址碼的指令,僅僅只有一個操作碼而沒有地址碼,其指令格式如下圖所示,op代表操作碼。零地址碼指令無須先設置對應的操作數,這有可能是事先已經設置好了操作數。例如空操作、停機等指令。

在這里插入圖片描述

2、一地址碼

一地址碼的指令,只有一個存儲操作數的地址,也是最終處理結果的保存地址, 它也被稱作單操作數指令。其指令格式如下圖所示,op 代表操作碼,rs1 代表操作數地址。例如自增運算,在處理完該地址的操作數之后,將最終處理結果存回原來的地址中。

在這里插入圖片描述

3、二地址碼

二地址碼的指令,也被稱作雙操作數指令,是當前階段計算機系統中應用最廣泛的。其指令格式如下圖所示,op 是操作碼,rs1 表示源操作數地址和最終處理結果的存儲目的地址,rs2 表示另外一個源操作數地址。

在這里插入圖片描述

4、三地址碼

三地址碼的指令,具有三個地址存放操作數。指令格式如下圖所示,op 代表操作碼,rs1 代表源操作數地址,rs2 代表另外一個源操作數地址,rd 代表目的操作數地址即存放處理結果的地址。

在這里插入圖片描述

三、RISC-V六種基本指令格式

RISC-V 指令格式是一個典型的三操作數,7 位操作碼的指令格式。RISC-V 指令集具有六種基本指令格式(R/I/S/B/U/J),如下圖所示:

在這里插入圖片描述

  • 其中 opcode 表示 7 位指令操作碼,其作用是區分不同的指令;
  • funct3 表示 3 位 的功能碼,funct7 表示 7 位的功能碼,它們可以輔助區分不同種類的指令;
  • rs1 和 rs2表示兩個 5 位的源寄存器;
  • rd 是 5 位的目的寄存器,指令運算的結果就存儲 rd 中;
  • imm 代表不同長度的立即數,可直接作為操作數使用。

6 種基本指令格式具體介紹如下:

1、R-typed

R-typed 指令是最常用的運算指令,具有三個寄存器地址,每個都用 5bit 的數表示。指令的操作由 7 位的 opcode、7 位的 funct7 以及 3 位的 funct3 共同決定的。R-typed 是不包含立即數的所有整數計算指令,一般表示寄存器-寄存器操作的指令。

2、I-typed

I-typed 具有兩個寄存器地址和一個立即數,其中一個是源寄存器 rs1,一個是目的寄存器 rd,指令的高 12 位是立即數。指令的操作僅由 7 位的 opcode 和 3 位的funct3兩者決定。值得注意的是,在執行運算時需要先把 12 位立即數擴展到 32 位之后再進行運算。I-typed 指令相當於將 R-typed 指令格式中的一個操作數改為立即數。一般表示短立即數和訪存 load 操作的指令。

3、S-typed

S-typed 的指令功能由 7 位 opcode 和 3 位 funct3 決定,指令中包含兩個源寄存器和指令的imm[31:25]和 imm[11:7]構成的一個12位的立即數,在執行指令運算時需要把12 位立即數擴展到 32 位,然后再進行運算,S-typed 一般表示訪存 store 操作指令,如存儲字(sw)、半字(sh)、字節(sb)等指令。

4、B-typed

B-typed 的指令操作由 7 位 opcode 和 3 位 funct3 決定,指令中具有兩個源寄存器和一個 12 位的立即數,該立即數構成是指令的第32位是 imm[12]、第7位是imm[11]、25 到 30 是 imm[10:5]、8 到 11 位是 imm[4:1],同樣的,在執行運算時需要把12 位立即數擴展到 32 位,然后再進行運算。B-typed 一般表示條件跳轉操作指令,如相等(beq)、不相等(bne)、大於等於(bge)以及小於(blt)等跳轉指令。

5、U-typed

U-typed 的指令操作僅由 7 位 opcode 決定,指令中包括一個目的寄存器 rd 和高20 位表示的 20 位立即數。U-typed 一般表示長立即數操作指令,例如 lui 指令,將立即數左移 12 位,並將低 12 位置零,結果寫回目的寄存器中。

6、J-typed

J-typed 的指令操作由 7 位 opcode 決定,與 U-typed 一樣只有一個目的寄存器 rd和一個 20 位的立即數,但是 20 位的立即數組成不同,即指令的 31 位是 imm[20]、 12 到 19 位是 imm[19:12]、20 位是 imm[11]、21 到 30 位是 imm[10:1],J-typed 一般表示無條件跳轉指令,如 jal 指令。

從基本指令格式可知,RISC-V 是具有高性能低功耗的更簡潔的指令集架構設計。

  • 首先,RISC-V 指令僅有以上 6 種基本指令格式,並且每個指令長度都是 32 位的,不像 X86-32 和 ARM-32 那樣具有很多指令格式,這大大縮短了指令的解碼時間。
  • 第二,RISC-V 指令格式具有三個寄存器地址,不像 X86 那樣使源操作數和目的操作數共享一個地址,它無須多使用一條 move 指令來完成存儲目的寄存器的值。
  • 第三,對於所有的 RISC-V 指令,其讀寫的寄存器標識符需要存放在同一位置,這使得指令在執行解碼操作前,就能提前訪問寄存器的值。
  • 第四,指令格式中的立即數總是符號擴展的,並且指令的最高位是符號位,因此可以在解碼前執行立即數的符號擴展操作。

這說明RISC-V 是優秀的、簡潔的指令集架構,因此,RISC-V 指令集架構將會不斷地發展,逐漸成為最主流的指令集架構。

四、6種基本整數指令集

RISC-V 基本整數指令集是每個專用指令集所必須具有的,其主要是為了保證基本的功能要求和所有的程序正常運行,以 32 位為例具體介紹如下:

1. 算數運算指令

RISC-V 的 32 位基礎整數指令集(RV32I)具有 7 條算數運算指令,分別是 ADDI、 SLTI、SLTIU、ADD、SUB、SLT 和 SLTU。它們的指令格式如下圖所示:
在這里插入圖片描述
算數運算指令使用兩種類型的指令格式,一種是寄存器-立即數操作的 I-typed 指令格式,一種是寄存器-寄存器操作的 R-typed 指令格式。對於算數運算指令的兩種指令格式,都具有目標寄存器 rd。R-typed 是 add、sub、slt 和 sltu,I-typed 是 addi、slti和 sltiu

  • addi的功能是將立即數和 rs1 相加並寫入 rd 中;
  • add是將 rs1 和 rs2 相 加並寫入 rd 中;
  • sub是 rs1 減去 rs2 並寫入 rd 中;
  • slt 和 sltu是有符號和無符號的比較指令,即 rs1 小於 rs2 則置 1,否者置 0;
  • slti 和 sltiu的功能是 rs1 小於立即數則置 1,否者置 0。
2. 移位指令

RV32I 具有 6 條移位指令,分別是 SLLI、SRLI、SRAI、SLL、SRL 和 SRA,其指令格式如下圖所示,其中 shamt 代表偏移量也就是移位量。
在這里插入圖片描述
移位指令也是使用 R-typed 和 I-typed 兩種指令格式,R-typed 的是 sll、srl 和 sra, I-typed 的是 slli、srli 和 srai

  • slli的功能是立即數邏輯左移,rs1 左移 shamt 位,空位填 0 並寫入 rd 中;
  • srli是立即數邏輯右移,rs1 右移 shamt 位,空位填 0 並寫入rd 中;
  • srai立即數算數右移,rs1 右移 shamt 位,空位填 rs1 的最高位並寫入 rd 中;
  • sll 是邏輯左移,rs1 左移 rs2 位,空位填 0 並寫入 rd 中;
  • srl是邏輯右移,rs1 右移 rs2位,空位填 0 並寫入 rd 中;
  • sra是算數右移,rs1 右移 rs2 位,空位填 rs1 的最高位並寫入 rd 中。
3. 邏輯操作指令

RV32I 具有 6 條邏輯操作指令,分別是 XORI、ORI、ANDI、XOR、OR 和 AND,其指令格式如下圖所示:
在這里插入圖片描述
邏輯操作指令也是使用 R-typed 和 I-typed 指令格式,R-typed 為 xor、or 和 and, I-typed 為 xori、ori 和 andi

  • xori是立即數異或,rs1 和立即數按位異或並寫入 rd中;
  • ori是 rs1 和立即數按位取或並寫入 rd 中;
  • andi是 rs1 和立即數位與並寫入 rd 中;
  • xor異或,rs1 和 rs2 按位異或並寫入 rd 中;
  • or是 rs1 和 rs2 按位取或並寫入 rd 中;
  • and是 rs1 和 rs2 位與並寫入 rd 中。
4. 加載和存儲指令

RV32I 具有 8 條加載和存儲指令,分別是 LB、LH、LW、LBU、LHU、SB、SH 和 SW,其指令格式如下圖所示:
在這里插入圖片描述
RV32I 是一個加載-存儲結構,只有加載-存儲類指令可以訪問存儲器,在寄存器
和存儲器之間進行數據傳輸。加載類指令使用的是 I-typed 指令格式,存儲類指令使
用的是 S-typed 指令格式

  • lb 是字節加載,讀取一個字節寫入 rd 中;
  • lh 是半字加載,讀取兩個字節寫入 rd 中;
  • lw 是字加載,讀取四個字節寫入 rd 中;
  • lbu 是無符號字節加載,讀取一個字節寫入 rd 中;
  • lhu 是無符號半字加載,讀取兩個字節寫入 rd中;
  • sb 是存字節,把 rs2 的低位一字節存入地址 rs1+立即數中;
  • sh 是存半字,把 rs2的低位兩字節存入地址 rs1+立即數中;
  • sw 是存字,把 rs2 的低位四字節存入地址 rs1+立即數中。
5. 控制轉移指令

RV32I 具有 8 條控制轉移指令,分別是 BEQ、BNE、BLT、BGE、BLTU、BGEU、 JAL 和 JALR,其指令格式如下圖所示:
在這里插入圖片描述
控制轉移指令分為條件分支跳轉和無條件跳轉鏈接兩類指令,條件分支跳轉使用
的是 B-typed 格式,無條件跳轉中 jalr 和 jal 使用的分別是 I-typed 格式和 J-typed 格

  • beq 是相等條件分支,rs1 和 rs2 的值相等時,把 pc 的值設置成當前值+偏移值;
  • bne 是不等條件分支,rs1 和 rs2 的值不等時,把 pc 的值設置成當前值+偏移值;
  • blt 是小於條件分支,rs1 小於 rs2 的值時,把 pc 的值設置成當前值+偏移值;
  • bge是大於等於條件分支,rs1 大於等於 rs2 的值時,把 pc 的值設置成當前值+偏移值;
  • bltu 是無符號小於條件分支;
  • bgeu 是無符號大於等於條件分支;
  • jal 是跳轉並鏈接,把 pc 設置成當前值+偏移值,然后將 pc+4 當做下一條指令的地址存入 rd 中;
  • jalr 跳轉並鏈接,把 pc 設置成 rs1+偏移值,然后將 pc+4 寫入 rd 中。
6. CSR 操作指令

RV32I 具有 6 條 CSR 操作指令,分別是 CSRRW、CSRRWI、CSRRS、CSRRSI、 CSRRC 和 CSRRCI。CSR 操作指令的指令格式如下圖所示,其中 csr 表示 CSR 寄存器的地址,zimm 表示零擴展立即數。
在這里插入圖片描述
CSR 操作指令都是使用 I-typed 指令格式

  • csrrw 是讀后寫控制狀態寄存器,先將 csr 的值記為 t,把 rs1 的值寫入 csr,再將 t 寫入 rd 中;
  • csrrwi 是立即數讀后寫控制狀態寄存器,將 csr 的值寫入 rd 中,再將立即數寫入 csr 中;
  • csrrs 是讀后置位控制狀態寄存器,先將 csr 的值記為 t,讓 t 和 rs1 取或並寫入 csr,再將 t 寫入 rd 中;
  • csrrsi 是立即數讀后置位控制狀態寄存器,先將 csr 的值記為 t,把 t 和立即數 zimm 取或並寫入 csr,再將 t 寫入 rd 中;
  • csrrc 是讀后清除控制狀態寄存器,先將 csr 的值記 為 t,把 t 和 rs1 位與並寫入 csr,再將 t 寫入 rd 中;
  • csrrci 是立即數讀后清除控制狀態寄存器,csr 的值記為 t,把 t 和立即數 zimm 位與並寫入 csr,再將 t 寫入 rd 中。


免責聲明!

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



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