从头开发一个RISC-V的操作系统(五)汇编语言编程

news2025/1/22 13:13:46

文章目录

  • 前提
  • RISC-V汇编语言入门
  • RISC-V汇编指令总览
    • 汇编指令操作对象
    • 汇编指令编码格式
    • add指令介绍
    • 无符号数
  • 练习
  • 参考链接

目标:通过这一个系列课程的学习,开发出一个简易的在RISC-V指令集架构上运行的操作系统。

前提

这个系列的大部分文章和知识来自于:[完结] 循序渐进,学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春,以及相关的github地址。

在这个过程中,这个系列相当于是我的学习笔记,做个记录。

RISC-V汇编语言入门

能手写汇编代码的,在我的心目中,都是巨佬。只有明白底层硬件的人,才有可能去写汇编。

一个完整的RISC-V汇编程序有多条语句(statement)组成。一个典型的RISC-V汇编语句由3部分组成:
[label:] [operation] [comment]

  • label:任何以冒号结尾的标识符都被认为是一个标号。
  • operation可以有多种类型
    • instruction:直接对应二进制机器指令的字符串
    • pseudo-instruction:为了提高编写代码的效率,可以用一条伪指令指示汇编器产生多条实际的指令
    • directive:通过类似指令的形式(以.开头),通知汇编器如何控制代码的产生,不对应具体的指令
    • macro:采用.macro/.endm自定义的宏
  • comment:注释,以#开始到当前行结束

RISC-V汇编指令总览

汇编指令操作对象

寄存器:在这个系列中,我们只有32个通用寄存器,x0~x31,这个在之前我们已经展示过了。在RISC-V中,Hart在执行算数逻辑运算时所操作的数据必须直接来自寄存器。

内存:Hart可以执行在寄存器和内存之间的数据读写操作;读写操作使用字节位基本单位进行寻址;RV32最多可以访问 2 32 2^{32} 232个字节的内存空间。

汇编指令编码格式

在这里插入图片描述
RV32由6种指令编码格式。每一条指令有32bits,funct7/funct3和opcode一起决定最终的指令类型。指令在内存中按照小端序排列。rs2,rs1,rd都是指的是寄存器(register),imm指的是立即数。
大端序:高字节存放在内存的低地址;小端序:低字节存放在内存的低地址。
下面这张表指出了opcode是如何与指令对应的。
在这里插入图片描述
opcode总共7bits,第0和第1位都是11,第2到第四位和第5到第6位不同,则代表着指令类型不同,使用addsub指令举例。
在这里插入图片描述
先看opcode0110011在表中对应着OP,add和sub都应该属于OP,然后funct3也相同,但是funct7不同,代表着它们一个是add,一个是sub。

这里介绍的只是一个概貌,更多信息还要自己学习。

add指令介绍

在这里插入图片描述
通过上面的图片就可以明白一条汇编指令是如何到二进制代码的。同时这一块视频中也有详细地讲解。

无符号数

我们知道有符号数在计算机中都是使用二进制补码的形式保存的,最高位为符号位,0代表正数,1代表负数。正数的补码不变,负数的补码=反码+1。

练习

这里我们带大家做一个add2的练习。
汇编源码为:

# Add
# Format:
#	ADD RD, RS1, RS2
# Description:
#	The contents of RS1 is added to the contents of RS2 and the result is 
#	placed in RD.

	.text			# Define beginning of text section
	.global	_start		# Define entry _start

_start:
	li x6, 1		# x6 = 1
	li x7, -2		# x7 = -2
	add x5, x6, x7		# x5 = x6 + x7

stop:
	j stop			# Infinite loop to stop execution

	.end			# End of file

make 以后,我们使用make code查看这个程序的二进制代码,然后逐行进行分析,如下:


test.elf:     file format elf32-littleriscv


Disassembly of section .text:

80000000 <_start>:

	.text			# Define beginning of text section
	.global	_start		# Define entry _start

_start:
	li x6, 1		# x6 = 1
80000000:	00100313          	li	t1,1
	li x7, -2		# x7 = -2
80000004:	ffe00393          	li	t2,-2
	add x5, x6, x7		# x5 = x6 + x7
80000008:	007302b3          	add	t0,t1,t2

8000000c <stop>:

stop:
	j stop			# Infinite loop to stop execution
8000000c:	0000006f          	j	8000000c <stop>

其他都没什么好说的,主要就是这个li指令以及add这个指令。add x5,x6,x7这个我们在上面展示过了,这里主要解释下li这个伪指令。
在这里插入图片描述
这里我们先从其他博客那里拿过来一个结论,
在这里插入图片描述

li伪指令把一个立即数imm加载到rd寄存器中。当imm在 [ − 2 11 , 2 11 − 1 ] [-2^{11} , 2^{11-1}] [211,2111]范围内(也就是[-2048~2047))的时候,li被转化成下面这条实际指令:

