学习开发一个RISC-V上的操作系统(汪辰老师) — 一次RV32I加法指令的反汇编

前言

(1)此系列文章是跟着汪辰老师的RISC-V课程所记录的学习笔记。

(2)该课程相关代码gitee链接;

(3)PLCT实验室实习生长期招聘:招聘信息链接

前置知识

RISC-V 汇编指令编码格式

(1)在学习RISC-V的反汇编之前,我们需要先知道RISC-V的编码格式,RISC-V的编码格式有如下图6种。

(2)现在我们以RV32I为例子说明。RV32I的指令长度为32位,因此我们每次读取指令的时候,都是4字节4字节的抽取出来。

(3)RISC-V将一条指令分为了多个域(field),例如下面的R-type格式中32bit,有funct7,rs2,rs1,funct3,rd,opcode6个域(field)。每个域(field)都有自己的含义。

<1>funct3/funct7 和 opcode 一起决定最终的指令类型。

<2>rs1,rs2表示寄存器被操作的寄存器。rd表对操作结束后,存放值的寄存器。

<3>imm,表示立即数,即一个有效数据。

大端序和小端序

(1)现在知道了RISC-V的数据长度和存储格式之后,我们还需要知道数据如何摆放的。这个就和C语言的大小端意思类似。

(2)RISC-V的指令在内存中按照 小端序 排列。

(3)大小端序就是看高位还是低位数据谁存放在低地址 。大端序,高位数据存放在低地址。小端序,低位数据存放在低地址。为了方便理解,我举个例子。假设我们有数据地址从低到高:0x00 0x11 0x22 0x33 0x44 0x55 0x66 0x77。

<1>首先抽4字节取出数据,0x00 0x11 0x22 0x33 , 0x44 0x55 0x66 0x77。

<2>小端序,低位数据放在低地址,所以实际上读取的数据是0x33221100和0x77665544。

<3>大端序,高位数据放在低地址,所以实际上读取的数据是0x00112233和0x44556677。

实操

(1)很好,有了上面的认知之后,我们就可以开始反汇编了。现在我们尝试反汇编下面这四条汇编代码。

<1>首先,依照惯例,四字节抽取数据。

<2>因为RISC-V的指令是小端序,所以需要修改一下顺序。

<3>上面说了,funct3/funct7 和 opcode 一起决定最终的指令类型。也就是bit[0:6],bit[12:14],bit[25:31]。从RISC-V 汇编指令编码格式可以知道,RISC-V有6种编码格式,但是一定会有opcode ,因此,我们优先查看bit[0:6]。

<4>根据bit[0:6]我们即可知道此条命令的格式,如果没有funct3/funct7,那么这条命令就找到了,否则就开始对比funct3,如果之后还有funct7继续对比,最后就可以找到指令了。

c 复制代码
_start:
	li x6,1
	li x7,-2
	add x5,x6,x7
stop
	j stop
-----------------
//四字节抽取数据
1303 1000
9303 e0ff
b302 7300
6f00 0000
-----------------
//小端序存储,改变数据位置
0010 0313
ffe0 0393
0073 02b3
0000 006f

(2)按照上述步骤,想必大家一定找到的是如下三条指令。

(3)这个时候肯定就会有人要问了,我们的汇编代码里面明明是j和li命令呀,怎么这里找到的是jal和addi呢?这个就又涉及到另外的一个知识点了 --- 伪指令。为了简化编程难度,大佬们将一些特殊的指令用基础指令封装起来了。这个有点类似与C语言的宏定义,如下:

c 复制代码
#define register_base    0x6666
#define register_a       register_base
#define register_b       register_base + 0x08


参考

(1)riscv-spec-20191213.pdf;

(2)汪辰老师公开课;

(3)汪辰老师公开课第五课课件;

(4)大端序(Big-endian)和小端序(Little-endian)网络字节序;

(5)RISC-V-Reader-Chinese-v2p1.pdf;

相关推荐
~kiss~6 小时前
A Survey of On-Policy Distillation for LLMs 学习(一)
学习
小杨小杨、努力变强!8 小时前
python学习笔记
笔记·学习
Star(up up up)14 小时前
Redis Windows 安装教程:使用Windows 的 Redis 压缩包
redis·笔记·学习·程序人生·云原生·学习方法·改行学it
乌暮16 小时前
Spring AOP 与 Spring 事务:用大白话彻底理解原理与实践
java·数据库·spring boot·后端·sql·学习·spring
蒸蒸yyyyzwd21 小时前
从邓明学习的后端笔记
笔记·学习
机器学习之心21 小时前
基于变量相关图与残差学习的 GCN 多变量回归方法——混凝土 28 天抗压强度预测
学习·回归·gcn
Rabitebla1 天前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
Gary移动存储固件1 天前
eMMC5.1协议中文学习讲解(6.6.17~6.6.22.4.6)
学习·ufs·emmc·nand·存储固件
一个天蝎座 白勺 程序猿1 天前
别让收藏夹替你学习:我搭AI知识体系的完整方法,脚本直接拿去用
人工智能·学习·ai·ai学习
楚山之石1 天前
【Nat Biomed Eng】Connectome 2.0 超高梯度扫描仪:500 mT/m 与 600 T/m/s 把活体人脑微观结构分辨推进到亚微米级
图像处理·学习·数据分析·mri