RiscV汇编基础学习

news2024/11/17 21:33:02

文章目录

    • 一、基础概念
        • 指令集---指示计算机执行某种操作的命令,是计算机运行的最小功能单位。
        • 复杂指令集CISC(如x86)和精简指令集RISC(如arm、riscV)---两种指令集的优化设计方向
        • RiscV---一个基于精简指令集RISC原则的开源指令集架构ISA
    • 二、RiscV汇编指令集介绍
        • RiscV的基础指令与扩展指令分类
        • RiscV指令根据格式特点六种类型---R/I/S/B/U/J
        • RiscV的寄存器描述---32个通用寄存器和一个PC寄存器
        • 指令介绍1:算数运算---add/sub/addi/mul/div/rem
        • 指令介绍2:逻辑运算---and/andi/or/ori/xor/xori
        • 指令介绍3:位移运算---sll/slli/srl/srli/sra/srai
        • 指令介绍4:数据传输---lb/lh/lw/lbu/lhu/lwu/sb/sh/sw
        • 指令介绍5:比较指令---slt/slti/sltu/sltiu
        • 指令介绍6:条件分支指令---beq/bne/blt/bge
        • 指令介绍7:无条件跳转指令---j/jal/jalr
    • 参考

一、基础概念

指令集—指示计算机执行某种操作的命令,是计算机运行的最小功能单位。

指令集:CPU中用来计算和控制计算机系统的一套指令的集合,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。而指令集的先进与否,也关系到CPU的性能发挥,它也是CPU性能体现的一个重要标志
常见指令集,Intel有x86,x86-64,MMX,SSE等 和针对64位桌面处理器的EM-64T。AMD主要是3D-Now!指令集。

复杂指令集CISC(如x86)和精简指令集RISC(如arm、riscV)—两种指令集的优化设计方向

指令集一般分为两大体系结构,即复杂指令集CISC(Complex lnstruction Set Computer)和精简指令集RISC(Reduced Instruction Set Computer)。最初人们采用的优化方法是通过设置一些功能复杂的指令,把一些原来由软件实现的、常用的功能改用硬件的指令系统实现,以此来提高计算机的执行速度,这就是CISC,倾向于用一条复杂指令执行更多特定任务。另一种优化方法是在20世纪80年代才发展起来的,其基本思想是尽量简化计算机指令功能,只保留那些功能简单、能在一个节拍内执行完成的指令,而把较复杂的功能用一段子程序来实现,即RISC。

RiscV—一个基于精简指令集RISC原则的开源指令集架构ISA

RISC-V(读作“RISC-FIVE”)是基于精简指令集计算(RISC)原理建立的开放指令集架构(ISA),V表示为第五代RISC(精简指令集计算机),表示此前已经有四代RISC处理器原型芯片。每一代RISC处理器都是在同一人带领下完成,那就是加州大学伯克利分校的David A. Patterson教授。与大多数ISA相反,RISC-V ISA可以免费地用于所有希望的设备中,允许任何人设计、制造和销售RISC-V芯片和软件。
开源采用宽松的BSD协议,企业完全自由免费使用,同时也容许企业添加自有指令集拓展而不必开放共享以实现差异化发展。

二、RiscV汇编指令集介绍

RiscV的基础指令与扩展指令分类

RiscV的基础指令:根据寄存器位宽和地址空间不同,分为32、64、128位三种不同整数指令集(用I表示)。整数指令集包括算术、逻辑、分支、访存(访问内存)指令等,已经可以实现一个完整的软件栈
RiscV的扩展指令:一些CPU有更多的功能要求,如 M:乘除法、取模求余指令;F:单精度浮点指令;D:双精度浮点指令Q:四倍浮点指令;A:原子操作指令,例如常见的cas(compare and swap)指令;C:压缩指令,主要用于改善程序大小;
在这里插入图片描述

RiscV指令根据格式特点六种类型—R/I/S/B/U/J

RISC-V指令根据格式特点可以分为六种类型(Type):
R Type:用于寄存器——寄存器之间的操作 (Register)
I Type:短立即数及内存访问操作(Immediate)
S Type:用于内存store操作 (Store)
B Type:用于条件跳转操作 (Branch)
U Type:用于长立即数操作
J Type:用于无条件跳转操作 (Jump)
在这里插入图片描述
上图opcode表示指令操作码,通过这7位就知道这是一个什么指令;rs1、rs2、rd分别表示源寄存器1、2以及目的寄存器;imm代表立即数;funct3、funct7代表指令对应的功能,这在之后会讲。
在这里插入图片描述

