RISC-V指令集之RV32I


本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。

1 RV32I的寄存器

如下图,列出了RV32I 寄存器和由RISC-V 应用程序二进制接口(Application Binary Interface,ABI)定义的寄存器名称。我们将在示例代码中使用ABI 名称来提升可读性。
在这里插入图片描述
在RISC-V 的规范里面,RV32I定义了32 个通用寄存器,其中31个是常规寄存器,1个恒为0值的x0寄存器。

2 RV32I的指令

RV32I具备的所有指令,如下所示。
在这里插入图片描述
这里展示了RV32I指令集的每一条指令,并且每条指令的具体格式,以及指令类型。

RV32I指令集,一共包含了47条指令,分别涵盖了数据传输、算术运算、逻辑运算、分支跳转、比较判断等功能。

我们按不同类型,划分来看:
在这里插入图片描述

2.1 算术运算指令

算术运算指令,有add、sub、addi、lui、auipc,其指令形式与含义,如下所示:

指令形式功能说明
add rd, rs1, rs2rd = rs1 + rs2
sub rd, rs1, rs2rd = rs1 - rs2
addi rd, rs1, immrd = rs1 + imm
lui rd, immrd = imm << 12
auipc rd, immrd = PC + (imm << 12)

2.2 逻辑运算指令

逻辑运算指令,有xor、or、and、xori、ori、andi,其指令形式与含义,如下所示:

指令形式功能说明
xor rd, rs1, rs2rd = rs1 ^ rs2,表示rs1与rs2按位异或,结果存入rd
or rd, rs1, rs2rd = rs1 \ rs2,表示rs1与rs2按位或,结果存入rd
and rd, rs1, rs2rd = rs1 & rs2,表示rs1与rs2按位与,结果存入rd
xori rd, rs1, immrd = rs1 ^ imm,表示rs1与imm按位异或,结果存入rd
ori rd, rs1, immrd = rs1 \ imm,表示rs1与imm按位或,结果存入rd
andi rd, rs1, immrd = rs1 & imm,表示rs1与imm按位与,结果存入rd

2.3 移位运算指令

移位运算指令,有sll、srl、sra等,共10条,其指令形式与含义,如下所示:

指令形式功能说明
sll rd, rs1, rs2rd = rs1 << rs2,表示将rs1逻辑左移,左移位数为rs2,结果存入rd
srl rd, rs1, rs2rd = rs1 >> rs2,表示将rs1逻辑右移,右移位数为rs2,结果存入rd
sra rd, rs1, rs2rd = rs1 >> rs2,表示将rs1算术右移,右移位数为rs2,结果存入rd
slt rd, rs1, rs2rd = (rs1 < rs2) ? 1:0,表示rs1小于rs2,则将1写入rd,否则将0写入rd
sltu rd, rs1, rs2rd = (rs1 < rs2) ? 1:0,表示无符号的rs1小于rs2,则将1写入rd,否则将0写入rd
slli rd, rs1, immrd = rs1 << imm[0:4],表示将rs1逻辑左移,左移位数为imm,结果存入rd
srli rd, rs1, immrd = rs1 >> imm[0:4],表示将rs1逻辑右移,右移位数为imm,结果存入rd
srai rd, rs1, immrd = rs1 >> imm[0:4],表示将rs1算术右移,右移位数为imm,结果存入rd
slti rd, rs1, immrd = (rs1 < imm) ? 1:0,表示rs1小于imm,则将1写入rd,否则将0写入rd
sltiu rd, rs1, immrd = (rs1 < imm) ? 1:0,表示无符号的rs1小于imm,则将1写入rd,否则将0写入rd

2.4 内存读写指令

RV32I数据读写指令,可以从内存中加载数据到寄存器,或者将寄存器值存储到内存。亦或者将数据从一个寄存器复制到另一个。或者将立即数或标签地址加载到寄存器。

RV32I内存读写指令,有lb、lh、lw等,共8条,其指令形式与含义,如下所示:

指令形式功能说明
lb rd, imm(rs1)rd = M[rs1+imm][0:7],表示从内存地址(rs1+imm)中,加载一个8位有符号字节到寄存器rd
lh rd, imm(rs1)rd=M[rs1+imm][0:15],表示从内存地址(rs1+imm)中,加载一个16位有符号半字到寄存器rd
lw rd, imm(rs1)rd = M[rs1+imm][0:31],表示从内存地址(rs1+imm)中,加载一个32位有符号或无符号字到寄存器rd
lbu rd, imm(rs1)rd = M[rs1+imm][0:7],表示从内存地址(rs1+imm)中,加载一个8位无符号字节到寄存器rd
lhu rd, imm(rs1)rd = M[rs1+inm][0:15],表示从内存地址(rs1+imm)中,加载一个16位无符号半字到寄存器rd
sb rs2, imm(rs1)M[rs1+imm][0:7] = rs2[0:7],表示将rs2中的最低8位值,存储到(rs1+imm)地址的内存中
sh rs2, imm(rs1)M[rs1+imm][0:15] = rs2[0:15],表示将rs2中的最低16位值,存储到(rs1+imm)地址的内存中
sw rs2, imm(rs1)M[rs1+imm][0:31] = rs2[0:31],表示将rs2中的最低32位值,存储到(rs1+imm)地址的内存中

