RISC-V汇编学习(一)—— 基础认识
最近这三年的工作时间大部分的工作,都是基于riscv的cpu和接口ip开发适配驱动,时不时的就要debug测试代码,面对很多都是汇编,所以也是整理下积累的一点点笔记,系列博客将总结下riscv相关的内容,一是给有需要的人一点点帮助,另外给自己梳理下方便日后查阅。
虽然现在大部分的程序都不在使用汇编,但是在一些特殊场景下:底层驱动、引导程序、高性能算法库等等,汇编还是扮演着重要作用。对于嵌入式驱动开发,虽然可能不要求熟练的coding汇编,但是至少做到能够看懂理解和编写一些简单的汇编程序。
先从汇编最基础的概念以及相关的知识开始简单了解,后续慢慢会继续更新完善。
1 riscv简介
1.1 ISA
ISA (Instruction Set Architecture) 指令集架构,可以说是CPU的灵魂,是软硬件之间的桥梁;定义了指令集(指令类型和编码、寻址方式)、数据类型、存储模型、系统模型(中断、异常、特权等级等)、软件可见的处理器状态(通用寄存器、PC、处理器状态等)。
1.2 CISC和RISC
指令集架构主要分为:
- 复杂指令集(Complex Instruction Set Computer)
- 精简指令集( Reduced Instruction Set Computer, RISC )
CISC与RISC的区别如下:
VS | 复杂指令集(CISC) | 精简指令集(RISC) |
---|---|---|
指令数量 | 多 | 少 |
指令系统复杂度 | 复杂 | 简单 |
指令长度 | 变长,不固定 | 等长,固定 |
寻址方式 | 多 | 少 |
指令格式 | 多 | 少且规整 |
各指令使用频率 | 相差很大 | 相差不大 |
指令执行时间 | 相差很大 | 相差不大 |
指令周期 | 多周期为主 | 单周期为主(流水线技术,大部分指令在一个机器周期完成) |
cpu寄存器数量 | 少 | 多(增加寄存器,以减少访存) |
指令并行性 | 低 | 高 |
可访存指令 | 不加限制 | 只有load/store等访存指令才能访问内存(减少了访存周期) |
优化编译实现 | 很难 | 较容易(依靠编译程序的优化来更有效的支持高级语言) |
代表架构 | x86 | ARM,MIPS,PowerPC,LoongArch,RISC-V等 |
目前主流的CISC就是x86,而RISC的代表则是ARM。
这里介绍的RISC-V是第5代精简指令集,也时属于RISC阵营一员,RISC-V架构主要由美国加州大学伯克利分校(简称伯克利)的Krste Asanovic 教授、Andrew Waterman 和Yunsup Lee等开发人员于2010年发明,并且得到了计算机体系结构领域的泰斗David Patterson 的大力支持。
另外,RISC-V(英文读作“ risk-five"),是一种全新的指令集架构。“V”包含两层意思, 一是这是Berkeley 从RISC I开始设计的第五代指令集架构: 二是它代表了变化( Variation )和向量( Vectors ) 。
关于RISC-V更多的介绍以及其他ISA的介绍,感兴趣自行搜索学习了解。
这里有一点主观观点要说一下——未来RISC-V一定会越来越好(可以学习了来评论区讨论下,就不具体展开啦)。
1.3 march
1.3.1 RISC-V指令架构有以下特点:
- 完全开放
- 指令简单
- 模块化设计,易于扩展
RISC-V 的指令集使用模块化的方式进行组织,每一个模块使用一个英文字母来表示。正是由于RISC-V模块化特点,RISC-V架构也有一套命名标准来描述当前CPU所支持指令集;比如:RV32I、RV64G、RV32IMA这样。
1.3.2通用的命名格式
如下:
RV[n][I/F/D/Q/M/C/A/B/E/H/K/V/P/J/T/N]
其中:
- RV代表这是RISC-V指令集
- n代表当前指令集是几位的,32位还是64位
- 后面的是指令集模块,模块含义如下表格
module name | class | description |
---|---|---|
RV32I | 基础指令 | 整数指令:包含算法、分支、逻辑、访存指令,有32个32位寄存器。能寻址32位地址空间 |
RV64I | 基础指令 | 整数指令:包含算法、分支、逻辑、访存指令,有32个64位寄存器。能寻址64位地址空间 |
RV128I | 基础指令 | 整数指令:包含算法、分支、逻辑、访存指令,有32个128位寄存器。能寻址128位地址空间 |
RV32E | 基础指令 | 与RV32I一样,只不过只使用前16个(0~15)32位寄存器 |
M | 扩展指令 | 包含乘法、除法、取模求余指令 |
F | 扩展指令 | 单精度浮点指令 |
D | 扩展指令 | 双精度浮点指令 |
Q | 扩展指令 | 四倍精度浮点指令 |
A | 扩展指令 | 原子操作指令:比如比较并交换,读改写等指令 |
C | 扩展指令 | 压缩指令:单指令长度为16位,主要用于改善程序大小 |
P | 扩展指令 | 单指令多数据(Packed-SIMD)指令 |
B | 扩展指令 | 位操作指令 |
K | 扩展指令 | 密码运算扩展指令集(Key) |
V | 扩展指令 | 可伸缩矢量扩展指令集(Vector) |
T | 扩展指令 | 事务内存指令集(Transactional Memory) |
H | 扩展指令 | 支持(Hypervisor)管理指令 |
J | 扩展指令 | 支持动态翻译语言指令 |
L | 扩展指令 | 十进制浮点指令 |
N | 扩展指令 | 用户中断指令 |
G | 通用指令 | 包含I、M、A、F、D 指令 |
以上模块的一个特定组合“ IMAFD ”,也被称为“通用”组合,用英文字母G 表示。因此RV32G 表示RV32IMAFD ,同理RV64G 表示RV64IMAFD 。通过以上的模块化指令集,能够选择不同的组合来满足不同的应用。例如,追求小面积、低功耗的嵌入式场景可以选择使用RV32EC 架构;而大型的64 位架构则可以选择RV64G
2 RISC-V寄存器
在RISC-V 架构中,寄存器组主要包括通用寄存器(General Purpose Registers )和控制状态寄存器( Control and Status Register, CSR)。
2.1 通用寄存器组
RISC-V架构通用寄存器设计规范包括:
- 基础整数指令集寄存器配置
-
a、标准配置(I扩展集):
RISC-V基础指令集架构默认配置32个整数寄存器组,编号为x0至x31。其中x0寄存器具有硬连线常数0特性(写入操作无效,读取始终返回0值),其余31个寄存器(x1-x31)为全功能通用寄存器。 -
b、寄存器位宽定义:
架构通过XLEN参数声明寄存器物理位宽:
RV32I架构:XLEN=32,寄存器采用32位存储单元
RV64I架构:XLEN=64,寄存器扩展为64位存储空间
- 嵌入式场景优化配置
- 精简配置(E扩展集):
面向资源敏感型嵌入式场景,架构提供寄存器组精简方案:- 寄存器数量缩减至16个(x0-x15)
- x0寄存器仍保持零值特性
- 仅支持RV32E架构(强制限定XLEN=32)
- 浮点运算扩展配置
- 浮点寄存器组,当系统启用单精度(F扩展)或双精度(D扩展)浮点指令时:
- 新增独立浮点寄存器组(f0-f31)
- 32个浮点寄存器支持标量运算操作
- 寄存器位宽随浮点标准动态调整(F扩展对应32位,D扩展对应64位)
另外为提升代码可读性,汇编器支持寄存器功能别名映射。寄存器别名系统:
例如:x0 → zero(零值寄存器)x1 → ra(返回地址寄存器)x2 → sp(栈指针寄存器) 等,整体汇总如下:
register | ABI name | description | Saver |
---|---|---|---|
x0 | zero | Hard-wired zero, | 常数0 |
x1 | ra | Return address | caller |
x2 | sp | Stack pointer | callee |
x3 | gp | Global pointer | - |
x4 | tp | Thread pointer | - |
x5 | t0 | Temporary/alternate link register | caller |
x6-7 | t1-2 | Temporaries | caller |
x8 | s0/fp | Saved register/frame pointer | callee |
x9 | s1 | Saved register | callee |
x10-11 | a0-1 | Function arguments/return values | caller |
x12-17 | a2-7 | Function arguments | caller |
x18-27 | s2-11 | Saved registers | callee |
x28-31 | t3-6 | Temporaries | caller |
f0-7 | ft0-7 | FP temporaries | caller |
f8-9 | fs0-1 | FP saved temporaries | caller |
f10-11 | fa0-1 | FP arguments/return temporaries | caller |
f12-17 | fa2-7 | FP arguments temporaries | caller |
f18-27 | fs2-11 | FP saved temporaries | caller |
f28-31 | ft0-11 | FP temporaries | caller |
其中:
- ABI(Application Binary Interface)
- Caller :调用者
- Callee : 被调用函数【这里可以视为在 Caller (函数)中调用 Callee (函数)】
Caller 维护的寄存器,在运行被调函数前不会被保存,函数返回时这些寄存器可能会被改变,所以在调用前由 Caller 保存维护。Callee 维护的寄存器,在运行被调函数前会被保存,函数返回后这些寄存器与运行被调函数前相同。
2.2 CSR寄存器
RISC-V 的架构中定义了一些控制和状态寄存器( Control and Status Register, CSR )
-
基础特性:
- 专用地址空间:独立编址的12位地址域(0x000-0xFFF),通过csrrw/csrrs等专用指令访问
- 特权级关联:寄存器访问权限与特权模式(Machine/Supervisor/User)强关联,部分CSR需特定权限操作
- 功能范畴:系统配置、异常处理、性能监控、调试支持
-
主要寄存器分类:
-
机器模式核心CSR
- mstatus (0x300):全局状态控制(中断开关、特权模式栈)
- mtvec (0x305):异常处理入口基址寄存器
- mepc/mcause (0x341/0x342):异常返回地址与原因编码
- mip/mie (0x344/0x304):中断状态与使能位图
-
计时与计数单元
- mcycle/minstret (0xB00/0xB02):时钟周期与指令执行计数器
- mcountinhibit (0x320):性能计数器启停控制
-
调试支持单元
- dcsr/dpc (0x7B0/0x7B1):调试模式控制与断点PC存储
-
扩展功能关联
- 浮点扩展:fcsr (0x003) 聚合浮点状态
- 向量扩展:vcsr (0x008) 配置向量参数
- 用户级只读:cycle/time (0xC00系列)
-
-
访问控制机制:
- 权限隔离:用户模式仅可访问非特权CSR(如ustatus)
- 原子操作:提供csrrw(写后读)、csrrc(位清除)等原子指令
- 影子寄存器:部分CSR(如stvec)在不同特权级拥有独立副本
参考
- 指令集架构知识汇总
- riscv-spec-20240411.pdf
- 胡振波 手把手教你设计CPU
- 跟我学RISC-V】(一)认识RISC-V指令集并搭建实验环境
相关文章:
RISC-V汇编学习(一)—— 基础认识
最近这三年的工作时间大部分的工作,都是基于riscv的cpu和接口ip开发适配驱动,时不时的就要debug测试代码,面对很多都是汇编,所以也是整理下积累的一点点笔记,系列博客将总结下riscv相关的内容,一是给有需要…...
【Delphi】如何解决使用webView2时主界面置顶,而导致网页选择文件对话框被覆盖问题
一、问题描述: 在Delphi 中使用WebView2控件,如果预先把主界面置顶(Self.FormStyle : fsStayOnTop;),此时,如果在Web页面中有使用(<input type"file" id"fileInput" acc…...

基于POI的Excel下拉框自动搜索,包括数据验证的单列删除
目录 目标 例子 1.搜索下拉框页 2.数据源页 3.效果 代码以及注意事项 1.代码 2.注意事项 1.基于Excel的话,相当于加入了一个【数据验证】 2.代码中的一些方法说明 目标 期望在Excel利用代码创建具备自动搜索功能的下拉框 例子 1.搜索下拉框页 2.数据源…...

基金 word-->pdf图片模糊的解决方法
1. 首先需要Adobe或福昕等pdf阅读器。 2. word中 [文件]--[打印],其中打印机选择pdf阅读器,例如此处我选择福昕阅读器。 3. 选择 [打印机属性]--[编辑]--[图像],将所有的采样、压缩均设置为 关闭。点击[另存为],保存为 基金报告…...

React底层原理详解
React中Element&Fiber对象、WorkInProgress双缓存、Reconcile&Render&Commit、第一次挂载过程详解 在面试中介绍React底层原理时,需遵循逻辑清晰、层次分明、重点突出的原则,结合技术深度与实际应用场景。以下是结构化回答模板:…...

Word 插入图片会到文字底下解决方案
一、现象描述 正常情况下,我们插入图片都是这样的。 但有时突然会这样,插入的图片陷于文字底部。 二、网上解决方案 网上有教程说,修改图片布局选项,从嵌入型改成上下型环绕。改完之后确实有用,但是需要手动拖动图片…...
基于DeepSeek 的图生文最新算法 VLM-R1
目录 一、算法介绍 二 算法部署 三 模型下载 四 算法测试 五 可视化脚本 一、算法介绍 VLM-R1:稳定且可通用的 R1 风格大型视觉语言模型 自从 Deepseek-R1 推出以来,出现了许多专注于复制和改进它的作品。在这个项目中,我们提出了 VLM-R1,一种稳定且可通用的 R1 风格…...
Composer如何通过GitHub Personal Access Token安装私有包:完整教程
使用Composer安全管理您的PHP私有依赖包 一、前言 在PHP开发中,我们经常需要将内部工具包托管为私有仓库。传统的账号密码验证方式存在安全隐患,而GitHub Personal Access Token(PAT)提供了一种更安全的鉴权方案。本文将通过4个…...
postgresql postgis扩展相关
项目 下载地址 http://rpmfind.net/linux/rpm2html/search.php?queryprotobuf(x86-64) Postgis Index of /postgis/source/ proj4 Index of /proj/ geos Index of /geos/ libxml2 ftp://xmlsoft.org/libxml2/ Index of /sources Json-c Releases json-c/json-c G…...

基于Python Django的人脸识别上课考勤系统(附源码,部署)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

神经网络之RNN和LSTM(基于pytorch-api)
1.RNN 1.1简介 RNN用于处理序列数据。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如,你要预测句子的下一个单词是…...

leetcode第39题组合总和
原题出于leetcode第39题https://leetcode.cn/problems/combination-sum/description/题目如下: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以…...

【UI设计——视频播放界面分享】
视频播放界面设计分享 在本次设计分享中,带来一个视频播放界面的设计作品。 此界面采用了简洁直观的布局。顶部是导航栏,包含主页、播放、搜索框等常见功能,方便用户快速找到所需操作。搜索框旁输入 “萌宠成长记”,体现了对特定内…...

动态规划刷题
文章目录 动态规划三步问题题目解析代码 动态规划 1. 状态表示:dp[i],表示dp表中i下标位置的值 2. 状态转移方程:以i位置位置的状态,最近的一步来划分问题,比如可以将状态拆分成前状态来表示现状态,dp[i] …...

stm32week5
stm32学习 二.外设 14.串口发送数据包 数据包的定义: HEX数据包(以0xFF为包头,0xFE为包尾,实际上可自定义): 固定包长,含包头包尾可变包长,含包头包尾 对于数据中不会出现包头包尾的数据可以用可变包长…...

fastapi中的patch请求
目录 示例测试使用 curl 访问:使用 requests 访问:预期返回: 浏览器访问 示例 下面是一个使用 app.patch("") 的 FastAPI 示例,该示例实现了一个简单的用户信息更新 API。我们使用 pydantic 定义数据模型,并…...
系统架构设计师—计算机基础篇—计算机网络
文章目录 网络互联模型网络协议与标准应用层协议FTP协议TFTP协议 HTTP协议HTTPS协议 DHCP动态主机配置协议DNS协议迭代查询递归查询 传输层协议网络层协议IPV4协议IPV6协议IPV6数据报的目的地址IPV4到IPV6的过渡技术 网络设计分层设计接入层汇聚层核心层 网络布线综合布线系统工…...
MATLAB中asManyOfPattern函数用法
目录 语法 说明 示例 匹配尽可能多的模式实例 指定要匹配的最小模式数 指定要匹配的最小和最大模式数 asManyOfPattern函数的功能是模式匹配次数尽可能多。 语法 newpat asManyOfPattern(pat) newpat asManyOfPattern(pat,minPattern) newpat asManyOfPattern(pat,m…...

Kafka面试题及原理
1. 消息可靠性(不丢失) 使用Kafka在消息的收发过程都会出现消息丢失,Kafka分别给出了解决方案 生产者发送消息到Brocker丢失消息在Brocker中存储丢失消费者从Brocker 幂等方案:【分布式锁、数据库锁(悲观锁、乐观锁…...

Grok 3 AI 角色扮演提示词 化身顶级设计师
Grok 3:设计下一个大型软件项目的终极工具 🔥 Grok 3 是一个革命性的工具,能够在短短 一小时 内,帮助你完成软件项目设计中最关键的步骤。无论是创建用户画像、设计网站地图,还是编写用户故事及验收标准,G…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...