先写点简单的,后面看情况补充……
什么是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这些指令,都比较熟悉,功能也大差不差。