RV32I指令集

Posted mikewolf2002

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RV32I指令集相关的知识,希望对你有一定的参考价值。

RV32I是最基本的32位base指令集,它支持32位寻址空间,支持字节地址访问,仅支持小端格式(little-endian,高地址高位,低地址地位),寄存器也是32位整数寄存器。RV32I指令集的目的是尽量简化硬件的实施设计,所以它只有47条指令。

在RV32I指令集架构中,包括32个通用目的寄存器,其中x0被预留为常数0,其它31个寄存器(x1-x31)是普通的通用整数寄存器。在Risc-V汇编语言中,每个通用寄存器都有一个对应的ABI名字,也就是说在汇编语言中,x1等价于ra,它们都会编译成相同的机器码。

在Risc-V架构中,要得到当前指令pc(指令在存储器中的位置,instruction program counter),可以通过AUIPC指令,把它读入到一个通用寄存器中。

寄存器 ABI名字 注释 Saver
x0  zero Hard-wired zero,常数0  
x1 ra Return address caller,调用函数的指令pc
x2 sp Stack pointer callee,被调用的函数指令pc
x3 gp Global pointer  
x4 tp Thread pointer  
x5 t0 Temporary/alternate link register caller
x6 t1 Temporaries caller
x7 t2 Temporaries caller
x8 s0/fp Saved register/frame pointer caller
x9 s1 Saved register caller
x10 a0 Function arguments/return values caller
x11 a1 Function arguments/return values caller
x12 a2 Function arguments caller
x13 a3 Function arguments caller
x14 a4 Function arguments caller
x15 a5 Function arguments caller
x16 a6 Function arguments caller
x17 a7 Function arguments caller
x18 s2 Saved registers caller
x19 s3 Saved registers caller
x20 s4 Saved registers caller
x21 s5 Saved registers caller
x22 s6 Saved registers caller
x23 s7 Saved registers caller
x24 s8 Saved registers caller
x25 s9 Saved registers caller
x26 s10 Saved registers caller
x27 s11 Saved registers caller
x28 t3 Temporaries caller
x29 t4 Temporaries caller
x30 t5 Temporaries caller
x31 t6 Temporaries caller

Base指令格式:

RV32I指令格式包括以下6种,每种指令格式都是固定的32位指令,所以指令在内存中必须4字节对齐,否则将触发异常。

其中rd表示目的寄存器,rs1是源操作数寄存器1,rs2是源操作数寄存器2。

技术分享图片

imm表示指令中的立即数,比如imm[11:0],表示一个12位的立即数,它的高20位会符号位扩展,imm[31:12]表示一个32位的立即数,它的低12位会补0。

下图是各种指令格式扩展后的32位立即数。

技术分享图片

RV32I整数指令集

RV32I整数指令集分为几个种类:

1.Load和store指令

Category Fmt RV32I base machine code(bin) comment
Loads load byte I LB rd, rs1, imm [31-20,imm][19-15,rs1]000[11-7,rd]0000011 rd=mem[rs1+imm], 8bit数据符号位扩展后返回rd
load half word I LH rd, rs1, imm [31-20,imm][19-15,rs1]001[11-7,rd]0000011 rd=mem[rs1+imm],16bit数据符号扩展后返回rd,应该保证地址对齐,否则产生异常
load word I LW rd, rs1, imm [31-20,imm][19-15,rs1]010[11-7,rd]0000011 rd=mem[rs1+imm],32bit数据返回rd,应该保证地址对齐,否则产生异常
load byte unsinged I LBU rd, rs1, imm [31-20,imm][19-15,rs1]100[11-7,rd]0000011 rd=mem[rs1+imm], 8bit数据高位补0后返回rd
load half unsinged I LHU rd, rs1, imm [31-20,imm][19-15,rs1]101[11-7,rd]0000011 rd=mem[rs1+imm], 16bit数据高位补0后返回rd
stores store byte S SB rs1, rs2, imm [31-25,imm[11-5]][24-20,rs2,][19-15,rs1]000[11-7,imm[4-0]]0100011 mem[rs1+imm]=rs2的低8bit数据
store half word S SB rs1, rs2, imm [31-25,imm[11-5]][24-20,rs2,][19-15,rs1]001[11-7,imm[4-0]]0100011 mem[rs1+imm]=rs2的低16bit数据
store word S SB rs1, rs2, imm [31-25,imm[11-5]][24-20,rs2,][19-15,rs1]010[11-7,imm[4-0]]0100011 mem[rs1+imm]=rs2的32bit数据

RV32I是一个load /store架构,所有的memory访问都是通过load/store指令,其它指令都是在寄存器之间进行运算,比如加法指令,减法指令等等。















以上是关于RV32I指令集的主要内容,如果未能解决你的问题,请参考以下文章

RV32I控制转移指令的偏移量计算问题

RV32I控制转移指令的偏移量计算问题

RV32I控制转移指令的偏移量计算问题

RV32I控制转移指令的偏移量计算问题

RV32C指令集

tinyriscv---一个从零开始写的极简易懂的开源RISC-V处理器核