RISC-V指令与寄存器


前言

在RISC-V项目调试和项目开发过程中,难免会遇到RISC-V体系结构和汇编的问题。比如笔者在利用编译生成的dump文件,对Nuclie处理器指令执行进行调试的过程中,就遇到了指令长度和指令操作的问题。


下面参考《基于FPGA和RISC-V的嵌入式系统设计》,以RISC-V 地址空间/ RV32I 通用寄存器与函数调用约定/ RV32I 指令格式三个角度介绍。

一、RISC-V 地址空间

内存地址空间可以用来分配给代码、数据,或者作为寄存器的内存映射(Memory
Mapped Registers)。在物理实现时,代码和数据可以共用存储(von Neumann,
冯·诺依曼架构),也可以分别存储(Harvard,哈佛架构)。和其他的处理器一样,
RISC-V 的处理器也是通过程序计数器(Program Counter,PC)来指示当前正在执
行的指令地址的。
在寄存器的内存映射部分,大部分的外围设备寄存器都会被映射到这个空间,
其中也包括机器模式的定时器(Mtime)和定时器触发值(Mtimecmp)。

在这里插入图片描述
RV32I 指令集包含 32 个通用寄存器,32位处理器中每个通用寄存器x0…x10…x31都是占4个字节。
在 RISC-V 的特权架构部分还对控制与状态寄存器(Control Status Register,
CSR)做了定义,并单独分配了 12 位的地址空间。在用户指令集中,则专门定义
了 Zicsr 指令集扩展来对 CSR 进行操作。

二、 RV32I 通用寄存器与函数调用约定

RV32I 基础指令集总共定义了 32 个 32 位的通用寄存器。它们分别被标记为
x0 ~ x31。其中零号寄存器 x0 是只读寄存器,其值永远为零。
在用汇编语言编写时,这 32 个寄存器
的名称也根据其在调用约定中的职能而被重新命名。具体如下表:
在这里插入图片描述
需要指出的是,除了硬件指令集会对函数调用约定产生影响外,高级
语言的编译器也会对其有影响。
例如,对下面的函数:

void dummy(int a,int b,int c,int d,int e)

不同的编译器可能对函数参数压栈的顺序有不一致的理解。有的会从左到右,以
a、b、c、d、e 的顺序压栈;有的则反之,从右到左压栈。

三、RV32I 指令格式

RV32I 的基本指令格式只有 4 种,分别是寄存
器类型(R-TYPE)、短立即数类型(I-TYPE)、内存存储类型(S-TYPE)、高位立即数类型(U-TYPE)。
为了方便跳转指令,RV32I 还包含两种衍生格式 B-TYPE(Branch,条件跳转)
与 J-TYPE(Jump,无条件跳转)。B-TYPE 衍生于 S-TYPE,B-TYPE 除了立即数
的位排列与 S-TYPE 不一样外,其他的格式都与 S-TYPE 一样。J-TYPE 也是通过
类似的方式衍生于 U-TYPE。用这种方式衍生新格式的目的是便于硬件产生目标
地址。
这些指令格式非常规整,其操作码、源寄存器和目标寄存器总是
位于相同的位置上,简化了指令解码器的设计。
在这里插入图片描述

总结

RISC-V的设计有自己独到的地方,还需要我们结合实际的场景去不断深入理解。下一篇就以“RV32I 算术与逻辑指令”为视角,看看指令格式与汇编code的对照关系。

  • 1
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值