【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.mzph.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…