在云栈社区的技术讨论中,有人分享了一个非常特别的 RISC-V 入门教程——Easy RISC-V。RISC-V 现在火得一塌糊涂,从嵌入式 MCU 到高性能服务器芯片,到处都能看到它的身影。但说句实话,RISC-V 的汇编入门资料真的不算多。
在网上搜 "RISC-V assembly tutorial",你会看到两种结果:要么是官方指令集手册(那是规范,不是入门教程),要么是某大学 CS 课程的 PPT(理论有余,实践不足)。直到我看到 Easy RISC-V——一个在网页里嵌入 RISC-V 模拟器的交互式教程。代码写完点 "Run" 就能跑,还能单步调试,观察寄存器变化。这体验,比我自己搭 QEMU + GDB 舒服多了。
一、RISC-V 这么火,但汇编入门真不容易
先说说为什么要学 RISC-V 汇编。
如果你是嵌入式开发者,RISC-V 已经是绕不开的东西。我在搞某 RISC-V 芯片的 OTA 固件升级时,用的就是 RISC-V 工具链。你要调 bootloader、要看 startup code、要理解链接脚本里的 _start,不懂汇编真的不行。
但 RISC-V 汇编的入门门槛,确实有点高:
- 官方手册太硬核:《The RISC-V Instruction Set Manual》是规范,不是教程。它告诉你每条指令的编码格式,但不告诉你“为什么要这样设计”。
- 现有教程要么太浅,要么太深:太浅的只教你 addi、lw、sw,连函数调用约定都不讲;太深的直接给你讲流水线、Cache 一致性,初学者直接劝退。
- 没有交互式环境:学汇编最大的痛点是“写了代码不知道对不对”。你要搭交叉编译工具链、要烧写到板子或用 QEMU,流程太长,反馈太慢。
Easy RISC-V 这个教程,就是冲着解决这些问题来的。
二、Easy RISC-V:受 Easy 6502 启发的交互式教程
这个教程的作者是 dramforever(GitHub 用户名),他在 GitHub 上的仓库是 dramforever/easyriscv。
教程的灵感来源于 Nick Morgan 的 Easy 6502(https://skilldrick.github.io/easy6502/)。Easy 6502 是一个交互式 6502 汇编教程,在网页里嵌入了一个 6502 模拟器,你可以边学边跑代码,体验非常好。
dramforever 做了同样的事情,但是针对 RISC-V:
| 特性 |
Easy 6502 |
Easy RISC-V |
| 目标架构 |
6502(8位, 1975年) |
RISC-V RV32I(32位, 2010年) |
| 模拟器 |
网页内嵌 6502 模拟器 |
网页内嵌 RISC-V 模拟器 |
| 交互方式 |
写汇编 → 点 Run → 看结果 |
写汇编 → 点 Run → 看寄存器/内存 |
| 适合人群 |
复古计算爱好者 |
嵌入式开发者、系统程序员 |
| 教程长度 |
较短,入门级 |
较长,覆盖到操作系统 |
这个教程的 GitHub 仓库:https://github.com/dramforever/easyriscv
在线阅读:https://easyriscv.dram.page/

三、45条指令,从加法到系统调用
Easy RISC-V 覆盖的是 RV32I_Zicsr 指令集,也就是:
- RV32I:32 位基础整数指令集(不带乘除法扩展)
- Zicsr:控制与状态寄存器指令(用于操作系统开发)
总共 45 条指令,包括:
| 类别 |
指令 |
说明 |
| 立即数计算 |
addi, slti, sltiu, xori, ori, andi, slli, srli, srai |
寄存器 + 立即数运算 |
| 寄存器计算 |
add, sub, slt, sltu, xor, or, and, sll, srl, sra |
寄存器 + 寄存器运算 |
| 分支 |
beq, bne, blt, bge, bltu, bgeu |
条件跳转 |
| 跳转 |
jal, jalr |
函数调用/无条件跳转 |
| 加载 |
lui, auipc |
加载高位立即数/PC 相对地址 |
| 内存访问 |
lb, lh, lw, lbu, lhu, sb, sh, sw |
加载/存储字节/半字/字 |
| 系统指令 |
ecall, ebreak |
环境调用/断点 |
| CSR 指令 |
csrrw, csrrs, csrrc, csrrwi, csrrsi, csrrci |
读写控制与状态寄存器 |
这 45 条指令,看起来不多,但已经足够跑一个“裸机”的 RISC-V 程序了。教程里甚至带你写了一个极简操作系统,包括:
- 机器模式(M-mode)的异常处理
- 用户模式(U-mode)的系统调用
putchar 和 exit 两个系统调用
- 完整的异常分发和处理流程

四、浏览器里的 RISC-V 模拟器,单步调试太爽了
这个教程最大的亮点是嵌入了一个 RISC-V 模拟器,你在网页里写汇编代码,点 "Start" 汇编,点 "Run" 运行,点 "Step" 单步执行。
模拟器面板显示:
- 寄存器状态:31 个通用寄存器(x1‑x31)+ pc + 部分 CSR
- 内存内容:可以查看任意地址的内存
- 输出面板:向 0x10000000 地址写入数据,就会在输出面板显示字符(内存映射 I/O)
我试着跑了一下教程里的第一个程序:
addi x10, x0, 0x123
ebreak
点 "Start" → 点 "Run",x10 的值变成了 0x123。点 "Step" 单步执行,可以看到每一步 pc 的变化和指令的执行。

这体验,比我自己搭环境爽太多了。你想试什么指令,直接改代码点 "Run",5 秒钟就能看到结果。
五、从“Hello World”到写操作系统,教程带你走一遍
教程的章节设计很合理,从浅到深:
- 简介:RISC-V 是什么,为什么开放标准很重要
- 我的第一个 RISC-V 汇编程序:跑
addi x10, x0, 0x123
- 模拟器控制说明:Start/Run/Step/Dump 按钮的用法
- 处理器状态:pc、通用寄存器、零寄存器 x0
- 指令语法:
addi rd, rs1, imm 这种格式
- 计算类指令:加法、减法、位运算、比较、移位
- 插曲:加载更大的立即数:lui + addi 组合技
- 跳转与分支:beq/bne/jal/jalr,函数调用和返回
- 内存:
.word/.byte 数据定义,lw/sw 加载存储
- 函数:调用约定、栈的使用、递归函数
- 插曲:数字标签:1:/1b/1f 语法糖
- 位置无关代码:auipc + jalr 实现 PIC
- 特权架构基础:机器模式/用户模式、CSR、异常
- 编写极简操作系统:完整的异常处理 + 系统调用
整个教程读下来,你对 RISC-V 从“知道有这玩意”到“能写一个裸机程序并在模拟器里跑起来”,跨度很大,但每一步都很扎实。
六、适合谁看?嵌入式老哥值得刷一遍
这个教程适合这几类人:
- 嵌入式开发者:你在用 RISC-V 芯片,需要懂RISC-V汇编来调 bootloader、看 startup code、理解链接脚本。这个教程能帮你快速建立 RISC-V 汇编的直觉。
- 操作系统学习者:教程最后带你写了一个极简操作系统,包括异常处理、系统调用、用户态/内核态切换。这是理解操作系统底层的好起点。
- 编译器/工具链开发者:你要写 RISC-V 的后端,需要懂每一条指令的语义。这个教程覆盖了 RV32I 的所有指令。
- 纯好奇党:你就想看看 RISC-V 汇编长什么样,这个教程的交互式模拟器能让你 5 分钟跑起来第一个程序。
我自己是第一类。我在搞某 RISC-V 芯片的 OTA 时,遇到过 bootloader 里的一段汇编看不懂,那时候要是看过这个教程,理解起来会快很多。
七、总结:为什么这个教程值得推荐
说几点我对这个教程的评价:
优点:
- 交互式体验太好了——不需要搭环境,打开网页就能跑代码。这对初学者来说,降低了太多门槛。
- 内容扎实——从第一条指令讲到操作系统,覆盖的内容足够你入门 RISC-V 汇编。
- 模拟器是真实可用的——不是玩具,支持异常、系统调用、内存映射 I/O,你能用它验证自己对 RISC-V 的理解。
- 开源——代码在 GitHub 上,CC0 协议,你可以随便用。
缺点/局限:
- 只覆盖 RV32I——没有讲 RV64I(64位)、C 扩展(压缩指令)、乘除法扩展。但这些是“扩展”,基础的整数指令集确实已经覆盖了。
- 教程是英文的——对英文不好的同学有点门槛。但技术英语不难,配合模拟器跑一遍,理解起来没问题。
- 模拟器是教学用的——不是真实的 QEMU 或 Spike,有些行为可能和真实硬件有差异。但作为学习工具,足够了。
在 RISC-V 这样一个开放架构的时代,用网页 + 模拟器的方式,把汇编入门的门槛降到了“打开网页就能跑”的程度。致敬,dramforever。