首页 > 编程语言 >RSIC-V常用汇编语言及常用数据结构-栈

RSIC-V常用汇编语言及常用数据结构-栈

时间:2024-08-31 17:25:48浏览次数:15  
标签:常用 字节 汇编语言 地址 指令 RSIC 寄存器 x2 x1

这是我在上完浙大刘鹏老师的视频课后做的笔记。我觉得在学完后,自己写出来会记忆会更深刻,因为要重新梳理一遍。同时遇到不会的还可以重新复习以前的知识。

程序执行流程:

高级语言->汇编语言->逻辑块->数字电路

常用汇编语言:

1.算数指令和访存指令

在汇编语言里面,操作对象是寄存器,而不是高级语言的变量。在RSIC-V里只有32位的32个寄存器,当然也有64位的未来也会有128位的,这里用32 位的。32个寄存器分别命名为x0-x31。不同于高级语言先定义在使用,汇编语言不用定义。但是由于寄存器数量少,所以要从存储器里面加载。在RSIC-V存储系统中,是按照字节为单位来进行寻址的,其中每个字节可以拆分为4个字节大小。在小端系统里,某个字的地址与它最低位字节地址相同,这是因为不大。同时在存储器中存储顺序有大端和小端两种方式,大端是将一个字数据最低位字节存储在最高位字节地址上。小端相反,我国用大端。命令:

按字:

lw(load word)

eg:lw x10,12(x15)#注释符是#,这句表示将从保存在x15的地址上偏移12字节的数据加载到x10寄存器里

sw(store word)

sw x10,12(x15)#把x10的数据加载到保存在x15的地址上偏移12字节的字节上。

按字节(格式与按字指令一样,只针对一字节的数据):

lb(load byte)将字节地址中的1字节数据符号扩展后转载到对应寄存器中(符号扩展,将最高位扩展到其它位)

sb(store byte)将寄存器中最低字节位的1字节数据保存到对应字节地址中

把数据加载到寄存器里面,下面是算法指令:

add eg:add x1,x2,x3#把x2和x3里面的值加起来存到x1

sub 减法,格式和add一样

立即数操作:

addi和add格式一样,没有立即数减法。

2.条件判断分支转移指令

实现条件语句类似的作用。

条件判断分支转移指令:

beq:  beq x1,x2,l1#如果x1和x2相等,跳到l1标志符的指令地址空间继续执行指令。不等顺序执行下面的语句

bne:与beq相反,相等执行下面的语句,不等跳到别的状态。

blt:小于号,格式相同

bge:大于号格式相同

无条件分支转移指令:jump(j)

j加标识符,可以直接跳到标识符的指令目标地址

3.逻辑运算指令

都是按位有and(掩码),or,xor,没有逻辑非,逻辑非的实现是使用xor(异或),与0x1111-1111异或即可得到逻辑非

有两种:寄存器型

and x1,x2,x3#x1=x2&x3

立即数

and x1,x2,3#x1=x2&3

移位:

逻辑移位:寄存器型和立即数型

sll(shift left logical):左移,低位补零

slli

slli x1,x2,2#x1=x2<<2

srl:右移,高位补零

srli

算数移位(shift right arithmetic)右移:

sra:右移后空出的高位由原数最高比特位符号扩展得到,格式一样的

srai:

4.函数调用

rsicv里面寄存器的别称。
x1 (通常称为  ra ):返回地址寄存器,用于存储函数调用后的返回地址。
x2 (通常称为  sp ):栈指针,指向栈顶,用于管理栈内存。
x3 (通常称为  gp ):全局指针,用于访问静态数据区域。
x4  -  x7 :临时寄存器,可在函数调用中用于保存临时值或局部变量。
x8 (通常称为  tp ):线程指针,用于多线程环境。

x8-x9:s0和s1,x18~x27对应s2~s11,用来保存原进程中的关键数据,避免在函数调用的过程里被破坏。
x10  -  x17 :(a0-a7)被调用者保存寄存器,函数调用时被调用者负责保存这些寄存器的值用来传递参数,a0和a1常用来传递返回值。
 x28  -  x31 :保留寄存器,具体用途取决于特定的实现或应用。

指令大小为四个字节。在程序顺序执行时,在调用后要返回源代码的下一行,所以在调用前先把下一行代码所在的地址保存在ra寄存器里面,当调用完毕后,再用jr ra命令返回之前的代码位置。

jr指令:可以跳转到寄存器所对应的地址空间,用这条指令来实现函数的返回。可以用ret来取代jr ra的操作。

