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

news2025/2/26 14:31:50

前言

(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,有funct7rs2rs1funct3rd,opcode6个域(field)。每个域(field)都有自己的含义。
<1>funct3/funct7opcode 一起决定最终的指令类型。
<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 0x330x44 0x55 0x66 0x77
<2>小端序,低位数据放在低地址,所以实际上读取的数据是0x332211000x77665544
<3>大端序,高位数据放在低地址,所以实际上读取的数据是0x001122330x44556677

在这里插入图片描述

实操

(1)很好,有了上面的认知之后,我们就可以开始反汇编了。现在我们尝试反汇编下面这四条汇编代码。
<1>首先,依照惯例,四字节抽取数据。
<2>因为RISC-V的指令是小端序,所以需要修改一下顺序。
<3>上面说了,funct3/funct7opcode 一起决定最终的指令类型。也就是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继续对比,最后就可以找到指令了。

_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)这个时候肯定就会有人要问了,我们的汇编代码里面明明是jli命令呀,怎么这里找到的是jaladdi呢?这个就又涉及到另外的一个知识点了 — 伪指令。为了简化编程难度,大佬们将一些特殊的指令用基础指令封装起来了。这个有点类似与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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1087612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧机场数字孪生大屏升级智慧出行全方位服务

在宁波栎社国际机场的信息中心大楼内&#xff0c;一块大屏幕上展示了一座“数字孪生”机场。通过点击屏幕上的各个板块&#xff0c;可以实时查看现场情况&#xff0c;一旦出现突发状况&#xff0c;还可以立即启动闭环处置流程…… &#xff08;图源自宁波机场&#xff09; 在数…

7-zip压缩包密码忘记了,怎么破解?

7z压缩包设置了密码&#xff0c;解压的时候就需要输入正确对密码才能顺利解压出文件&#xff0c;正常当我们解压文件或者删除密码的时候&#xff0c;虽然方法多&#xff0c;但是都需要输入正确的密码才能完成。忘记密码就无法进行操作。 那么&#xff0c;忘记了7z压缩包的密码…

LLM应用架构 LLM application architectures

在本课程的最后一部分&#xff0c;您将探讨构建基于LLM的应用程序的一些额外考虑因素。首先&#xff0c;让我们把迄今为止在本课程中所见的一切汇总起来&#xff0c;看看创建LLM驱动应用程序的基本组成部分。您需要几个关键组件来创建端到端的应用程序解决方案&#xff0c;从基…

个人财务预算系统BudgetBee

什么是 BudgetBee &#xff1f; BudgetBee 是一个个人财务预算系统。通过 BudgetBee&#xff0c;您可以轻松管理您的个人财务。它可以帮助您跟踪您的支出和收入&#xff0c;以便您可以减少支出并增加储蓄。 镜像下载 官方没有在 docker hub 上发布镜像&#xff0c;而是采用了自…

idea中导入eclipse的javaweb项目——tomact服务(保姆级别)

idea中导入eclipse的javaweb项目——tomact服务&#xff08;保姆级别&#xff09; 1. 导入项目2. Project Settings下的各种配置步骤2.1 检查/修改 jdk 的引入2.2 配置Modules-Dependencies2.2.1 删掉eclipse相关的多余配置2.2.2 删掉jar包2.2.3 添加tomcat的依赖 2.3 配置Libr…

Semi D2C 设计稿转代码框架

TL;DR Semi Design 是抖音前端团队开发的设计系统,包括 Semi UI 组件库,DSM 设计系统定制,D2C 设计稿转代码等方向。本文主要介绍 Semi D2C的能力边界,与其他方案的差异,探索历程,底层实现原理 / 难点。阅读时间 30-45min。可以做什么,不可以做什么? D2C 为 Design to…

ros协议的最佳解决方案

在网络通信中&#xff0c;ros&#xff08;点对点隧道协议&#xff09;是一种常用的VPN&#xff08;虚拟专用网络&#xff09;协议&#xff0c;用于建立安全的连接。然而&#xff0c;由于ros协议的漏洞和安全性问题&#xff0c;我们需要采取一些措施来加强其安全性。在本文中&am…

基于片段的分子生成网络 (FLAG)使用方法及案例测评

本文来源于中国科技大学计算机科学与技术学院刘淇教授课题组于2023年发表在ICLR2023上的文章《MOLECULE GENERATION FOR TARGET PROTEIN BINDING WITH STRUCTURAL MOTIFS》。 在本文中&#xff0c;作者提出了一个基于片段的分子生成网络&#xff0c;FLAG &#xff08;Fragment …