RiscV的寄存器描述—32个通用寄存器和一个PC寄存器

RISC-V定义了32个通用寄存器和一个PC寄存器,32个通用寄存器如下:
在这里插入图片描述

指令介绍1:算数运算—add/sub/addi/mul/div/rem

add rd,rs1,rs2:将寄存器rs1与rs2的值相加并写入寄存器rd。
sub rd,rs1,rs2:将寄存器rs1与rs2的值相减并写入寄存器rd。
addi rd,rs1,imm:将寄存器rs1的值与立即数imm相加并存入寄存器rd。
mul rd,rs1,rs2:将寄存器rs1与rs2的值相乘并写入寄存器rd。
div rd,rs1,rs2:将寄存器rs1除以寄存器rs2的值,向零舍入并写入寄存器rd。
rem rd,rs1,rs2:将寄存器rs1模寄存器rs2的值并写入寄存器rd。

指令介绍2:逻辑运算—and/andi/or/ori/xor/xori

and rd,rs1,rs2:将寄存器rs1与rs2的值按位与并写入寄存器rd。
andi rd,rs1,imm:将寄存器rs1的值与立即数imm的值按位与并写入寄存器rd。
or rd,rs1,rs2:将寄存器rs1与rs2的值按位或并写入寄存器rd。
ori rd,rs1,imm:将寄存器rs1的值与立即数imm的值按位或并写入寄存器rd。
xor rd,rs1,rs2:将寄存器rs1与rs2的值按位异或并写入寄存器rd。
xori rd,rs1,imm:将寄存器rs1的值与立即数imm的值按位异或并写入寄存器rd。

指令介绍3:位移运算—sll/slli/srl/srli/sra/srai

sll rd,rs1,rs2:将寄存器rs1的值左移寄存器rs2的值这么多位,并写入寄存器rd。
slli rd,rs1,imm:将寄存器rs1的值左移立即数imm的值这么多位,并写入寄存器rd。
srl rd,rs1,rs2:将寄存器rs1的值逻辑右移寄存器rs2的值这么多位,并写入寄存器rd。
srli rd,rs1,imm:将寄存器rs1的值逻辑右移立即数imm的值这么多位,并写入寄存器rd。
sra rd,rs1,rs2:将寄存器rs1的值算数右移寄存器rs2的值这么多位,并写入寄存器rd。
srai rd,rs1,imm:将寄存器rs1的值算数右移立即数imm的值这么多位,并写入寄存器rd。

左移会在右边补0,逻辑右移会在最高位添0,算数右移在最高位添加符号位。

指令介绍4:数据传输—lb/lh/lw/lbu/lhu/lwu/sb/sh/sw

在RISC-V中1word=4Bytes=32bits。l是load的首字母,即加载数据;s是store的缩写,即存储数据。b,h,w分别是byte,half word,word的首字母,除此之外还有存取双字的d,即double word。

lb rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读一个字节,符号扩展后存入rd
lh rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读半个字,符号扩展后存入rd
lw rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读一个字,符号扩展后存入rd
lbu rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读一个无符号的字节,零扩展后存入rd
lhu rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读半个无符号的字,零扩展后存入rd
lwu rd,offset(rs1):从地址为寄存器rs1的值加offset的主存中读一个无符号的字,零扩展后存入rd
sb rs1,offset(rs2):把寄存器rs1的值存入地址为寄存器rs2的值加offset的主存中,保留最右端的8位
sh rs1,offset(rs2):把寄存器rs1的值存入地址为寄存器rs2的值加offset的主存中,保留最右端的16位
sw rs1,offset(rs2):把寄存器rs1的值存入地址为寄存器rs2的值加offset的主存中,保留最右端的32位

指令介绍5:比较指令—slt/slti/sltu/sltiu

有符号数:
slt rd,rs1,rs2:若rs1的值小于rs1的值,rd置为1,否则置为0
slti rd,rs1,imm:若rs1的值小于立即数imm,rd置为1,否则置为0
无符号数:
sltu rd,rs1,rs2:若rs1的值小于rs1的值,rd置为1,否则置为0
sltiu rd,rs1,imm:若rs1的值小于立即数imm,rd置为1,否则置为0

