当前位置: 首页 > news >正文

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等访存指令才能访问内存(减少了访存周期)
优化编译实现很难较容易(依靠编译程序的优化来更有效的支持高级语言)
代表架构x86ARM,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 nameclassdescription
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架构通用寄存器设计规范包括:

  1. 基础整数指令集寄存器配置
  • a、标准配置(I扩展集):
    RISC-V基础指令集架构默认配置32个整数寄存器组,编号为x0至x31。其中x0寄存器具有硬连线常数0特性(写入操作无效,读取始终返回0值),其余31个寄存器(x1-x31)为全功能通用寄存器。

  • b、寄存器位宽定义:
    架构通过XLEN参数声明寄存器物理位宽:
    RV32I架构:XLEN=32,寄存器采用32位存储单元
    RV64I架构:XLEN=64,寄存器扩展为64位存储空间

  1. 嵌入式场景优化配置
  • 精简配置(E扩展集):
    面向资源敏感型嵌入式场景,架构提供寄存器组精简方案:
    • 寄存器数量缩减至16个(x0-x15)
    • x0寄存器仍保持零值特性
    • 仅支持RV32E架构(强制限定XLEN=32)
  1. 浮点运算扩展配置
  • 浮点寄存器组,当系统启用单精度(F扩展)或双精度(D扩展)浮点指令时:
    • 新增独立浮点寄存器组(f0-f31)
    • 32个浮点寄存器支持标量运算操作
    • 寄存器位宽随浮点标准动态调整(F扩展对应32位,D扩展对应64位)

另外为提升代码可读性,汇编器支持寄存器功能别名映射。寄存器别名系统:
例如:x0 → zero(零值寄存器)x1 → ra(返回地址寄存器)x2 → sp(栈指针寄存器) 等,整体汇总如下:

registerABI namedescriptionSaver
x0zeroHard-wired zero,常数0
x1raReturn addresscaller
x2spStack pointercallee
x3gpGlobal pointer-
x4tpThread pointer-
x5t0Temporary/alternate link registercaller
x6-7t1-2Temporariescaller
x8s0/fpSaved register/frame pointercallee
x9s1Saved registercallee
x10-11a0-1Function arguments/return valuescaller
x12-17a2-7Function argumentscaller
x18-27s2-11Saved registerscallee
x28-31t3-6Temporariescaller
f0-7ft0-7FP temporariescaller
f8-9fs0-1FP saved temporariescaller
f10-11fa0-1FP arguments/return temporariescaller
f12-17fa2-7FP arguments temporariescaller
f18-27fs2-11FP saved temporariescaller
f28-31ft0-11FP temporariescaller

其中:

  • ABI(Application Binary Interface)
  • Caller :调用者
  • Callee : 被调用函数【这里可以视为在 Caller (函数)中调用 Callee (函数)】

Caller 维护的寄存器,在运行被调函数前不会被保存,函数返回时这些寄存器可能会被改变,所以在调用前由 Caller 保存维护。Callee 维护的寄存器,在运行被调函数前会被保存,函数返回后这些寄存器与运行被调函数前相同。

2.2 CSR寄存器

RISC-V 的架构中定义了一些控制和状态寄存器( Control and Status Register, CSR )

  1. 基础特性:

    • 专用地址空间:独立编址的12位地址域(0x000-0xFFF),通过csrrw/csrrs等专用指令访问
    • 特权级关联:寄存器访问权限与特权模式(Machine/Supervisor/User)强关联,部分CSR需特定权限操作
    • 功能范畴:系统配置、异常处理、性能监控、调试支持
  2. 主要寄存器分类:

    • 机器模式核心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系列)
  3. 访问控制机制:

    • 权限隔离:用户模式仅可访问非特权CSR(如ustatus)
    • 原子操作:提供csrrw(写后读)、csrrc(位清除)等原子指令
    • 影子寄存器:部分CSR(如stvec)在不同特权级拥有独立副本