addi rd, x0,imm #rd=imm+0
x0是一个特殊的寄存器,值为0且永远不会改变

所以add x7, x0, -2 对应的二进制为:111111111110 00000 000 00111 0010011,前面的111111111110代表了-2,它是以二进制补码存储的;00000代表了寄存器x0,000是funct,00111代表了寄存器x7,最后的0010011则是opcode。和我们输出的hex一样。

那么当立即数imm不在这个范围,但在32位有符号数的范围内(也就是[-2147482648~-2048)以及(+2047~+2147482647])的时候,一条addi指令显然是不够了。 这时候就需要lui指令。

假设我们有这样的一条语句add x7, -3000,那么它对应的二进制是多少呢?先看它的二进制,如下图:
在这里插入图片描述
在立即数为-3000的情况下,一条li伪指令被分为了两条汇编指令luiaddiaddi我们已经在上面介绍过了,下面给出lui指令的说明。
在这里插入图片描述
看这个似乎有点懵,我们直接说怎么将-3000写入到x7寄存器的。
-3000的32位二进制反码为1111 1111 1111 1111 1111 0100 0100 1000,先取第12到第31位(通过右移12位就可以得到第12到第31位),也就是1111 1111 1111 1111 1111共20位,构成lui这条指令1111 1111 1111 1111 1111 00111 0110111 = fffff3b7。对应的操作就是:将20位左移12位,并将低12位置0,写入到x7中。
再取-3000的第0到第11位0100 0100 1000加到x7寄存器中(x7 = x7 + imm[0:11]),对应的二进制指令就是0100 0100 1000 00111 000 00111 0010011 = 44838393,可以看到,和程序的结果一样。这样大家阶对li伪指令有了进一步的了解。

参考链接

  1. https://zhuanlan.zhihu.com/p/367085156

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

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

相关文章

python语言程序设计完结

概述&#xff1a; 程序设计是计算机可编程的体现 程序设计&#xff0c;亦称编程&#xff0c;是深度应用计算机的主要手段 程序设计已经成为当今社会需求量最大的职业技能之一 程序设计语言是一种用于交互&#xff08;交流&#xff09;的人造语言 程序设计语言&#xff0c;亦称…

论文阅读AI工具链

文献检索 可以利用智谱清言来生成合适的文献检索式&#xff0c;并根据需要不断调整。 谷歌学术 在Google Scholar中进行检索时&#xff0c;您可以使用类似的逻辑来构建您的搜索式&#xff0c;但是语法会有所不同。Google Scholar的搜索框接受普通的文本搜索&#xff0c;但是…

牛客NC93 设计LRU缓存结构【hard 链表,Map Java】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/5dfded165916435d9defb053c63f1e84 思路 双向链表map最新的数据放头结点&#xff0c;尾节点放最老的数据&#xff0c;没次移除尾巴节点本地考察链表的新增&#xff0c;删除&#xff0c;移动节点参考答案Java im…

启动Unity发布的exe并且添加启动参数

启动Unity发布的exe并且添加启动参数 在启动Unity的时候添加一些启动的参数。 代码解释 在启动的时候获取的启动参数如果没有获取到正确的启动参数那么就退出程序&#xff0c;这个代码仅仅在发布到windows之后才会生效&#xff0c;在编辑器下这个代码虽然会获取到参数但是不能…

python开发poc2,爆破脚本

#本课知识点和目的&#xff1a; ---协议模块使用&#xff0c;Request 爬虫技术&#xff0c;简易多线程技术&#xff0c;编码技术&#xff0c;Bypass 后门技术 下载ftp服务器模拟器 https://lcba.lanzouy.com/iAMePxl378h 随便创建一个账户&#xff0c;然后登录进去把ip改成…

多轴机械臂/正逆解/轨迹规划/机器人运动学/Matlab/DH法 学习记录01——数学基础

系列文章目录 本科毕设正在做多轴机械臂相关的内容&#xff0c;这里是一个学习机械臂运动学课程的相关记录。 如有任何问题&#xff0c;可发邮件至layraliufoxmail.com问询。 1. 数学基础 文章目录 系列文章目录一、空间位置、姿态描述二、旋转矩阵&#xff08;Rotation matri…

阿里Qwen1.5-32B开源,评测超Mixtral MoE,挑战SOTA性价比

前言 阿里巴巴近日震撼开源其最新力作——Qwen1.5-32B大语言模型。在当前AI领域&#xff0c;大模型的开发与应用已成为评估技术进步的重要标尺。Qwen1.5-32B的问世&#xff0c;不仅再次证明了阿里在AI技术研发领域的深厚实力&#xff0c;更是在性能与成本之间找到了一个新的平…

Linux云计算之Linux基础3——Linux系统基础2