伪指令:mv rd,rs=addi rd,rs,0

li rd,13=addi rd,x0,13

5.栈的使用

在讲这部分前先复习一下栈;

栈:限定在仅在表尾进行插入或者删除的线性表。表尾是栈顶,表头是栈低。是后入先出的线性表(last in first out ,LIFO结构)

顺序栈:初始化时一般不限定大小,后面空间不够时,再加。栈底和栈顶相等时为空栈,插入新的栈顶元素,栈顶加一,删除减一,所以非空栈的栈顶指针一直在下一个元素上。图示为c语言下栈的一些操作。

 现在来看栈的使用,当使用寄存器时,调用前可能里面也保存了一些值,为了还原,需要将它保存在栈里面,栈也是存储器的一部分,需要以后指向它的寄存器来保存它的基地址(sp)。函数调用中保存的数据是按照一定顺序组织在一起的,这种组织结构称之为栈帧包括局部变量等等。

标签:常用,字节,汇编语言,地址,指令,RSIC,寄存器,x2,x1
From: https://blog.csdn.net/m0_74812776/article/details/141751043

相关文章

  • 前端宝典二十三:Array最常用的34个方法
    这里列举了Array最常用的34个方法其中静态方法两个、实例方法32个,对他们进行了分类比较,有助于更好的掌握。一、前言:手写一个深拷贝以下是一个用JavaScript手写的深拷贝方法,考虑了正则表达式、日期对象、数组和普通对象:functiondeepCopy(obj){if(obj===null......
  • linux常用命令
    Linux下要获取命令的使用帮助,可有以下几种方法:一、通过help命令二、man命令查询手册(manual)三、info命令获取在下文档帮助ls显示目录中内容,包括子目录和文件相关属性信息ls-l:显示详细信息ls-a:显示子目录和文件,包括"."开头的隐藏目录和隐藏文件ls-A:不显示包括"."开......
  • 在HTML中Form标签中常用的属性
    一.target属性:窗口的打开方式    1._self:在原窗口打开<div><ahref="https://www.baidu.com/"target="_self">点击跳转到百度</a></div>这是它运行的结果:点击图中的文字就会实现跳转并在原窗口打开 2. _blank:打开一个新的窗口<div>......
  • js 数组的常用方法:在头部插入,删除,尾部插入,删除
    arr.push(value),在数组的末尾添加一个或多个元素,并返回数组的新长度。arr.pop()删除索引值最大的元素,即删除数组末尾的元素,并返回被删除的元素。unshift(value)在数组的头部添加一个或多个元素,并返回数组的新长度shift()删除索引为0的元素,并返回删除的元素splice()方法会修......
  • 常用背包dp模板(未完待续)
    部分板子优化中...你好哇,我是flypig114代码里有各部分及变量数组的注释,so...不多废话,直接上正题!01背包无优化#include<bits/stdc++.h>usingnamespacestd;#definellint//为了方便修改类型constllN=1000;//辅助定义数组lln,m;//n是背包容量m是物品数量llv[N],......
  • 最常用集合 - arraylist详解
    ArrayList介绍ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器......
  • 常用的 Redis 配置命令
    Redis的配置文件(通常是redis.conf)包含了许多配置选项,可以用来调整Redis服务器的行为。以下是一些常用的Redis配置命令及其详解:bind描述:指定Redis监听的IP地址。示例:bind127.0.0.1解释:只允许从本地机器访问Redis实例。port描述:指定Redis监听的端口......
  • 【GaussDB】分布式性能分析常用的SQL
    --查看连接数selectcoorname,usename,application_name,substr(query,1,50)asquery,statefrompgxc_stat_activitywherestate='active'andusename='xxx';selectcoorname,count()frompgxc_stat_activitywhereusename='cbsprd'groupb......
  • Linux常用命令练习二
    目录练习一练习二练习三练习一1.在用户的家目录下创建目录文件dir1和普通文件file12.在家目录下给dir1目录嵌套创建dir1/dir2/dir3/dir4/dir53.在家目录下直接一步进入到dir4里面4.在dir4目录中将家目录下的file1移动到上一级的dir3中5.在dir4目录下创建一......
  • react常用 Hooks
    ReactHooks是React16.8引入的一项功能,它允许你在函数组件中使用状态和其他React特性,而不需要编写类组件。Hooks使函数组件可以管理本地状态、处理副作用、使用上下文等,使得函数组件更加强大和灵活。以下是常用的ReactHooks及其使用方法:useStateimportReact,{us......