STM32 多功能按键中断

key1 开关实现led1亮灭,key2开关实现蜂鸣器开关,key3开关实现风扇开关 main.c #include "uart.h" #include "key_it.h" #include "led.h" int main() {char c;char *s;uart4_init();//串口初始化all_led_init();key_it_config();fengshan_init…

2023年中国脱皮芝麻生产工艺、产量及消费量分析[图]

白芝麻在一般的油脂生产中是不脱皮的&#xff0c;但是直接食用时最好进行脱皮处理。原因在于芝麻种皮或角质层中纤维和草酸盐含量&#xff08;2%~3%草酸钙螯合物&#xff09;较高&#xff0c;使得其油和粕不能作为人类的蛋白质资源&#xff0c;只能用作牛的饲料或肥料。因此&am…

MarkDown制作思维导图

MarkDown制作思维导图 很实用的markdown转xmind思维导图教程 1、markdown导出OPML文件 &#x1f4a1; Typora 导出&#xff0c;需要安装 Pandoc&#xff0c;安装后重启电脑即可导出 2、xmind选择导入OPML格式 &#x1f4a1; 思维导图markdown的标题生成&#xff0c;因此可能要…

【嵌入式】堆栈与单片机内存

堆栈 在片内RAM中&#xff0c;常常要指定一个专门的区域来存放某些特别的数据 它遵循顺序存取和后进先出(LIFO/FILO)的原则&#xff0c;这个RAM区叫堆栈。 其实堆栈就是单片机中的一些存储单元&#xff0c;这些存储单元被指定保存一些特殊信息&#xff0c;比如地址&#xff0…

自动驾驶学习笔记(三)——场景设计

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《2023星火培训【感知专项营】》免费课程—>传送门 文章目录 前言 场景设计平台 场景地图 场景基本…

颠覆出海营销,机器学习带来买量新变化

这几年出海营销的神话都是机器学习给的&#xff1a; 机器学习显著降低CPI、机器学习大幅提高下载量、机器学习低成本撬动大流量... 此前&#xff0c;用户增长每一步都高度依赖营销人员的运营经验&#xff1b;现在&#xff0c;机器学习正在完全颠覆买量模式拓展营销格局&#…

【线下沙龙】低成本高效率构建您的业务系统

全球企业都在向数字化迈进&#xff0c;但在各类行业调查中表明&#xff0c;只有不到20&#xff05;的前沿企业通过其数字化转型而获得了成功&#xff0c;大部分企业都将高昂的时间和成本花费在了数字化技术的实施和培训上面。很多企业在转型的过程中面临着众多挑战&#xff1a;…

pycharm中快速对比两个.py文件

在学习一个算法的时候&#xff0c;就想着自己再敲一遍代码&#xff0c;结果最后出现了一个莫名其妙的错误&#xff0c;想跟源文件对比一下到底是在哪除了错&#xff0c;之前我都是大致定位一个一个对比&#xff0c;想起来matlab可以快速查找出两个脚本文件(.m文件)的区别&#…

基于深度学习的“语义通信编解码技术”框架分类

目录 基于神经网络的语义提取基于神经网络的语义信源编码基于神经网络的语义信源信道联合编码基于神经网络的语义编码与数字调制联合设计参考文献 基于神经网络的语义提取 在现有的信源编码前端加上一个语义提取神经网络[53] &#xff0c;如图所示。语义提取神经网络的输入是原…

linux 安装python django pip 遇到的问题

Python解决SSL不可用问题 解决方案&#xff1a; 首先要明白python版本需要和openssl的版本需要相对匹配的&#xff0c;在Python3.7之后的版本&#xff0c;依赖的openssl&#xff0c;必须要是1.1或者1.0.2之后的版本&#xff0c;或者安装了2.6.4之后的libressl&#xff0c;linux…

使用AIGC快速涨粉

1、newbing 2、输入提示词&#xff1a; 我想拍一个抖音短视频&#xff0c;请帮我选题&#xff0c;要求吸引人的 3、根据他的回答&#xff0c;选中一个有代表性的。 请产生《我用抖音教你如何做出超级美味的巧克力蛋糕&#xff0c;只需要三分钟&#xff0c;简单又好吃》的脚本 …

MobaXterm使sftp目录与cmd目录同步

MobaXterm使sftp目录与cmd目录同步 创建session时在ssh菜单栏中选择Advanced SSH settings其中SSH-browser type 选择SCP&#xff08;enhanced speed&#xff09; 勾选Follow SSH path