1、终端 终端(terminal)&#xff1a;人和系统交互的必要设备&#xff0c;人机交互最后一个界面&#xff08;包含独立的输入输出设备&#xff09; 物理终端(console)&#xff1a;直接接入本机器的键盘设备和显示器虚拟终端(tty)&#xff1a;通过软件方式虚拟实现的终端。它可以…

计算机网络-文件传输及IP协议——沐雨先生

实验内容 编写请求文件的客户Java应用程序编写响应文件请求的服务器Java应用程序利用Wireshark查看和分析IP包 基本要求 使用Java语言建立请求文件的客户应用程序使用Java语言建立响应文件请求的服务器应用程序了解IP协议的工作过程了解IP包首部各字段及含义 对Java应用程序…

java理论小作业(2)--类

第一题 1.题目&#xff1a; 2.解析&#xff1a; 首先&#xff0c;我们来分析Hello1类的结构和给定代码的执行流程&#xff1a; Hello1类中有两个成员变量&#xff0c;一个静态的a和一个非静态的b。静态变量a属于类本身&#xff0c;而非静态变量b属于类的每一个实例&#xff…

MySQL-5.函数

5.1 统计函数&#xff08;聚合函数&#xff09; # 统计数学成绩大于 90 的学生有多少个&#xff1f; SELECT COUNT(*) FROM student WHERE math > 90;# 求一个班级总分平均分 SELECT AVG(math english chinese) FROM student;# 统计一个班级数学总成绩 SELECT SUM(math) F…

Windows系统C盘空间优化进阶:磁盘清理与Docker日志管理

Windows系统C盘空间优化进阶&#xff1a;磁盘清理与Docker日志管理 文章目录 Windows系统C盘空间优化进阶&#xff1a;磁盘清理与Docker日志管理磁盘清理工具 使用“运行”命令访问磁盘清理利用存储感知自动管理空间清理WinSxS文件夹结合手动清理策略 小结删除临时文件总结&…

JWT在单点登录系统中的应用

JSON Web Token&#xff08;JWT&#xff09;是一个非常轻巧的规范。这个规范允许使用JWT在用户和服务器之间传递安全可靠的信息。 来假想一下一个场景。在A用户关注了B用户的时候&#xff0c;系统发邮件给B用户&#xff0c;并且附有一个链接“点此关注A用户”。链接的地址可以…

XML HTTP传输 小结

what’s XML XML 指可扩展标记语言&#xff08;eXtensible Markup Language&#xff09;。 XML 被设计用来传输和存储数据&#xff0c;不用于表现和展示数据&#xff0c;HTML 则用来表现数据。 XML 是独立于软件和硬件的信息传输工具。 应该掌握的基础知识 HTMLJavaScript…

Elastic:加速生成式人工智能体验

作者&#xff1a;Matt Riley 搜索驱动的人工智能和开发人员工具专为速度和规模而打造。 在大型语言模型&#xff08;LLM&#xff09;和生成式 AI 的每日突破中&#xff0c;开发者站在了这场运动的最前沿&#xff0c;影响着它的方向和可能性。在这篇博客中&#xff0c;我将分享…

【研发管理】产品经理知识体系-数字化战略

导读: 数字化战略对于企业的长期发展具有重要意义。实施数字化战略需要企业从多个方面进行数字化转型和优化&#xff0c;以提高效率和创新能力&#xff0c;并实现长期竞争力和增长。 目录 1、定义 2、数字化战略必要性 3、数字战略框架 4、数字化转型对产品和服务设计的影响…

chrome 浏览器 有自带的自动字幕功能,支持英文,控制您的音乐、视频等媒体内容

chrome 浏览器 有自带的自动字幕功能&#xff0c;支持英文&#xff0c;控制您的音乐、视频等媒体内容

蚁剑修改特征性信息

前言 我们首先得知道蚁剑的流量特征&#xff1a; 编码器和解码器的特征&#xff1a;蚁剑自带的编码器和解码器具有明显的特点&#xff0c;可以通过更改配置文件来达到流量加密的目的1。例如&#xff0c;蚁剑支持多种编码方式&#xff0c;如base64、chr、rot13等&#xff0c;这…

C++中的inline用法

1. 引入inline关键字的原因 在c/c中&#xff0c;为了解决一些频繁调用的小函数大量消耗栈空间&#xff08;栈内存&#xff09;的问题&#xff0c;特别的引入了inline修饰符&#xff0c;表示为内联函数。 栈空间就是指放置程序的局部数据&#xff08;也就是函数内数据&#xf…

初识Java中的NIO

1.概述 Java NIO 全称java non-blocking IO &#xff0c;是指 JDK 提供的新 API。从 JDK1.4 开始&#xff0c;Java 提供了一系列改进的输入/输出新特性&#xff0c;被统称为 NIO(即 New IO)&#xff0c;是同步非阻塞的。NIO采用内存映射文件的方式来处理输入输出&#xff0c;NI…