Skip to content

RISC-V 指令集及相关概念总结

一、基础指令

(一)加法与减法指令

  • 加法指令add rd, rs1, rs2
    将寄存器rs1rs2的值相加,结果存入寄存器rd

  • 减法指令sub rd, rs1, rs2
    将寄存器rs1的值减去rs2的值,结果存入寄存器rd

(二)立即数加法指令

  • 立即数加法addi rd, rs1, imm
    将寄存器rs1的值与立即数imm相加,结果存入寄存器rd

二、数据传输指令

(一)加载指令

  • lw rd, rs1, imm
    从内存地址rs1 + imm处加载一个字(32位)到寄存器rd

  • lb rd, rs1, imm
    从内存地址rs1 + imm处加载一个字节(8位)到寄存器rd的低8位,并进行符号扩展。

  • lbu rd, rs1, imm
    从内存地址rs1 + imm处加载一个字节(8位)到寄存器rd的低8位,不进行符号扩展。

(二)存储指令

  • sw rs1, rs2, imm
    将寄存器rs1的值存储到内存地址rs2 + imm处。

  • sb rs1, rs2, imm
    将寄存器rs1的低8位的值存储到内存地址rs2 + imm处。

三、内存地址与字节序

(一)内存地址

  • 内存地址以字节为单位,而不是以字(32位)为单位。
  • 字地址是4字节对齐的,即字地址与右起第一个字节(即最低有效字节)的地址相同,遵循小端序(Little-endian)约定。

(二)字节序

  • 小端序:最低有效字节存放在内存的低地址端,例如数字1025在内存中的存储顺序为00000000 00000000 00000100 00000001
  • 大端序:最低有效字节存放在内存的高地址端,例如数字1025在内存中的存储顺序为00000001 00000100 00000000 00000000

四、存储层次与速度

(一)存储层次

  • 寄存器:位于处理器芯片上,速度极快但容量很小,通常只有32个字(128字节)。
  • DRAM芯片:如DDR3/4/5、HBM/HBM2/3等,容量较大(笔记本电脑上通常为2GB到64GB),速度较寄存器慢很多。

(二)速度对比

  • 寄存器比DRAM快约50-500倍(以单次访问的延迟来衡量,通常为几十纳秒),但后续字的访问间隔只有几纳秒。

五、分支指令

(一)条件分支

  • 相等分支beq reg1, reg2, L1
    如果reg1reg2的值相等,则跳转到标签L1处执行,否则执行下一条指令。

  • 不相等分支bne reg1, reg2, L1
    如果reg1reg2的值不相等,则跳转到标签L1处执行。

  • 小于分支blt reg1, reg2, Label
    如果reg1小于reg2,则跳转到标签Label处执行。

  • 大于等于分支bge reg1, reg2, Label
    如果reg1大于等于reg2,则跳转到标签Label处执行。

  • 无符号版本
    还有bltubgeu指令,用于无符号整数的比较。

(二)无条件分支

  • 无条件跳转j label
    无条件跳转到标签label处执行。

六、循环结构

(一)C语言循环类型

C语言中有whiledo...whilefor三种循环结构,它们都可以相互转换,因此在RISC-V汇编中可以采用相同的分支方法来实现。

(二)RISC-V中的循环实现

关键在于使用条件分支指令来控制循环的继续或退出。例如,将C语言中的for循环转换为RISC-V汇编代码时,会使用bge等分支指令来判断循环条件是否满足,从而决定是否跳转回循环的开始处继续执行。

七、逻辑指令

(一)位运算

  • and rd, rs1, rs2
    寄存器rd的值为rs1rs2的按位与结果。

  • andi rd, rs1, imm
    寄存器rd的值为rs1和立即数imm的按位与结果。常用于创建掩码,如andi x5, x6, 3可隔离x6的最低两位。

  • or rd, rs1, rs2
    寄存器rd的值为rs1rs2的按位或结果。

  • ori rd, rs1, imm
    寄存器rd的值为rs1和立即数imm的按位或结果。

  • xor rd, rs1, rs2
    寄存器rd的值为rs1rs2的按位异或结果。

  • xori rd, rs1, imm
    寄存器rd的值为rs1和立即数imm的按位异或结果。可用于实现逻辑非,如xori x5, x6, -1可实现x5 = ~x6

(二)移位指令

  • sll rd, rs1, rs2
    将寄存器rs1的值向左逻辑移位rs2位,结果存入寄存器rd

  • slli rd, rs1, imm
    将寄存器rs1的值向左逻辑移位imm位,结果存入寄存器rd

  • srl rd, rs1, rs2
    将寄存器rs1的值向右逻辑移位rs2位,结果存入寄存器rd

  • srli rd, rs1, imm
    将寄存器rs1的值向右逻辑移位imm位,结果存入寄存器rd

  • sra rd, rs1, rs2
    将寄存器rs1的值向右算术移位rs2位,结果存入寄存器rd。算术移位在移位时会将符号位复制到空出的高位,适用于有符号数的移位。

  • srai rd, rs1, imm
    将寄存器rs1的值向右算术移位imm位,结果存入寄存器rd

八、程序存储与执行

(一)程序存储

程序以指令的形式存储在内存中,每条 RISC-V 指令占用 32 位(4 字节)。
指令和数据都存储在内存的字节中,内存地址以字节为单位。

(二)程序执行

  • 取指令:从内存中取出指令。
  • 执行指令:控制单元使用数据通路和存储系统执行指令,并更新程序计数器(PC)。
    默认情况下,PC 会自动加 4 字节,以指向下一顺序指令。
    分支和跳转指令会改变 PC 的值,从而改变程序的执行流程。

  • 程序计数器(PC):处理器内部的一个寄存器,用于