首页 > 系统相关 >一起学RISC-V汇编第8讲之RISC-V寻址方式及内存访问方式

一起学RISC-V汇编第8讲之RISC-V寻址方式及内存访问方式

时间:2024-09-08 15:25:51浏览次数:11  
标签:RISC 寻址 指令 寄存器 rs1 内存

一起学RISC-V汇编第8讲之RISC-V寻址方式及内存访问方式

1 RISC-V的寻址方式

计算机常用的寻址方式有3种:

1.1 立即数寻址

指令中直接给出相应的操作数(立即数),比如RISC-V中的短立即数指令,因为操作码直接包含立即数中,所以立即数寻址对立即数的大小有限制,在RV32I指令集中,立即数一共12位,最大支持4096:

# 加立即数(算术指令), t0 = a0 + 1234,这里1234就是立即数寻址
addi t0, a0, 1234

1.2 寄存器寻址

指令中给出寄存器,操作数放在寄存器中,通常直接使用寄存器名表示它所保存的数据,即寄存器寻址。比如RISC-V的R-type指令:

# 加操作, a1 = s0 + s1,这里a1 s0 s1都是寄存器寻址,对于RV32I可寻址范围为32个通用寄存器
add a1, s1, s0

1.3 存储器寻址

数据保存到主存储器中,指令需要能够寻址到存储中的操作数。
访存指令唯一支持的寻址模式是将 12 位立即数符号扩展后与寄存器相加,即寄存器相对寻址。

  1. 寄存器相对寻址(基址寻址,RISC-V唯一支持的访存方式)

    数据地址为:寄存器址 + 偏移量,RISC-V支持寄存器相对寻址。

    # x[rd] = sext(M[x[rs1] + sext(offset)][31:0]),数据地址为x[rs1] + sext(offset)
    lw rd, offset(rs1)
    
  2. 寄存器间接寻址(可采用寄存器相对寻址模拟实现)

    寄存器存放的是数据的地址而非数据本身,RISC-V并不支持寄存器间接寻址,而是采用另一种形式来替代,RISC-V是利用寄存器相对寻址,将偏移量设为0,来实现寄存器间接寻址的功能的。

    # x[rd] = sext(M[x[rs1] + sext(0)][31:0]),数据地址为x[rs1] + sext(0)
    lw rd, 0(rs1)
    
  3. 直接寻址(RISC-V不支持)

    指令中给出操作数的有效地址,RISC-V不支持直接寻址,ARM同样不支持直接寻址,但X86提供这种寻址方式。

1.4 PC相对寻址

PC相对寻址表示地址为相对于PC的偏移,PC 相对寻址可用来支持位置无关代码,像RISC-V的分支跳转指令也都是相对寻址,如RISC-V的分支跳转指令:

# if (rs1 < rs2) pc += sext(offset)
blt rs1, rs2, offset

总结:

由上面分析可知,RISC-V支持4种寻址方式:立即数寻址、寄存器寻址、相对寻址、寄存器相对寻址(基址寻址)这几种方式。

RISC-V的寻址方式如下图(引用《计算机组成与设计riscv》一书的插图):

2 内存访问方式

RISC-V架构属于加载-存储架构:

RISC-V架构是一种加载-存储架构(与ARM一样),意味着:数据只能在寄存器中处理,而不能直接在存储器中操作,也就是说:处理指令不直接操作内存中的数据,如果程序需要修改内存中的数据,需要使用加载指令将数据从内存中加载到寄存器,使用数据处理指令修改了之后,然后用存储指令将结果存回到内存。

与ARM与RISC-V不同,x86-32算术指令的操作数可位于内存中,并不要求一定在寄存器中,对于x86-32 复杂指令和内存操作数使得设计者实现比较难受。

RISC-V中只有访存指令才能访问内存。其他的普通指令无法访问内存,这种架构是RISC-V采用的一个基本策略,这种策略使得处理器核的设计变得简单。

RV32I/RV64I 指令集中,可以访问内存的指令如下:

指令示意:

参考:

  1. 动态链接库的实现原理是什么?

标签:RISC,寻址,指令,寄存器,rs1,内存
From: https://www.cnblogs.com/sureZ-learning/p/18402900

相关文章

  • 一起学RISC-V汇编第6讲之伪指令列表
    一起学RISC-V汇编第6讲之伪指令伪指令是方便程序员使用,相当于为实际指令取的别名,编程时可以直接使用伪指令。上一章已经列出了RISC-V中的伪指令,只是比较分散,这一章以另一个视角重新整理一下伪指令,表格来源于《RISC-V开放架构设计之道1.0.0》1RISC-V伪指令列表伪指令一共60......
  • 一起学RISC-V汇编第5讲之常用指令及伪指令列表
    一起学RISC-V汇编第5讲之常用指令及伪指令列表这一篇介绍一下RISC-V常用的汇编指令,整理成表,便于查阅。1RISC-V指令命名以slt指令为例,如下示意图:大括号{}内列举了每组指令的所有变体,这些变体通过带下滑线的字母(单独的下划线_表示空字段),从左到右连接带下滑线的字母即可组成完整......
  • C++内存管理
    内存是什么?内存就是计算机的存储空间,用于存储程序的指令、数据和状态。在C语言中,内存被组织成一系列的字节,每个字节都有一个唯一的地址。程序中的变量和数据结构存储在这些字节中。根据变量的类型和作用域,内存分为几个区域,如栈(stack)、堆(heap)和全局/静态存储区。内存编址计算......
  • C语言之动态内存管理、柔性数组
    目录前言一、为什么要有动态内存分配二、常用函数(都声明在stdlib.h头文件中)三、常见的动态内存的错误四、柔性数组总结前言    本文讲述C语言动态内存管理的基础知识,另外包括柔性数组的基本知识。❤️感谢支持,点赞关注不迷路❤️一、为什么要有动态......
  • 内存对齐
    内存对齐关于内存对齐,看我-简书(jianshu.com)深入了解|内存对齐之alignof、alignas、aligned_storage、align深度剖析-知乎(zhihu.com)什么是内存对齐计算机中内存空间是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是:在访问......
  • python学习总结之内存处理
    1.引用计数法注:类似于java,这个系统自动回收垃圾对象,明显有循环引用的弊端。代码例子importsysimportpsutilimportosimportgcprint(gc.get_threshold())defshowMemSize(tag):pid=os.getpid()p=psutil.Process(pid)info=p.memory_full_info()memory=i......
  • # 结构体成员定义的顺序也会影响结构体的大小,内存对齐,内存填充
    结构体成员定义的顺序也会影响结构体的大小,内存对齐,内存填充usingSystem;usingSystem.Runtime.InteropServices;structStrcutOne{publicintb;//4bytespublicbytea;//1publicbytec;//1//4+1+1+2(在填充两个2个字节)=8字节}struct......
  • Promise resolve reject 一直不执行会不会导致内存泄漏
    如果一个Promise一直不resolve或reject,它本身不会直接导致内存泄漏。这是因为Promise对象在其状态变为fulfilled(已解决)或rejected(已拒绝)之后就会变成不可变的状态,并且Promise本身并不会持有对大量数据的引用。然而,有几个方面需要注意:事件监听器和定时器:如果Pr......
  • 深入理解动态内存(一):动态内存使用常见问题
    目录对NULL指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放⼀块动态开辟内存的⼀部分对同⼀块动态内存多次释放动态开辟内存忘记释放(内存泄漏)对NULL指针的解引用操作#include<stdio.h>#include<stdlib.h>intmain(){ int*p......
  • Linux 性能优化(网络、磁盘、内存、日志监控)
    1、CPU性能监控1.2、平均负载基础平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和CPU使用率并没有直接关系。平均负载其实就是平均活跃进程数。平均活跃进程数,直观上的理解就是单位时间内的活跃进程数。查看cpu个数:grep'modelnam......