RISC-V 常見指令


算術運算

add rd, rs1, rs2

x[rd] = x[rs1] + x[rs2]

把寄存器 x[rs2]加到寄存器 x[rs1]上,結果寫入 x[rd]。忽略算術溢出。

 

addi rd, rs1, immediate

x[rd] = x[rs1] + sext(immediate)

把符號位擴展的立即數加到寄存器 x[rs1]上,結果寫入 x[rd]。忽略算術溢出。

 

sub rd, rs1, rs2

x[rd] = x[rs1] − x[rs2]

x[rs1]減去 x[rs2],結果寫入 x[rd]。忽略算術溢出。

 

div rd, rs1, rs2

x[rd] = x[rs1] ÷s x[rs2]

用寄存器 x[rs1]的值除以寄存器 x[rs2]的值,向零舍入,將這些數視為二進制補碼,把商寫 入 x[rd]。

 

mul rd, rs1, rs2

x[rd] = x[rs1] × x[rs2]

把寄存器 x[rs2]乘到寄存器 x[rs1]上,乘積寫入 x[rd]。忽略算術溢出。

 

rem rd, rs1, rs2

x[rd] = x[rs1] %𝑠 x[rs2]

求余數。x[rs1]除以 x[rs2],向 0 舍入,都視為 2 的補碼,余數寫入 x[rd]。

 

neg rd, rs2

x[rd] = −x[rs2]

把寄存器 x[rs2]的二進制補碼寫入 x[rd]。

 

邏輯運算

and rd, rs1, rs2

x[rd] = x[rs1] & x[rs2]

將寄存器 x[rs1]和寄存器 x[rs2]位與的結果寫入 x[rd]。

 

andi  rd, rs1, immediate

x[rd] = x[rs1] & sext(immediate)

把符號位擴展的立即數和寄存器 x[rs1]上的值進行位與,結果寫入 x[rd]。

 

or rd, rs1, rs2

x[rd] = ~x[rs1]

把寄存器 x[rs1]和寄存器 x[rs2]按位取或,結果寫入 x[rd]。

 

xor rd, rs1, immediate

x[rd] = x[rs1] ^ sext(immediate)

x[rs1]和有符號擴展的 immediate 按位異或,結果寫入 x[rd]。

 

位運算

sll rd, rs1, rs2

x[rd] = x[rs1] ≪ x[rs2]

邏輯左移(空位補0)

 

slli rd, rs1, shamt

立即數邏輯左移

 

srl rd, rs1, rs2

x[rd] = (x[rs1] ≫𝑢 x[rs2])

邏輯右移(空位補0)

 

srli rd, rs1, shamt

立即數邏輯右移

 

sra rd, rs1, rs2

x[rd] = (x[rs1] ≫𝑠 x[rs2])

算術右移(空位用最高位填充)

 

srai rd, rs1, shamt

立即數邏輯右移

 

not td, rs1

x[rd] = ~x[rs1]

把寄存器 x[rs1]對於 1 的補碼(即按位取反的值)寫入 x[rd]。實際被擴展為 xori rd, rs1, -1。

 

條件控制指令

beq rs1, rs2, offset

if (rs1 == rs2) pc += sext(offset)

若寄存器 x[rs1]和寄存器 x[rs2]的值相等,把 pc 的值設為當前值加上符號位擴展的偏移 offset。

 

bge rs1, rs2, offset

if (rs1 ≥s rs2) pc += sext(offset)

若寄存器 x[rs1]的值大於等於寄存器 x[rs2]的值(均視為二進制補碼),把 pc 的值設為當前 值加上符號位擴展的偏移 offset。

 

blt rs1, rs2, offset

if (rs1 <s rs2) pc += sext(offset)

若寄存器 x[rs1]的值小於寄存器 x[rs2]的值(均視為二進制補碼),把 pc 的值設為當前值加 上符號位擴展的偏移 offset。

 

bne rs1, rs2, offset

if (rs1 ≠ rs2) pc += sext(offset)

若寄存器 x[rs1]和寄存器 x[rs2]的值不相等,把 pc 的值設為當前值加上符號位擴展的偏移 offset。

 

跳轉指令

j offset

pc += sext(offset)

把 pc 設置為當前值加上符號位擴展的 offset,等同於 jal x0, offset。

 

jal rd, offset

x[rd] = pc+4; pc += sext(offset)

把下一條指令的地址 (pc+4),然后把 pc 設置為當前值加上符號位擴展的offset。rd 默認為 x1。 

 

jr rs1

pc = x[rs1]

把 pc 設置為 x[rs1],等同於 jalr x0, 0(rs1)。

 

jalr rd, offset(rs1)

t = pc+4; pc =(x[rs1]+sext(offset))&~1; x[rd]= t

把 pc 設置為 x[rs1] + sign-extend(offset),把計算出的地址的最低有效位設為 0,並將原 pc+4 的值寫入 f[rd]。rd 默認為 x1。

 

ret 

pc = x[1]

從子過程返回。實際被擴展為 jalr x0, 0(x1)。

 

加載與存儲指令

la rd, symbol

x[rd] = &symbol

將 symbol 的地址加載到 x[rd]中。

 

li rd, immediate

x[rd] = immediate

將常量加載到 x[rd]中。

 

lw rd, offset(rs1)

x[rd] = sext(M[x[rs1] + sext(offset)][31:0])

從地址 x[rs1] + sign-extend(offset)讀取四個字節,寫入 x[rd]。

 

sw rs2, offset(rs1)

M[x[rs1] + sext(offset) = x[rs2][31: 0]

將 x[rs2]的低位 4 個字節存入內存地址 x[rs1]+sign-extend(offset)。

 

參考:

RISC-V 手冊(翻譯版) http://crva.io/documents/RISC-V-Reader-Chinese-v2p1.pdf


免責聲明!

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



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