【RISCV 常見匯編指令學習 1.2 -- CSRW | CSRR | XORI | ANDI | DRET | J | JR】

文章目錄

  • 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

  1. blog.csdn.net - RISC-V基礎指令之lw和sw(包含使用說明及實例) 原創

  2. blog.csdn.net - RISCV - 2 “Zicsr“, CSR Instructions 原創

  3. ithelp.ithome.com.tw - DAY4: RISC-V: CSR指令用法 - iT 邦幫忙

  4. www.cnblogs.com - 一起學RISC-V匯編第4講之指令格式

  5. stackoverflow.com - Using GCC to produce readable assembly?

  6. five-embeddev.com - RISC-V “V” Vector Extension / Privileged ISA - CSR Instructions

  7. www.sunnychen.top - RISC-V基本指令集概述 - SunnyChen的小窩

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70483.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70483.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70483.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL六大日志的功能介紹。

前言 首先,MySQL的日志應該包括二進制日志(Binary Log)、錯誤日志(Error Log)、查詢日志(General Query Log)、慢查詢日志(Slow Query Log)、重做日志(Redo …

【AI】GitHub Copilot

GitHub Copilot 是一款由 GitHub 和 OpenAI 合作開發的 AI 編程助手,它可以在多種開發工具中使用。以下是 GitHub Copilot 支持的主要開發工具和平臺: 1. Visual Studio Code (VS Code) 官方支持:GitHub Copilot 在 VS Code 中擁有最完整的集…

拆解微軟CEO納德拉戰略藍圖:AI、量子計算、游戲革命如何改寫未來規則!

2025年2月19日 知名博主Dwarkesh Patel對話微軟CEO薩蒂亞納德拉 在最新訪談釋放重磅信號:AI將掀起工業革命級增長,量子計算突破引爆材料科學革命,游戲引擎進化為世界模擬器。 整個視頻梳理出幾大核心觀點,揭示科技巨頭的未來十年…

4.2 學習UVM中的“connect_phase“,將其應用到具體案例分為幾步?

文章目錄 前言1. connect_phase 的作用與執行順序2. TLM 連接的類型與示例2.1 生產者-消費者模型2.2 分析端口廣播模型 3. 層次化連接示例4. 動態連接與條件化配置5. 關鍵注意事項6. 完整示例:SoC 驗證環境連接6.1 Monitor 廣播數據6.2 Scoreboard 和 Coverage6.3 E…

HBase Shell

目錄 1. HBase常用命令1.1 create命令1.2 list命令1.3 describe命令1.4 put命令1.5 get命令1.6 scan命令1.7 count命令1.8 exists命令1.9 修改表結構1.10 delete命令1.11 deleteall命令1.12 truncate命令1.13 disable、drop命令1.14 status命令1.15 version命令 2. HBase Shell…

MATLAB基礎學習相關知識

MATLAB安裝參考:抖音-記錄美好生活 MATLAB基礎知識學習參考:【1小時Matlab速成教程-嗶哩嗶哩】 https://b23.tv/CnvHtO3 第1部分:變量定義和基本運算 生成矩陣: % 生成矩陣% 直接法% ,表示行 ;表示列 a [1,2,3;4,5,6;7,8,9];%…

用自定義注解實現Excel數據導入中的枚舉值校驗

使用自定義注解實現Excel數據導入中的枚舉值校驗 在實際開發中,我們經常需要從Excel文件中導入數據,并且這些數據需要符合一定的規則,比如某些字段的值必須是預定義的枚舉值。本文將介紹如何使用自定義注解來實現這一功能,以提高…

基于ffmpeg+openGL ES實現的視頻編輯工具-opengl相關邏輯(五)

在我們的項目中,OpenGL ES 扮演著至關重要的角色,其主要功能是獲取圖像數據,經過一系列修飾后將處理結果展示到屏幕上,以此實現各種豐富多樣的視覺效果。為了讓大家更好地理解后續知識,本文將詳細介紹 OpenGL 相關代碼。需要注意的是,當前方案將對 OpenGL 的所有操作都集…

dify安裝

官網教程 https://github.com/langgenius/dify/blob/main/README_CN.md 1、下載源碼 git clone https://github.com/langgenius/dify.git 2、進入docker目錄 cd dify cd docker cp .env.example .env修改nginx對外端口配置 修改為9000 最后執行:docker compo…

前端導出word文件,并包含導出Echarts圖表等

基礎導出模板 const html <html><head><style>body {font-family: Times New Roman;}h1 {text-align: center;}table {border-collapse: collapse;width: 100%;color: #1118FF;font-weight: 600;}th,td {border: 1px solid black;padding: 8px;text-align: …

【ETL】從理論到Python實踐的數據處理

引言 ETL&#xff08;Extract, Transform, Load&#xff09;是一種數據處理過程&#xff0c;用于將數據從一個或多個源提取出來&#xff0c;進行清洗、轉換和整合&#xff0c;然后加載到目標數據倉庫或數據庫中。ETL 是數據倉庫和數據分析領域中不可或缺的一部分&#xff0c;廣…

若依Flowable工作流版本監聽器使用方法

1.前言 本文詳細介紹如何在若依Flowable工作流版本&#xff08;RuoYi-Vue-Flowable&#xff09;中配置執行監聽器和任務監聽器。是以我二次開發的代碼為基礎&#xff0c;介紹如何配置監聽器&#xff0c;已解決源碼在新增或刪除監聽器出現的問題&#xff0c;如果需要二次開發的…

紛析云開源版- Vue2-增加字典存儲到localStorage

main.js //保存字典數據到LocalStorage Vue.prototype.$api.setting.SystemDictType.all().then(({data}) > {loadDictsToLocalStorage(data) })新增 dictionary.js 放在 Utils文件夾里面 // 獲取字典數據 export function getDictByType(dictType) {const dicts JSON.par…

jQuery UI CSS 框架 API

jQuery UI CSS 框架 API 概述 jQuery UI 是一個基于 jQuery 的用戶界面和交互庫,它提供了一套豐富的交互組件和視覺效果,旨在幫助開發者快速構建具有吸引力和互動性的網頁應用。jQuery UI CSS 框架 API 是 jQuery UI 的一部分,它允許開發者通過簡單的 CSS 類來控制 UI 組件…

VSCode自定義快捷鍵和添加自定義快捷鍵按鍵到狀態欄

VSCode自定義快捷鍵和添加自定義快捷鍵按鍵到狀態欄 &#x1f4c4;在VSCode中想實現快捷鍵方式執行某些指令操作&#xff0c;可以通過配置組合式的鍵盤按鍵映射來實現&#xff0c;另外一種方式就是將執行某些特定的指令嵌入在面板菜單上&#xff0c;在想要執行的時候&#xff0…

【C語言】指針(5)

前言&#xff1a;上篇文章的末尾我們使用了轉移表來解決代碼冗余的問題&#xff0c;那我們還有沒有什么辦法解決代碼冗余呢&#xff1f;有的這就是接下來要說的回調函數。 往期文章: 指針1 指針2 指針3 指針4 文章目錄 一&#xff0c;回調函數二&#xff0c;qsort實現快速排序1…

【python】網頁批量轉PDF

安裝wkhtmltopdf 網站&#xff1a;wkhtmltopdf wkhtmltopdf http://www.baidu.com/ D:website1.pdf 安裝pdfkit庫 pip install pdfkit 批量轉換代碼 import os import pdfkit path_wkthmltopdf rE:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe config pdfkit.configu…

游戲引擎學習第113天

倉庫:https://gitee.com/mrxiao_com/2d_game_2 黑板&#xff1a;優化的基本過程 在游戲編程中&#xff0c;優化是一個非常重要的學習內容&#xff0c;尤其是想要成為專業開發者時。優化的核心是理解代碼的執行速度&#xff0c;以及如何提升其性能。在這個階段&#xff0c;已經…

通義靈碼AI程序員

通義靈碼是阿里云與通義實驗室聯合打造的智能編碼輔助工具&#xff0c;基于通義大模型技術&#xff0c;為開發者提供多種編程輔助功能。它支持多種編程語言&#xff0c;包括 Java、Python、Go、TypeScript、JavaScript、C/C、PHP、C#、Ruby 等 200 多種編碼語言。 通義靈碼 AI…