学习目标

  • 理解 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 汇编实现:

  1. 两数相加
  2. 数组求和
  3. 查找最大值

下一步

第 8 章:RISC-V 汇编编程

更新时间: