文章目錄
- Overview
- 1. CSRW 與 CSRR
- 2. SW 與 lw
- 3. XORI 與 ANDI
- 4. J 與 JR
- 5. ret 與 dret
- 6. 總結
- 🌐 Sources
Overview
在 RISCV 匯編中,不同類型的指令用于完成控制寄存器操作、內存存取、位操作、跳轉以及返回等功能。下面將逐對詳細介紹這些指令,并配合示例說明其用途和工作機制。
本文將 詳細介紹 RISCV 中的匯編指令 CSRW 和 CSRR 及 SW 和 lw 及 XORI 和 ANDI 及 J 與 JR 及 ret 與 dret,每一對都舉例介紹
1. CSRW 與 CSRR
功能說明
-
CSRW(CSR Write) :將通用寄存器中的值寫入指定的控制和狀態寄存器(CSR)。
-
CSRR(CSR Read) :從指定的 CSR 中讀取值到通用寄存器中。
這兩條指令用于管理 CPU 的特殊寄存器,常見于調試或權限管理中。例如,通過 CSRW 指令可以將當前調試相關的狀態存入 dscratch 寄存器,而 CSRR 可用于讀取 mhartid(硬件線程編號)來確定當前執行的 hart。
示例
csrw dscratch0, s0 # 將寄存器 s0 的值寫入調試專用寄存器 dscratch0csrr s1, mhartid # 從 mhartid 寄存器讀取當前 hart ID 到 s1
上述指令通常用于保存和獲取調試狀態以及硬件線程信息[2 ][1 ]。
2. SW 與 lw
功能說明
-
SW(Store Word) :將一個 32 位寄存器中的數據存入內存地址中。
-
LW(Load Word) :從指定內存地址加載一個 32 位數據到寄存器中。
這兩條指令實現內存與寄存器之間的數據傳輸,是程序數據存取的基本手段。
示例
sw s0, 396(zero) # 將 s0 中的值存入地址 (zero + 396),396 十進制約等于 0x18clw s1, 384(zero) # 從地址 (zero + 384,即 0x180) 加載數據到 s1
這種數據傳輸操作常用于保存計算結果或傳遞數據,例如在函數調用時保存現場或交換數據[3 ]。
3. XORI 與 ANDI
功能說明
-
XORI(XOR Immediate) :對寄存器中的數據與一個立即數進行按位異或操作,并將結果存回目標寄存器。
-
ANDI(AND Immediate) :對寄存器中的數據與一個立即數進行按位與操作,將結果存回目標寄存器。
這兩條指令用于進行位級運算,常用來修改、清零或提取數據的特定位。
示例
xori s1, s1, 1024 # 將 s1 與立即數 1024 (0x400) 異或,用于切換特定位andi s0, s0, 0 # 將 s0 與 0 做按位與運算,結果 s0 被清零
這種操作在條件判斷、位掩碼操作及狀態標志修改中十分常見[2 ][1 ]。
4. J 與 JR
功能說明
-
J(Jump) :無條件跳轉到一個指定的立即地址。RISCV 中 J 通常為偽指令,其本質為
jal x0, offset
,即跳轉而不保存返回地址。 -
JR(Jump Register) :跳轉到一個由寄存器指定的地址。它通常用來實現函數調用的返回或間接跳轉。
示例
j 0x184 # 無條件跳轉到當前 PC 加偏移 0x184 的地址jr ra, 0 # 使用寄存器 ra 的內容進行跳轉(通常 ret 的實現方式)
這里,J 指令常用于靜態的代碼跳轉,而 JR 則可實現動態跳轉,如函數調用返回(利用 jalr x0, ra, 0
實現 ret)。[4 ][5 ]。
5. ret 與 dret
功能說明
-
ret :傳統意義的返回指令,通常是
jalr x0, ra, 0
,用于從函數返回,跳轉到存放在 ra 寄存器中的返回地址。 -
dret :調試返回指令,用于從調試異常或調試模式中返回到正常執行狀態。dret 指令會恢復調試之前的狀態,使程序繼續運行。
示例
ret # 從函數中返回,等價于 jalr x0, ra, 0dret # 從調試模式中退出,恢復正常程序執行
在調試過程中,dret 用于退出 ebreak 斷點調試狀態,而 ret 則用于正常的函數調用返回。兩者的主要區別在于應用場景和上下文恢復機制[6 ][7 ]。
6. 總結
本文詳細介紹了 RISCV 匯編中幾組常用指令對及其使用場景:
-
CSRW/CSRR :用于寫入和讀取控制與狀態寄存器,支持調試和狀態管理。
-
SW/lw :實現內存與寄存器間數據傳輸,是數據存取的基礎。
-
XORI/ANDI :進行位運算操作,常用于狀態標志和掩碼處理。
-
J/JR :實現無條件和寄存器間接跳轉,支持靜態與動態跳轉。
-
ret/dret :分別用于函數返回與調試模式退出,幫助程序在不同執行環境中正確恢復狀態。
這些指令構成了 RISCV 匯編編程的基礎,理解它們的功能和使用場景對于開發高效、正確的底層軟件至關重要。通過具體的示例代碼,我們可以看到每條指令在實際代碼中的應用,以及它們如何協同完成程序流程控制和狀態管理[1 ][2 ][3 ][4 ][5 ][6 ][7 ][8 ].
🌐 Sources
-
blog.csdn.net - RISC-V基礎指令之lw和sw(包含使用說明及實例) 原創
-
blog.csdn.net - RISCV - 2 “Zicsr“, CSR Instructions 原創
-
ithelp.ithome.com.tw - DAY4: RISC-V: CSR指令用法 - iT 邦幫忙
-
www.cnblogs.com - 一起學RISC-V匯編第4講之指令格式
-
stackoverflow.com - Using GCC to produce readable assembly?
-
five-embeddev.com - RISC-V “V” Vector Extension / Privileged ISA - CSR Instructions
-
www.sunnychen.top - RISC-V基本指令集概述 - SunnyChen的小窩