指令介绍6:条件分支指令—beq/bne/blt/bge

beq rs1,rs2,lable:若rs1的值等于rs2的值,程序跳转到lable处继续执行
bne rs1,rs2,lable:若rs1的值不等于rs2的值,程序跳转到lable处继续执行
blt rs1,rs2,lable:若rs1的值小于rs2的值,程序跳转到lable处继续执行
bge rs1,rs2,lable:若rs1的值大于等于rs2的值,程序跳转到lable处继续执行

指令介绍7:无条件跳转指令—j/jal/jalr

j label:程序直接跳转到lable处继续执行
jal rd,label:用于调用函数,把下一条指令的地址保存在rd中(通常用x1),然后跳转到label处继续执行
jalr rd,offset(rs):可用于函数返回,把下一条指令的地址存到rd中,然后跳转到rs+offset地址处的指令继续执行。若rd=x0就是单纯的跳转(x0不能被修改)

参考

risc-v 指令集手册:https://max.book118.com/html/2022/0614/5200103013004242.shtm
循序渐进,学习开发一个RISC-V上的操作系统 - 汪辰:https://www.bilibili.com/video/BV1Q5411w7z5/?spm_id_from=333.788.recommend_more_video.0&vd_source=e5379ad2570e86814925715ab989c6fb
riscv相关github:https://github.com/riscv/riscv-isa-manual
计基2—RISCV指令集介绍与汇编:https://blog.csdn.net/ll15982534415/article/details/126574495

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

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

相关文章

SQL注入渗透与攻防(七)之查询方式及报错注入

目录 SQL注入之查询方式 select 查询数据 delete 删除数据 insert 插入数据 update 更新数据 SQL注入 报错盲注 1.基于布尔的SQL盲注 - 逻辑判断 2.基于时间的SQL盲注 - 延时判断 3.基于报错的SQL盲注 - 报错回显(强制性报错 ) 案列演示 SQL注入…

移动设备的自动化测试工具,如何选型?

一、问题的提出 最近二两年来,一直在从事移动设备的自动化测试工作,可以说小有心得。但最近由于种种原因,面临着对移动设备的自动化测试工具的更换工作。所以,一个问题呈现在面前。我们需要为我们的项目选出一款新的自动化测试工…

最长上升子序列

基于最长上升子序列 LIS 求最长上升子序列有两种做法求最长上升子序列有两种做法求最长上升子序列有两种做法 一种是n2复杂度的线性dp一种是n^2复杂度的线性dp一种是n2复杂度的线性dp 另一种是O(nlogn)复杂度的贪心二分另一种是O(nlogn)复杂度的贪心二分另一种是O(nlogn)复杂度…

看BP英文文献生词记录

