第 7 章:RISC-V 指令集架构
学习目标
- 理解 RISC-V ISA
- 掌握基本指令格式
- 学习寄存器使用
7.1 RISC-V 简介
RISC-V 是开源的指令集架构,特点:
- 简洁:基础指令集只有 40 多条
- 模块化:RV32I、RV64I、M/A/F/D 扩展
- 开放:完全开源,无专利限制
7.2 寄存器
RISC-V 有 32 个通用寄存器:
x0 (zero) - 恒为 0
x1 (ra) - 返回地址
x2 (sp) - 栈指针
x3 (gp) - 全局指针
x4 (tp) - 线程指针
x5-x7 - 临时寄存器
x8 (fp/s0) - 帧指针
x9 (s1) - 保存寄存器
x10-x17 - 函数参数/返回值
x18-x27 - 保存寄存器
x28-x31 - 临时寄存器
7.3 指令格式
R 型(寄存器-寄存器)
add rd, rs1, rs2 # rd = rs1 + rs2
sub rd, rs1, rs2 # rd = rs1 - rs2
and rd, rs1, rs2 # rd = rs1 & rs2
I 型(立即数)
addi rd, rs1, imm # rd = rs1 + imm
lw rd, imm(rs1) # rd = mem[rs1 + imm]
S 型(存储)
sw rs2, imm(rs1) # mem[rs1 + imm] = rs2
B 型(分支)
beq rs1, rs2, label # if (rs1 == rs2) goto label
bne rs1, rs2, label # if (rs1 != rs2) goto label
7.4 常用指令
# 算术运算
add a0, a1, a2 # a0 = a1 + a2
addi a0, a1, 10 # a0 = a1 + 10
sub a0, a1, a2 # a0 = a1 - a2
# 逻辑运算
and a0, a1, a2 # a0 = a1 & a2
or a0, a1, a2 # a0 = a1 | a2
xor a0, a1, a2 # a0 = a1 ^ a2
# 移位
sll a0, a1, a2 # a0 = a1 << a2
srl a0, a1, a2 # a0 = a1 >> a2 (逻辑)
sra a0, a1, a2 # a0 = a1 >> a2 (算术)
# 访存
lw a0, 0(sp) # a0 = mem[sp]
sw a0, 0(sp) # mem[sp] = a0
# 跳转
jal ra, func # ra = pc+4; pc = func
jalr ra, 0(a0) # ra = pc+4; pc = a0
实践练习
手写 RISC-V 汇编实现:
- 两数相加
- 数组求和
- 查找最大值