RISC-V入门

先写点简单的,后面看情况补充……

什么是RISC-V

一般常见的处理器架构有x86和arm,x86主要在PC端,ARM主要用于移动终端。

但是arm有个问题是,设计arm架构芯片需要经过arm公司授权,同时会产生一些费用,但是,假如某天arm公司不授权怎么办?
riscv架构就是为了解决此问题,riscv最早起源于加州大学伯克利分校,由于受够了现有处理器架构的夫扎县和相关知识产权的限制,伯克利大学决定发明一种全新的、简单且开放免费的指令集架构。

从RISC-V名字可以看出,这是risc第5代指令集架构。而riscv目标是“成为一种完全开放的指令集架构,可被任何学术机构或商业组织自由使用“。

RISC-V通用寄存器

寄存器 ABI名称 说明
x0 zero 0值寄存器,硬编码为0,写入数据忽略,读取数据为0
x1 ra 用于返回地址(return address)
x2 sp 用于栈指针(stack pointer)
x3 gp 用于通用指针(global pointer)
x4 tp 用于线程指针
x5 t0 用于存放临时数据或者备用链接寄存器
x6~x7 t1~t2 用于存放临时数据寄存器
x8 s0/fp 需要保存的寄存器或者帧指针寄存器
x9 s1 需要保存寄存器
x10~x11 a0~a1 函数参数或者返回值寄存器
x12~x17 a2-a7 函数传递参数寄存器
x18~x27 s2-s11 需要保存的寄存器
x28~x31 t3~t6 用于存放临时数据寄存器

常用指令浅析

一般来说要读懂大致的逻辑只需要常用的读写值,比较跳转这类就可以了,其他个别陌生的可以猜,或者临时去查(很多可以直接猜出来的)

  • l(Load)系,l开头的基本就是取值,比如li a5, a4 就是把a4的值取到a5那里

另外有个比较特殊的是lui,addi,这两个是对li的拓展,一般要传递一个数据(通常是地址)高20位用lui,低12位用addi

比如:要传递0x11451419给a5寄存器,就会使用

lui a5, 0x11451

addi a5, a5, 0x419

  • s(store)系,s开头基本表示存值,比如sw a5, -14h(s0),表示把a5寄存器的值写入s0偏移为-0x14的地址

l和s有些时候要靠后面的字母来猜具体功能,

比如如果是w结尾,想到word,那么sw(store word)就可以猜是写入一个word(2字节)

同理还有lw(load word)等

当然也不是所有s开头都是表示store,还有比如slli(shift left logical immediate 逻辑左移)

  • j(jump)系,j开头基本就是跳转了,这里是无条件跳转

有条件的跳转常常是b开头,比如bgtz a5, label_1 就是把a5寄存的值和0比较,a5为正就会跳转到label_1,为负就继续往下执行;

bge a5, a4, label2,比较a5和a4,a5 >= a4 跳转到label2,反之继续执行

其他的诸如:mv,call,add,ret这些指令,都比较熟悉,功能也大差不差。

RISC-V实战

Welcome to my other publishing channels