学习开发一个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,有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,1li x7,-2add x5,x6,x7
stopj 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.mzph.cn/news/108993.shtml

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

相关文章

利用服务器打造创新的在线社区

在这个数字化时代&#xff0c;服务器是实现创意项目的关键工具之一。虽然有许多用途&#xff0c;但其中最引人注目的是将服务器用于构建创新的在线社区。 为什么选择在线社区&#xff1f; 在线社区是连接人们、促进互动和分享知识的强大工具。它们可以围绕共同的兴趣、目标或…

AFL安全漏洞挖掘

安全之安全(security)博客目录导读 ATF(TF-A)/OPTEE之FUZZ安全漏洞挖掘汇总 目录 一、AFL简介 二、AFL的安装 三、代码示例及种子语料库 四、AFL插桩编译 五、AFL运行及测试 六、AFL结果分析 一、AFL简介 模糊测试&#xff08;Fuzzing&#xff09;技术作为漏洞挖掘最有…

【算法 | 模拟No.2】leetcode495. 提莫攻击

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【Leetcode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

软设上午题错题知识点3

软设上午题错题知识点3 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务是原子的&#xff0c;要么做&#xff0c;要么都不做。一致性&#xff08;Consistency&#xff09;&#xff1a;事务执行的结果必须保证数据库从一个一致性状态变到另一个一致性状态。隔离性隔离…

Go项目踩坑:go get下载超时,goFrame框架下的go项目里将vue项目的dist同步打包发布,go项目打包并压缩

Go项目踩坑&#xff1a;go get下载超时&#xff0c;goFrame框架下的go项目里将vue项目的dist同步打包发布&#xff0c;go项目打包并压缩 go get下载超时goFrame打包静态资源vue项目打包gf pack生成go文件 静态资源使用打包发布go项目交叉编译&#xff0c;省略一些不必要的信息通…

简述常见HTTP状态码分类?

有时候我们在访问一些网站的时候会经常看到一些网站有报错情况,同时在浏览器中会显示某些错误代码,很多人并不清楚这些错误代码代表的是什么意思。今天收集整理一下目前浏览器中常见的HTTP状态码以备查阅了解。 HTTP状态码概念 当浏览者访问一个网页时,浏览者的浏览器会向网…

基于闪电连接过程优化的BP神经网络(分类应用) - 附代码

基于闪电连接过程优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于闪电连接过程优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.闪电连接过程优化BP神经网络3.1 BP神经网络参数设置3.2 闪电连接过程算…

超越平凡:Topaz Photo AI for Mac带您领略人工智能降噪的魅力

在这个充满噪点和高频信息的时代&#xff0c;照片和视频的降噪成为了一个重要而迫切的需求。Mac用户现在有了一个强大的新工具——Topaz Photo AI for Mac&#xff0c;这是一款利用人工智能技术进行降噪和优化的软件。通过这款软件&#xff0c;您可以轻松地改善图像质量&#x…

Ps:变形

Ps菜单&#xff1a;编辑/变换/变形 Edit/Transform/Warp 变形 Warp是自由变换的一种模式&#xff0c;不仅可以用于物体的伸缩扭曲&#xff0c;也可用于人体的局部塑形。 除了从菜单打开&#xff0c;通常情况下&#xff0c;按 Ctrl T 进入自由变换&#xff0c;然后在画面上右击…

分享一份适合练手的软件测试实战项目

最近&#xff0c;不少读者托我找一个能实际练手的测试项目。开始&#xff0c;我觉得这是很简单的一件事&#xff0c;但当我付诸行动时&#xff0c;却发现&#xff0c;要找到一个对新手友好的练手项目&#xff0c;着实困难。 我翻了不下一百个web网页&#xff0c;包括之前推荐练…

模拟实现strncat函数

我们先了解一下这个函数 1.假如arr2有5个数&#xff0c;我们想追加3个数&#xff0c;它会在arr \0 开始追加3个数&#xff0c;追加完之后自动加上\0 2.假如arr2有3个数&#xff0c;我们想追加5个数&#xff0c; 它只会追加3个&#xff0c;然后自动加上\0 char* my_strncat(c…

单目3D自动标注

这里介绍两种 1. 基于SAM的点云标注 Seal&#xff1a;是一个多功能的自监督学习框架&#xff0c;能够通过利用视觉基础模型的现成知识和2D-3D的时空约束分割自动驾驶数据集点云 Scalability&#xff1a;可拓展性强&#xff0c;视觉基础模型蒸馏到点云中&#xff0c;避免2D和…

Chrome浏览器 键盘快捷键整理

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 〇、前言一、常用快捷键二、分类型快捷键表&#xff08;…

RecyclerView 数据更新方法 notifyItemChanged/notifyItemInsert/notifyIteRemoved

RecyclerView 数据更新方法 notifyItemChanged/notifyItemInsert/notifyIteRemoved notifyItemInsertednotifyItemRemovednotifyItemChanged notifyItemInserted java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHol…

Spring Boot的循环依赖问题

目录 1.循环依赖的概念 2.解决循环依赖的方法 1.构造器方法注入&#xff1a; 2.Lazy注解 3.DependsOn注解 1.循环依赖的概念 两个或多个bean之间互相依赖&#xff0c;形成循环&#xff0c;此时&#xff0c;Spring容器无法确定先实例化哪个bean&#xff0c;导致循环依赖的…

算法-堆/归并排序-排序链表

算法-堆/归并排序-排序链表 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/sort-list/description/?envTypestudy-plan-v2&envIdtop-interview-150 1.2 题目描述 2 优先级队列构建大顶堆 2.1 思路 优先级队列构建小顶堆链表所有元素放入小顶堆依次取出堆顶…

阿里云新加坡主机服务器选择

阿里云新加坡主机有哪些选择&#xff1f;可以选择云服务器ECS或轻量应用服务器&#xff0c;都有新加坡地域可以选择&#xff0c;东南亚地区可以选择新加坡、韩国首尔、日本东京等地域&#xff0c;阿里云新加坡主机测试IP地址&#xff1a;161.117.118.93 可以测试下本地到新加坡…

容斥原理简述

文章目录 1. 问题引入2. 公式3. 证明参考 1. 问题引入 主要用来解决集合的计数问题。 最常见的应用题&#xff0c;A活动多少人&#xff0c;B活动多少人&#xff0c;AB两活动多少人之类的。 两三个集合的时候还能画图进行识别&#xff0c;三个以上的集合则看不太出来了。 2.…

jvm调优 和实际案例

JVM&#xff08;Java Virtual Machine&#xff09;调优是优化Java应用程序性能的关键部分&#xff0c;它可以帮助你有效地管理内存、垃圾收集、线程和类加载等方面的资源。在进行JVM调优时&#xff0c;通常需要考虑以下几个方面&#xff1a; 堆内存调优&#xff1a; 调整堆内存…

30W网络对讲广播一体音柱

SV-7042T 30W网络对讲广播一体音柱 一、描述 SV-7042T是深圳锐科达电子有限公司的一款壁挂式网络有源音柱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;其采用防水设计&#xff0c;功率可以从20W到40W。SV-7042T作为网…