RSIC-V指令集
RSIC-V 流水线
pc(program counter 存储当前指令)—> instuction RAM(指令内存) —> reg0~31(32个寄存器) —> ALU(逻辑数学运算单元) —> data RAM(数据内存)
上述数据流转流程被称为 instuction pipeline
Instruction set
RSIC-V 不管是32位cpu还是64位cpu,指令长度固定为32位。
opcode: 区分6种不同类型的指令
rd: destination reg目标寄存器,711共5bit,可以表示reg031,S-type和SB-type为操作型指令,不需要目标寄存器
rs1: source reg 源寄存器1,1519共5bit,可以表示reg031,存储源操作数
rs2: source reg 源寄存器2,2024共5bit,可以表示reg031,存储源操作数
funct3: 3bit操作码
funct7: 7bit操作码
imm: 立即数
常用指令
add x1, x0, 0 高级语言释义:x1 = x0 + 0, 其中x0寄存器为只读且值为0,该指令常用于x1寄存器初始化为0
sub rd,rs1,rs2 高级语言释义:rd = rs1 - rs2
mul rd,rs1,rs2 高级语言释义:rd = rs1 * rs2
div rd,rs1,rs2 高级语言释义:rd = rs1 / rs2
rem rd,rs1,rs2 高级语言释义:rd = rs1 % rs2
and rd,rs1,rs2 高级语言释义:rd = rs1 & rs2
or rd,rs1,rs2 高级语言释义:rd = rs1 | rs2
xor rd,rs1,rs2 高级语言释义:rd = rs1 ^ rs2
sll rd,rs1,rs2 高级语言释义:rd = rs1 << rs2
srl rd,rs1,rs2 高级语言释义:rd = rs1 >> rs2
slt rd,rs1,rs2 高级语言释义:rd = (rs1 < rs2)?1:0 (rs1 rs2为有符号数)
sltu rd,rs1,rs2 高级语言释义:rd = (rs1 < rs2)?1:0 (rs1 rs2为无符号数)
beq rs1,rs2,lable:若rs1的值等于rs2的值,程序跳转到lable处继续执行
bne rs1,rs2,lable:若rs1的值不等于rs2的值,程序跳转到lable处继续执行
blt rs1,rs2,lable:若rs1的值小于rs2的值,程序跳转到lable处继续执行 (bltu无符号)
bge rs1,rs2,lable:若rs1的值大于等于rs2的值,程序跳转到lable处继续执行 (bgeu无符号)
j label:程序直接跳转到lable处继续执行
jal rd,label:用于调用函数,把下一条指令的地址保存在rd中(通常用x1),然后跳转到label处继续执行
jalr rd,offset(rs):可用于函数返回,把下一条指令的地址存到rd中,然后跳转到rs+offset地址处的指令继续执行。若rd=x0就是单纯的跳转
TODO 未完待续。。。