2.5 分支与跳转指令

条件跳转指令,是依据指令中的条件来决定跳转。换句话说就是,通过判断条件来决定是否改变当前执行流程。

RV32I分支与跳转指令,有beq、bne、blt等,共8条,其指令形式与含义,如下所示:

指令形式功能说明
beq rs1, rs2, immif(rs1 == rs2) PC+=imm,表示如果rs1等于rs2,则跳转到PC+imm
bne rs1, rs2, immif(rs1 != rs2) PC+=imm,表示如果rs1不等于rs2,则跳转到PC+imm
blt rs1, rs2, immif(rs1 < rs2) PC+=imm,表示如果有符号的rs1小于rs2,则跳转到PC+imm
bge rs1, rs2, immif(rs1 >= rs2) PC+=imm,表示如果有符号的rs1大于等于rs2,则跳转到PC+imm
bltu rs1, rs2, immif(rs1 < rs2) PC+=imm,表示如果无符号的rs1小于rs2,则跳转到PC+imm
bgeu rs1, rs2, immif(rs1 >= rs2) PC+=imm,表示如果无符号的rs1大于等于rs2,则跳转到PC+imm
jal rd, immrd = PC+4; PC += imm,表示首先将PC+4的地址值存储到寄存器rd,然后跳转到PC+imm处
jalr rd, imm(rs1)rd = PC+4; PC= rs1 + imm,表示首先将PC+4的地址值存储到寄存器rd,然后跳转到rs1+imm处

关于跳转指令,还有几条常用伪指令:

指令形式功能说明
j lab跳转到lab标签地址处
jr rs1跳转到寄存器rs1指定的地址
jal lab首先将PC+4的地址值存储到返回寄存器ra,然后跳转到lab标签处
ret跳转到返回寄存器ra保存的地址

通过上述内容的学习,我们了解了RV32I指令集有哪些指令,以及这些指令的字节码(机器码)构成。

  • 21
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: RISC-V是一种开放源代码的指令集架构,它具有简洁、高效、可扩展的特点,被广泛应用于各种计算机和嵌入式系统中。其指令集设计遵循了精简指令集计算机(RISC)的原则,着重于简化指令的设计和保持指令的一致性。 RISC-V指令集的特点包括以下几个方面: 1. 可扩展性:RISC-V提供了基本指令集RV32I/RV64I)以及多个标准的扩展指令集,如浮点指令集(F)、向量指令集(V)等,用户可以根据需求选择不同的扩展指令集进行系统设计。 2. 模块化设计:RISC-V的指令集可以根据应用的需求进行灵活的扩展和定制,用户可以根据具体的应用场景选择需要的指令集模块,这种模块化的设计使得RISC-V非常适用于各种嵌入式系统。 3. 兼容性:RISC-V的指令集被设计为向后兼容的,因此可以支持旧有的指令集扩展,同时为未来的指令扩展提供了一定的灵活性。 4. 简洁性:RISC-V的指令集设计比较简单,仅包含了约50条基本指令,这样的设计使得指令集具有更高的可读性和易扩展性。 5. 跨平台:RISC-V是一种开放源代码的指令集架构,可以在不同的硬件平台上运行,由于其开放性,各种厂商可以基于RISC-V进行自主研发,使得更多的创新可以被应用于不同的领域。 总体而言,RISC-V指令集具有可扩展性、模块化设计、兼容性、简洁性和跨平台的特点,这使得它成为一种理想的指令集架构,被广泛应用于各种计算机和嵌入式系统中。 ### 回答2: RISC-V是一种开源指令集架构(Instruction Set Architecture,ISA),在计算机体系结构中被广泛应用。它的名称中的“RISC”代表精简指令集计算机(Reduced Instruction Set Computer),而“V”代表着第五个版本。 RISC-V指令集的设计目标是简单、通用且可扩展,在不同应用领域都能得到广泛应用。它提供了基本的指令集,包括加载/存储指令、算术和逻辑操作指令、分支和跳转指令等,以及一些扩展指令集,如浮点数指令集和向量指令集RISC-V的指令集设计非常清晰,指令长度为32位,分为不同的格式(R、I、S、B、U、J),根据格式的不同,指令字段的划分也不同。RISC-V的指令集包含了大约50个基本指令,这些指令的功能非常基础,但足以满足大部分计算任务的需求。 RISC-V的设计原则之一是可扩展性。它提供了不同的标准扩展集,可以根据需求灵活地增加指令功能。这些扩展集包括浮点数扩展(F)、向量扩展(V)和安全扩展(S)。通过使用这些扩展集,可以使RISC-V处理器支持更多的功能,从而满足不同领域的需求。 总的来说,RISC-V指令集的设计目标是提供一种简单、通用和可扩展的架构,使得它可以广泛应用于各种不同的系统和领域。它的开放源代码和友好的许可协议使得它在学术界和工业界都受到了广泛的关注和采用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百里杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值