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指令 RV32I是一个load /store架构,所有的memory访问都是通过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指令集的主要内容,如果未能解决你的问题,请参考以下文章