参考

  • 指令集架构知识汇总
  • riscv-spec-20240411.pdf
  • 胡振波 手把手教你设计CPU
  • 跟我学RISC-V】(一)认识RISC-V指令集并搭建实验环境

相关文章:

RISC-V汇编学习(一)—— 基础认识

最近这三年的工作时间大部分的工作,都是基于riscv的cpu和接口ip开发适配驱动,时不时的就要debug测试代码,面对很多都是汇编,所以也是整理下积累的一点点笔记,系列博客将总结下riscv相关的内容,一是给有需要…...

【Delphi】如何解决使用webView2时主界面置顶,而导致网页选择文件对话框被覆盖问题

一、问题描述&#xff1a; 在Delphi 中使用WebView2控件&#xff0c;如果预先把主界面置顶&#xff08;Self.FormStyle : fsStayOnTop;&#xff09;&#xff0c;此时&#xff0c;如果在Web页面中有使用&#xff08;<input type"file" id"fileInput" acc…...

基于POI的Excel下拉框自动搜索,包括数据验证的单列删除

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

基金 word-->pdf图片模糊的解决方法

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

React底层原理详解

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

Word 插入图片会到文字底下解决方案

一、现象描述 正常情况下&#xff0c;我们插入图片都是这样的。 但有时突然会这样&#xff0c;插入的图片陷于文字底部。 二、网上解决方案 网上有教程说&#xff0c;修改图片布局选项&#xff0c;从嵌入型改成上下型环绕。改完之后确实有用&#xff0c;但是需要手动拖动图片…...

基于DeepSeek 的图生文最新算法 VLM-R1

目录 一、算法介绍 二 算法部署 三 模型下载 四 算法测试 五 可视化脚本 一、算法介绍 VLM-R1:稳定且可通用的 R1 风格大型视觉语言模型 自从 Deepseek-R1 推出以来,出现了许多专注于复制和改进它的作品。在这个项目中,我们提出了 VLM-R1,一种稳定且可通用的 R1 风格…...

Composer如何通过GitHub Personal Access Token安装私有包:完整教程

使用Composer安全管理您的PHP私有依赖包 一、前言 在PHP开发中&#xff0c;我们经常需要将内部工具包托管为私有仓库。传统的账号密码验证方式存在安全隐患&#xff0c;而GitHub Personal Access Token&#xff08;PAT&#xff09;提供了一种更安全的鉴权方案。本文将通过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的人脸识别上课考勤系统(附源码,部署)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

神经网络之RNN和LSTM(基于pytorch-api)

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

leetcode第39题组合总和

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

【UI设计——视频播放界面分享】

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

动态规划刷题

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

stm32week5

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

fastapi中的patch请求

目录 示例测试使用 curl 访问&#xff1a;使用 requests 访问&#xff1a;预期返回&#xff1a; 浏览器访问 示例 下面是一个使用 app.patch("") 的 FastAPI 示例&#xff0c;该示例实现了一个简单的用户信息更新 API。我们使用 pydantic 定义数据模型&#xff0c;并…...

系统架构设计师—计算机基础篇—计算机网络

文章目录 网络互联模型网络协议与标准应用层协议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. 消息可靠性&#xff08;不丢失&#xff09; 使用Kafka在消息的收发过程都会出现消息丢失&#xff0c;Kafka分别给出了解决方案 生产者发送消息到Brocker丢失消息在Brocker中存储丢失消费者从Brocker 幂等方案&#xff1a;【分布式锁、数据库锁&#xff08;悲观锁、乐观锁…...

Grok 3 AI 角色扮演提示词 化身顶级设计师

Grok 3&#xff1a;设计下一个大型软件项目的终极工具 &#x1f525; Grok 3 是一个革命性的工具&#xff0c;能够在短短 一小时 内&#xff0c;帮助你完成软件项目设计中最关键的步骤。无论是创建用户画像、设计网站地图&#xff0c;还是编写用户故事及验收标准&#xff0c;G…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...