新闻详情

新闻详情

首页 / 资讯中心 / 详情

CTF Wiki RISC-V 基础篇:开放指令集架构、寄存器体系与 ABI 调用规约速查手册

发布时间:2026/9/25 5:57:20来源:尧图网络
CTF Wiki RISC-V 基础篇:开放指令集架构、寄存器体系与 ABI 调用规约速查手册
文档网络安全教程【免费下载链接】ctf-wikiCome and join us, we need you!项目地址https://gitcode.com/gh_mirrors/ct/ctf-wiki点击查看免费下载本文是对 CTF Wiki 中文站《RISC-V》文档docs/zh-tw/docs/assembly/risc-v/readme.md简体版本见 docs/zh/docs/assembly/risc-v/readme.md的系统化整理与扩充。逆向工程中除常见的 x86/x64、ARM、MIPS 之外RISC-V 处理器在嵌入式设备、车机、物联网固件中越来越常见读懂其寄存器与指令编码是分析这类二进制的基础。读完本文你将掌握 RISC-V 的模块化指令集扩展、32 个通用寄存器与 CSR 控制状态寄存器、按指令格式分类的常用指令以及 RISC-V ABI 调用规约栈帧布局、参数与返回值传递规则。0x01 架构特点模块化的开放指令集RISC-V 是一种新兴的开放指令集架构ISA具有高度的灵活性与可扩展性。它以模块化设计为核心理念允许开发者根据实际需求选择不同的扩展模块来构建处理器。最基本的指令集包括 RV32I 和 RV64I可选的扩展则涵盖乘除法M、原子操作A、浮点运算F、D、压缩指令C以及适用于高性能计算的向量指令集V等。该架构支持多种位宽包括 32 位RV32、64 位RV64以及未来预留的 128 位RV128模式从而满足从嵌入式系统到高性能服务器等多样化应用场景。RISC-V 还明确区分了处理器的特权等级定义了用户态U-mode、监督态S-mode和机器态M-mode为操作系统的运行和安全机制提供了良好的支撑。下表列出常见的指令集扩展及其简要说明名称描述RV32I / RV64I基本整数指令集构建最小系统的核心M 扩展支持整数乘除法运算A 扩展提供原子操作能力适用于多核心系统F / D 扩展支持浮点数运算F 为单精度D 为双精度C 扩展16 位压缩指令提升代码密度V 扩展向量处理能力用于数据并行运算Zicsr / Zifencei控制状态寄存器操作与指令同步控制理解这套扩展体系对逆向很有帮助反汇编器与 Ghidra/IDA 等工具在分析 RISC-V 二进制时会依据 ELF 头中misa/属性段标注的扩展集合来解码指令。若目标固件启用了C扩展代码以 16 位指令为主分析时需要格外注意指令对齐若启用了D扩展则会频繁出现浮点寄存器f0~f31参与运算这在前面的扩展表中已有对应关系。0x02 寄存器通用寄存器、CSR 与浮点寄存器RISC-V 处理器架构定义了一组通用寄存器与控制状态寄存器CSR用于处理数据、控制流程及存储状态信息。1通用寄存器RISC-V 一共有32 个通用寄存器编号为x0到x31每个寄存器为 32 位RV32或 64 位RV64。这些寄存器也有对应的 ABI 名称常用于汇编语言编程寄存器编号ABI 名称用途说明x0zero恒为 0 的只读寄存器x1ra返回地址寄存器x2sp栈指针x3gp全局指针x4tp线程指针x5-x7t0-t2临时寄存器x8s0/fp保存寄存器/帧指针x9s1保存寄存器x10-x17a0-a7函数参数/返回值x18-x27s2-s11保存寄存器x28-x31t3-t6临时寄存器注意事项x0是特殊的只读寄存器总是返回0写入无效。临时寄存器t0~t6在函数调用过程中不保证保留。保存寄存器s0~s11在函数调用之间必须被保存和恢复。2CSR 寄存器CSRControl and Status Register是用于控制、状态监测和配置处理器运行的重要寄存器。RISC-V 中 CSR 的地址空间为 12 位共支持 4096 个 CSR 寄存器。常见 CSR 寄存器包括名称地址功能说明mstatus0x300机器级状态寄存器保存全局中断使能、特权级等信息misa0x301指示当前支持的指令集架构mie0x304中断使能寄存器mtvec0x305中断向量表地址mepc0x341异常发生时的程序计数器保存寄存器mcause0x342异常/中断原因寄存器mtval0x343出错地址信息mcycle0xB00机器模式下的周期计数器注意事项CSR 可通过隶属于zicsr扩展指令集的指令csrrw、csrrs、csrrc等进行读写。按照特权级别分类CSR 分为用户态u*、监督态s*、机器态m*等。在简化实现中仅支持机器态M-mode的 CSR 是常见情况。从逆向角度看mtvec中断向量表地址与mepc/mcause异常现场是分析 RISC-V 系统固件、Bootloader 与内核异常处理流程的关键锚点mstatus的中断使能位MIE则决定了异常处理函数的入口执行条件。3浮点寄存器RISC-V 架构在支持浮点扩展如F和D扩展时提供了一组专用的浮点寄存器用于浮点数的计算和数据存储。RISC-V 定义了32 个浮点寄存器编号为f0到f31每个寄存器通常为 32 位单精度RV32F或 64 位双精度RV64D具体取决于所实现的浮点扩展。寄存器编号ABI 名称用途说明f0-f7ft0-ft7临时寄存器f8-f9fs0-fs1保存寄存器f10-f17fa0-fa7函数参数/返回值f18-f27fs2-fs11保存寄存器f28-f31ft8-ft11临时寄存器注意事项浮点寄存器的 ABI 命名与整数寄存器类似但前缀为f。根据 ABI 约定函数参数通过fa0~fa7传递返回值通常使用fa0。ft*为调用者保存Caller-savedfs*为被调用者保存Callee-saved。使用浮点寄存器需要处理器支持相应的浮点扩展指令集如F单精度或D双精度。0x03 常见指令按指令格式分类速查RISC-V 指令按编码格式分为 R、I、S、B、U、J 等类型。理解格式有助于在反汇编时快速判断操作数来源与指令语义。1常见整数指令R 型R 型指令用于寄存器之间的算术或逻辑操作格式rd rs1 op rs2。指令含义示例说明add加法add x5, x1, x2x5 x1 x2sub减法sub x5, x1, x2x5 x1 - x2sll逻辑左移sll x5, x1, x2按x2位左移x1srl逻辑右移srl x5, x1, x2按x2位右移x1sra算术右移sra x5, x1, x2保留符号位的右移and位与and x5, x1, x2位级AND运算or位或or x5, x1, x2位级OR运算xor位异或xor x5, x1, x2位级XOR运算slt小于置位有符号slt x5, x1, x2若x1 x2x51否则为 0sltu小于置位无符号sltu x5, x1, x2同上但比较无符号值2常见立即数指令I 型I 型指令对寄存器和立即数执行运算适用于快速计算和常数赋值。指令含义示例说明addi加立即数addi x5, x1, 10x5 x1 10andi与立即数andi x5, x1, 0xF位级AND掩码操作常用ori或立即数ori x5, x1, 1设置某一位常用xori异或立即数xori x5, x1, 0x1反转特定位slti小于立即数slti x5, x1, 5有符号立即数比较sltiu无符号小于立即数sltiu x5, x1, 5无符号立即数比较slli左移立即数slli x5, x1, 3最多移位 31RV32srli右移立即数srli x5, x1, 2无符号逻辑右移srai算术右移立即数srai x5, x1, 2有符号右移保留符号位lui加载高位立即数lui x5, 0x12345x5 0x12345000auipc加偏移到 PCauipc x5, 0x10x5 PC 0x10000实用技巧RISC-V 的 I 型立即数只有 12 位有符号因此构造 32 位/64 位常数通常需要luiaddi组合auipc则用于生成与当前 PC 相对的地址是位置无关代码PIC和 GOT/PLT 跳转的基础逆向定位字符串引用时经常看到auipc/addi成对出现。3加载指令I 型用于从内存地址读取数据到寄存器。地址由rs1 offset计算得出。指令含义示例说明lb加载字节有符号lb x5, 0(x1)从x1指向的地址读 1 字节符号扩展到x5lbu加载字节无符号lbu x5, 0(x1)零扩展lh加载半字16 位lh x5, 2(x1)符号扩展 16 位整数lhu加载半字无符号lhu x5, 2(x1)零扩展lw加载字32 位lw x5, 4(x1)常用加载指令lwu加载字无符号RV64lwu x5, 4(x1)32 位零扩展用于 RV64ld加载双字64 位ld x5, 8(x1)RV64 架构下的主力指令4存储指令S 型用于将寄存器中的值写入内存。地址仍由rs1 offset计算。指令含义示例说明sb存储字节sb x5, 0(x1)仅存 1 字节sh存储半字16 位sh x5, 2(x1)sw存储字32 位sw x5, 4(x1)RV32 和 RV64 共用sd存储双字64 位sd x5, 8(x1)仅 RV64 可用5控制流指令B 型用于实现条件跳转配合标签使用跳转偏移为 12 位立即数±4KB。指令含义示例说明beq相等跳转beq x1, x2, label若x1 x2跳转到labelbne不等跳转bne x1, x2, label若x1 ! x2跳转blt小于跳转有符号blt x1, x2, label若x1 x2跳转bge大于等于跳转有符号bge x1, x2, label若x1 x2跳转bltu小于跳转无符号bltu x1, x2, label无符号小于比较跳转bgeu大于等于跳转无符号bgeu x1, x2, label无符号大于等于比较跳转由于 B 型分支偏移仅覆盖 ±4KB超出范围的跳转需要借助auipcjalr间接完成逆向分析超长跳转时应注意这类编译模式。6跳转与链接指令J 型、I 型用于过程调用和函数跳转保留返回地址到ra。指令含义示例说明jal跳转并链接J 型jal x1, labelx1 PC4; PC label用于调用jalr寄存器间接跳转I 型jalr x1, x2, 0x1 PC4; PC x2 0常用于返回或调用函数指针若目标寄存器为x0表示不保存返回地址纯跳转。jal通常用于调用函数jalr用于从函数返回。函数入口反汇编时通常能看到jal ra, func或call伪指令函数结尾常见jalr x0, ra, 0等价于ret这正是通过x0丢弃返回地址的典型用法。7特殊系统调用指令环境交互指令含义示例说明ecall环境调用系统调用ecall触发环境调用异常ebreak调试断点ebreak触发调试异常0x04 调用规约RISC-V ABI 栈帧与寄存器保存规则栈帧结构图RISC-V ABI 栈帧高地址 │ │ ----------------------------- │ | 需要保存的寄存器 | │ ----------------------------- │ | 超过寄存器传参的参数 a7/fa7 | │ ----------------------------- │ | 返回地址 (ra) | │ ----------------------------- │ | 局部变量 | │ ----------------------------- │ | (16 字节对齐空间填充) | └──► 栈指针 (sp)1. 栈增长向低地址方向增长。spx2总是保持16 字节对齐。常用sp作为指针访问栈内容例如ld t0, 16(sp)。栈帧访问在逆向中尤为重要RISC-V 不像 x86 有专门的ebp帧指针约定许多编译优化-O2以上直接以sp为基址访问局部变量因此恢复栈帧边界需要结合addi sp, sp, -imm的减栈量与ld/sw的偏移综合判断。2. 保存寄存器内容由callee被调用者保存s0–s11x8–x9, x18–x27 → 用于长期保存的数据fs0–fs11f8–f9, f18–f27 → 浮点保存寄存器rax1 → 返回地址call 伪指令修改 ra 后由被调用函数保存由caller调用者保存t0–t6x5–x7, x28–x31ft0–ft11f0–f7, f28–f31参数大小约束小于指针大小如char、short放在寄存器的低位。超过一个指针大小如long long需要偶数对齐寄存器。例如 RV32 中void foo(int, long long)int→a0long long→a2和a3跳过a1偶数对齐超过两个指针大小如struct { long x[3]; } →按引用传递。返回值传递规则返回值使用整数a0,a1浮点数fa0,fa1结构体返回≤2 pointer-word用a0/a12 pointer-word调用者分配内存并通过隐藏指针作为第一个参数传递在还原函数签名时这一规则直接决定参数应从哪些寄存器取值对于结构体返回场景第一个实参寄存器a0实际存放的是返回缓冲区指针而不是首个显式参数。寄存器使用一览类型名称用途由谁保存x1ra返回地址调用者callerx2sp栈指针被调用者calleex8s0 / fp帧指针 / 保存寄存器被调用者x10–x17a0–a7参数 / 返回值寄存器调用者x5–x7, x28–x31t0–t6临时变量调用者x9, x18–x27s1, s2–11保存变量被调用者f10–f17fa0–fa7浮点参数 / 返回值调用者f0–f7, f28–f31ft0–11浮点临时变量调用者f8–f9, f18–f27fs0–fs11浮点保存变量被调用者注意严格来说sp、ra寄存器并不属于保存/临时寄存器的分类这两个寄存器的处理多以由被调用端callee保存为主同时像gp等寄存器也不属于这个范畴。与仓库内其他架构文档的横向对照CTF Wiki 在 assembly 目录 下按架构整理了姊妹篇文档便于读者横向对比不同指令集的设计差异x86_x64 汇编基础以寄存器和指令风格见长的 CISC 架构逆向分析最常见的目标。ARM 汇编基础覆盖 LDMIA/STM 多寄存器寻址、栈寻址FA/EA/FD/ED、块拷贝寻址以及 B/BL/BX/BLX 跳转指令与 RISC-V 的 load-store 模型和 B 型分支形成对照。MIPS 汇编基础同为 load-store 架构讲解 32 个通用寄存器、$zero/$at等约定、HI/LO 乘除结果寄存器以及包含指令编码位图在内的完整指令参考可作为理解 RISC-V 指令编码的类比对象。三者与 RISC-V 的显著差异在于x86 采用可变长指令与两个操作数风格ARM/MIPS 与 RISC-V 同属 RISC 家族但 RISC-V 以极简的固定格式指令R/I/S/B/U/J和模块化扩展M/A/F/D/C/V著称寄存器约定32 个 x 32 个 f CSR也更为规整。小结RISC-V 的模块化扩展体系决定了“最小系统 RV32I/RV64I 按需扩展”的分析思路32 个通用寄存器、12 位地址空间的 CSR 以及 32 个浮点寄存器构成了逆向时定位数据流与控制流的基础R/I/S/B/U/J 六类指令格式覆盖了算术逻辑、立即数、访存、分支、跳转与系统调用等全部常用操作ABI 调用规约栈向低地址增长、16 字节对齐、caller/callee 分工、偶数对齐参数、隐藏指针返回大结构体则是还原函数签名与栈帧结构的核心依据。官方规范细节可进一步查阅 RISC-V ELF psABI 文档与 RISC-V 指令集架构官方手册。赞分享文档网络安全教程【免费下载链接】ctf-wikiCome and join us, we need you!项目地址https://gitcode.com/gh_mirrors/ct/ctf-wiki点击查看免费下载相关推荐Linux/PA-RISC 寄存器使用规范全解控制寄存器、PSW、空间寄存器与 ABI 调用约定Linux/PA RISC 寄存器使用规范全解控制寄存器、PSW、空间寄存器与 ABI 调用约定 本文依据 Linux 内核源码树中的 Documentati后端物联网消息队列通信RISC-V指令集手册终极指南5分钟快速掌握架构规范你是否正在为RISC V架构的复杂性而头疼 别担心这篇指南将带你用最简单的方式快速上手RISC V指令集手册让你在短短5分钟内就能找到需要的技术规范文档指令集RISC-V指令集终极实战手册从架构规范到高效开发RISC V架构规范作为开源的指令集标准为技术开发者和架构设计人员提供了完整的系统设计参考。本指南将深入解析RISC V指令集的核心特性并提供快速配置方法和文档指令集创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

