RISC-V 指令集及相关概念总结¶
一、基础指令¶
(一)加法与减法指令¶
-
加法指令:
add rd, rs1, rs2
将寄存器rs1
和rs2
的值相加,结果存入寄存器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
如果reg1
和reg2
的值相等,则跳转到标签L1
处执行,否则执行下一条指令。 -
不相等分支:
bne reg1, reg2, L1
如果reg1
和reg2
的值不相等,则跳转到标签L1
处执行。 -
小于分支:
blt reg1, reg2, Label
如果reg1
小于reg2
,则跳转到标签Label
处执行。 -
大于等于分支:
bge reg1, reg2, Label
如果reg1
大于等于reg2
,则跳转到标签Label
处执行。 -
无符号版本:
还有bltu
和bgeu
指令,用于无符号整数的比较。
(二)无条件分支¶
- 无条件跳转:
j label
无条件跳转到标签label
处执行。
六、循环结构¶
(一)C语言循环类型¶
C语言中有while
、do...while
和for
三种循环结构,它们都可以相互转换,因此在RISC-V汇编中可以采用相同的分支方法来实现。
(二)RISC-V中的循环实现¶
关键在于使用条件分支指令来控制循环的继续或退出。例如,将C语言中的for
循环转换为RISC-V汇编代码时,会使用bge
等分支指令来判断循环条件是否满足,从而决定是否跳转回循环的开始处继续执行。
七、逻辑指令¶
(一)位运算¶
-
and
rd, rs1, rs2
寄存器rd
的值为rs1
和rs2
的按位与结果。 -
andi
rd, rs1, imm
寄存器rd
的值为rs1
和立即数imm
的按位与结果。常用于创建掩码,如andi x5, x6, 3
可隔离x6
的最低两位。 -
or
rd, rs1, rs2
寄存器rd
的值为rs1
和rs2
的按位或结果。 -
ori
rd, rs1, imm
寄存器rd
的值为rs1
和立即数imm
的按位或结果。 -
xor
rd, rs1, rs2
寄存器rd
的值为rs1
和rs2
的按位异或结果。 -
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):处理器内部的一个寄存器,用于