riscv 指令集与寄存器

文章目录

        • 指令集
        • 寄存器分类
        • RV64 和 RV32 有什么不同总览
        • 指令集分类
            • base
            • optional
        • 内嵌汇编
        • 参考文章

指令集

RV32指令集 和 RV64指令集 并不是单独的 一类指令集的集合,而很多类指令集的集合

RV32指令集 : RV32IMAFDC(即RV32GC)
RV64指令集 : RV64IMAFDC(即RV64GC)

RV64 指令集 和 RV32 指令集 都是 编码 为 32bit(除了RV32C(压缩)指令集编码为16bit) 

寄存器分类

1. CSR(4096个,包括你见到的除了x1类和f1类之外的所有寄存器,类似mstatus,用RVzicsr指令集访问)
2. 通用寄存器(32个)
3. 浮点寄存器(32个)
4. PC // 在 riscv 架构中,PC值没有被放映在任何寄存器中 // 可在 非debug mode 访问 AUIPC 获得,可在 debug mode 访问 dpc 获得 
RV64 和 RV32 用的是不同的寄存器
RV64I  用的是 64bit 长度的 32个 X0-X31 通用寄存器
RV64FD 增加了 64bit 长度的 32个 F0-F31 通用寄存器
---
RV32I  用的是 32bit 长度的 32个 X0-X31 通用寄存器
RV32FD 增加了 32bit 长度的 32个 F0-F31 通用寄存器

RV64 和 RV32 有什么不同总览

RV32 RV64
寄存器位宽 32 64
指令位宽 32 32
指令 RV32IMAFDC(RV64IMAFDC的子集?) RV64IMAFDC
寄存器种类 4096CSR+32G+32F+PC 4096CSR+32G+32F+PC
RV64CPU是否可以跑RV32代码 应该可以跑 但是不能跑所有(不完全兼容)的RV32代码
怎么写出兼容RV32和RV64的code
	用C天然兼容,用汇编(只用RV64GC和RV32GC的交集部分)
怎么编译出 RV32CPU 和 RC64 CPU 都能跑的 二进制文件
	编译时用 的ABI 为 ilp32(-mabi= ilp32) 且编译时用的 指令集为 rv32ima(-march= rv32ima)
	// 用 objcopy 出来的bin文件是不同的
汇编体会
	我可以用同样的汇编代码,编写 rv32 和 rv64的工程 
	但是编译选项不一样就行了,编译选项不一样,就会编译出不同的架构 : ELF32和ELF64

指令集分类

base
  • RV32I指令集:40个和 RVZicsr指令集:6个 和Zifencei扩展指令集:1个 共40+6+1个

RV32I指令集的目的是尽量简化硬件的实施设计,所以它只有40条指令(包括fence指令) // fence.tso 是伪指令,最终编码为fence指令
	之前RV32I是47条指令
	在最新的规范中,
		6条 csr 	指令被放在 RVZicsr指令集
		1条 fence.i 指令被放到 Zifencei指令集
	现在RV32I有40条指令

这40条指令几乎能够模拟其它任何扩展指令(除了A扩展指令,因为原子指令需要硬件支持)。

实际上要实现机器模式的RiscV特权架构,还需要6条csr指令,之前这些指令都是在RV32I中的,现在被放在扩展指令集 Zicsr中了。
所以说要实现一个完整的RiscV系统,至少要实现RV32I+Zicsr指令集。


如果用更简单的实现方式
	比如对于ECALL和EBREAK指令,调用时候,系统总是自陷(trap),所以可以减一条指令
	以及用NOP指令模拟Fence指令(备注:在RISC V中,NOP指令是伪代码,其实就是addi, x0,x0,0,所以可以减一条指令
	则RV32I甚至可以减少到38条指令


RV32I是32位基础整数指令集,它支持32位寻址空间,支持字节地址访问,仅支持小端格式(little-endian,高地址高位,低地址地位),寄存器也是32位整数寄存器。
在RV32I指令集架构中,包括32个通用目的寄存器,其中x0被预留为常数0,其它31个寄存器(x1-x31)是普通的通用整数寄存器。在Risc-V汇编语言中,每个通用寄存器都有一个对应的ABI名字,也就是说在汇编语言中,x1等价于ra,它们都会汇编成相同的机器码。对于RV32I,通用寄存器是32位的寄存器,xlen=32;对于RV64I,通用寄存器是64位寄存器,xlen=64
  • RV64I指令集:40+12个 共40+12个
在常用的RV64裸机代码中,用到的指令集一般包括
	RV64I指令集
	RVZicsr指令集
	Zifencei扩展指令集 
  • [supervisor-mode privileged instructions:2个] 共2个
sfence.vma/sret
  • [machine-mode privileged instructions:4个] 共4个
ecall/ebreak
	这个是 machine mode 提供的,
	虽然这个设计出来就是被user用的 .user用了会陷入privileged 
	但正是因为他是特权级命令,所以 user用了会陷入privileged 
	这个和 其他的 privileged  性质是一样的,比如 wfi 和 mret//user用了,会陷入privileged
wfi
mret

optional
  • RV32M/RV64M指令集
  • RV32A/RV64A指令集
  • RV32FDQ/RV64RDQ指令集part1及part2
  • RV32C指令集和[RV64C指令集]

内嵌汇编

asm("nop");
asm("_tag1:nop");

参考文章

  • 参考文档

  • RV架构简述

你可能感兴趣的:(riscv,riscv)