指令表示
一、概述🧀
本质:一切都是数字,都在内存储存内
程序可以像数据一样被修改
不需要重新接线(ENIAC → 现代计算机)
后果:
- 指令、数据都有地址;PC(Program Counter)存当前指令地址
- 程序是二进制分发;新机器要兼容旧程序
二、RISC-V 指令本质及格式🧀
-
基础 RV32I 指令都是 32 bit,格式规则、便于译码;启用
C扩展后还会出现 16 bit 压缩指令,因此不能笼统地说所有 RISC-V 指令都固定为 32 bit -
优点在于解码简单,pipeline 友好
-
指令 = 字段(fields)
一个指令被拆成多个字段:
opcode(操作类型)rs1 / rs2(源寄存器)rd(目标寄存器)funct3 / funct7(细分操作)immediate(立即数)
1、R-type(寄存器运算)🧀
R-format 指令的opcode是0110011,func3+func7是存在冗余的,十个字节本来可以表示1024条指令但是这里只用表示大约10条指令
比如
再比如
2、I-type(立即数 & load)🧀
把func7和rs2合并成一个imm[11:0],一共12位,范围[-2048~+2047],imm会进行符号位拓展
比如
位移和load操作也是用的I-type指令
3、S-type(store)🧀
这里没有 rd(因为不写寄存器),而且 immediate 被拆成两段
4、B-type(branch)🧀
B-type是给 条件跳转用的。它的本质不是跳到某个绝对地址而是
但 RISC-V 实际设计为了兼容 16-bit compressed instructions,branch offset 是按 2 bytes 对齐的,也就是说 branch immediate 表示的是“半字节对齐单位”,不是完整 4-byte 指令单位
比如
5、U-type(大立即数)🧀
用来构造 32-bit 常数,因为addi 只能放 12-bit 立即数(±2048),所以 \(32bit 常数 = 高20位 + 低12位\)
正常情况下直接拆就好,但是如果遇到拆出来低12位是负数就要特判
