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…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...
STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