2026年AI Agent工具接入终极指南:treg如何把60+供应商API变成按次计费 2026/9/25 6:26:56

2026年AI Agent工具接入终极指南:treg如何把60+供应商API变成按次计费

2026年AI Agent工具接入终极指南:treg如何把60供应商API变成按次计费 【免费下载链接】treg OpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn 项目地址: https://gitcode.com/GitHub_Trending/treg/treg treg 是一个开源的…

阅读更多 →
Edge浏览器内置冲浪游戏:入口、玩法与背后的产品逻辑 2026/9/25 6:26:56

Edge浏览器内置冲浪游戏:入口、玩法与背后的产品逻辑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
转行汽车电子,为什么我建议从电机控制开始?附完整学习路线与书单 2026/9/25 6:26:50

转行汽车电子,为什么我建议从电机控制开始?附完整学习路线与书单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
华为Pura X View游戏助手智能光影技术解析与调优指南 2026/9/25 6:26:50

华为Pura X View游戏助手智能光影技术解析与调优指南

1. 华为 Pura X View 游戏助手这次更新到底动了谁的蛋糕华为 Pura X View 游戏助手新增《原神》智能光影功能,这条消息在手游圈和鸿蒙生态开发者群里传开的时候,我第一反应不是"又一个画质增强",而是华为终于把手伸进了移动端游戏渲…

阅读更多 →
STM32在AI聊天机器人中的实时控制与物理世界落地 2026/9/25 6:26:50

STM32在AI聊天机器人中的实时控制与物理世界落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
海光1000系列处理器发布:C86架构打造轻量级端侧CPU 2026/9/25 6:26:44

海光1000系列处理器发布:C86架构打造轻量级端侧CPU

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