看BP英文文献生词记录 总的来说,该论文是在讲CAT和SAR的后向后向投影之间的联系与区别 acoustic imaging 原声成像 polychromatic 美 [pɒlɪkroʊ’mtɪk] 英 [pɒlɪkrəʊ’mtɪk] adj.多色的 illumination 美 [ɪˌlumɪˈneɪʃ(ə)n] 英 [ɪˌluːmɪˈne…

我国牛血清行业现状:FBS是最常用血清添加剂 但目前市场亟需规范化

根据观研报告网发布的《中国牛血清行业现状深度研究与投资前景分析报告(2022-2029年)》显示,牛血清是血清的一种,是一种浅黄色澄清、无溶血、无异物稍粘稠液体,内含有各种血浆蛋白、多肽、脂肪、碳水化合物、生长因子、…

15. 使用stunnel加密tcp数据传输

主题:使用stunnel加密隧道对tcp数据进行加密传输。 开发环境: 客户端: stunnel5 Win10服务端: stunnel5 Ununtu18.04(虚拟机) Qt5.9.9对于stunnel,前面博客有所提及,有兴趣可以自行观看,…

javaSE(包、封装、static用法、代码块)

1.包 (文件夹) 为了更好的管理类,把多个类收集在一起成为一组,称为软件包。 在Java中也引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一…

【细读JS忍者秘籍】深入生成器函数的底层原理

深入生成器函数的底层原理 分析执行上下文 生成器函数本质上还是一个_函数_,所以它的执行离不开 执行上下文 function* generator() {console.log("status1");yield "hello";console.log("status2");yield "world";}let…

Web入门开发【七】- 运行原理

欢迎来到霍大侠的小院,我们来学习Web入门开发的系列课程。 首先我们来了解下这个课程能学到什么? 1、你将可以掌握Web网站的开发全过程。 2、了解基础的HTML,CSS,JavaScript语言。 3、开发自己的第一个网站。 4、认识很多对编…

学到羊之Kafka

1 kafka 是啥 Kafka 是一款开源的消息引擎系统,用来实现解耦的异步式数据传递。即系统 A 发消息给到 消息引擎系统,系统 B 通过消息引擎系统读取 A 发送的消息,在大数据场景下,能达到削峰填谷的效果。 2 Kafka 术语 Kafka 中的分…

性能测试要学习哪些知识?全在这里了

基础:   完整的性能测试流程     需求-计划-方案-环境搭建-用例设计-数据准备-场景设计-脚本开发-脚本执行-结果分析-问题反馈-性能调优-结果报告   性能指标     TPS,QPS,RPS,HPS,RT,VU&#…

【Pandas入门教程】在Pandas中如何创建plots

在Pandas中如何创建plots 来源:Pandas官网:https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html 文章目录在Pandas中如何创建plots导包数据集准备【小结】导包 import pandas as pd import matplotlib.pyplot as plt数据集准备…

力扣(LeetCode)200. 岛屿数量(C++)

深度优先遍历 求连通块数量。可以遍历所有格子,当格子是岛屿,对岛屿深度优先遍历,找到整个岛,并且将遍历的岛屿标记,以免重复遍历,或递归死循环。标记可以使用状态数组,也可以修改格子的值。本…

SQL注入渗透与攻防(十)之加解密注入和堆叠注入

目录 SQL注入之加解密注入 案列演示 SQL注入之堆叠注入 案列演示 SQL注入之加解密注入 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。 案列演示 这里我们拿sql-libs的第二十一关来进行演…

学习TrustZone可以参考的资料

最近看到了一篇学习资料分享的,感觉可以转过来做个记录,除去前辈分享的资料以外,我还觉得ATF的源码里面的DOC目录下的资料也是很不错的,起码可以让你对BL31有个比较不错的认识。当然那个有点太细节了。 最近看PSA安全技术交流微信…

30多岁想转行,零基础学编程,来得及吗?

“30多岁想转行,零基础学编程,来得及吗?能找到好工作吗?”这类问题,总是反复出现。尤其是最近我受《自学是门手艺》鼓舞,也借着参与 xue.cn 的契机想要把 python 学的全面而完整,也总有朋友找我…

从工地打工,到狂揽10个大厂offer、副业赚100万:培训班出来的程序员是怎么做到的?

七年前我 985 毕业却沦落到工地打工,七年后我已经收到了 10 个大厂 offer 。 你好,我是吴师兄,一位曾经的学霸毕业只能去工地,而如今大厂 offer 拿到手软,Github 全球 TOP100 算法仓库创作者,公众号五分钟…

eclipse和sts安装lombok

eclipse和sts安装lombok 说明 sts 是 eclipse集成springboot的开发环境 所以 sts 和 eclipse 安装 lombok 步骤基本一样 参考网址: https://blog.csdn.net/qq_39826207/article/details/119007580?ops_request_misc%257B%2522request%255Fid%2522%253A%252216708973141680…

算法day57|647,516

目录 647. 回文子串 516.最长回文子序列 动态规划总结篇 647. 回文子串 dp数组的定义 dp[i][j]代表的是区间[i,j]的字串是否为回文字符,如果dp[i][j]为true,否则为false 递推公式 如果s[i]和s[j]相等的话 1.ij 为同一个字符,dp[i][j] True 2 i与j相差1…

Kafka大厂高频面试题:在保证高性能、高吞吐的同时保证高可用性

Kafka的消息传输保障机制非常直观。当producer向broker发送消息时,一旦这条消息被commit,由于副本机制(replication)的存在,它就不会丢失。但是如果producer发送数据给broker后,遇到的网络问题而造成通信中…