7次发布 (4次重大更改)

0.5.0 2021年2月20日
0.4.0 2020年11月29日
0.3.2 2020年11月23日
0.2.0 2020年11月20日
0.1.0 2020年11月19日

#1010编码

每月26次 下载
monster-rs 中使用

MIT 许可证

39KB
808

RISC-U

Build Statue Crate API Rust Version Lines of Code License

RISC-U是一个简单的库,用于加载和解码ELF64 RISC-U文件。这些二进制文件由Selfie生成,Selfie是一个微小的自编译C编译器的教学软件系统,一个微小的RISC-V模拟器,以及一个微小的RISC-V宿主虚拟机。

RISC-U指令集

RISC-U是64位RISC-V指令集的一个小子集。Selfie系统实现了一个以RISC-U为目标的编译器以及一个解释RISC-U代码的RISC-U模拟器。RISC-U只包含下面列出的14条指令。有关RISC-U代码的精确编码、解码和语义的详细信息,请参阅Selfie实现。

机器

一个RISC-U机器有一个64位程序计数器,记作pc,32个通用64位寄存器,编号从031,分别记作zeroraspgptpt0-t2s0-s1a0-a7s2-s11t3-t6,以及4GB的字寻址内存。

寄存器zero总是包含值0。任何尝试更新zero中的值的尝试都将被忽略。

指令

RISC-U指令以每条32位(4字节)编码,并存储在内存中,以便每64位双字有两个指令。然而,内存只能以64位双字粒度访问。

以下RISC-U指令规范中使用的参数 rdrs1rs2 可以代表任意32个通用寄存器。

参数 imm 表示一个有符号整数,其位数根据指令而定。

初始化

lui rd,imm:将 rd 设置为 imm 乘以 2 的 12 次方,即 rd = imm * 2^12;程序计数器 pc 增加 4。

addi rd,rs1,imm:将 rd 设置为 rs1 加上 imm,即 rd = rs1 + imm;程序计数器 pc 增加 4。

内存

ld rd,imm(rs1):将内存中 rs1 加上 imm 的位置的值赋给 rd,即 rd = memory[rs1 + imm];程序计数器 pc 增加 4。

sd rs2,imm(rs1):将 rs2 的值存储到内存中 rs1 加上 imm 的位置,即 memory[rs1 + imm] = rs2;程序计数器 pc 增加 4。

算术

add rd,rs1,rs2:将 rs1rs2 相加,结果赋给 rd,即 rd = rs1 + rs2

sub rd,rs1,rs2:将 rs1rs2 相减,结果赋给 rd,即 rd = rs1 - rs2

mul rd,rs1,rs2:将 rs1rs2 相乘,结果赋给 rd,即 rd = rs1 * rs2

divu rd,rs1,rs2: rd = rs1 / rs2; pc = pc + 4 其中 rs1rs2 是无符号整数。

remu rd,rs1,rs2: rd = rs1 % rs2; pc = pc + 4 其中 rs1rs2 是无符号整数。

比较

sltu rd,rs1,rs2: if (rs1 < rs2) { rd = 1 } else { rd = 0 } pc = pc + 4 其中 rs1rs2 是无符号整数。

控制

beq rs1,rs2,imm: if (rs1 == rs2) { pc = pc + imm } else { pc = pc + 4 }-2^12 <= imm < 2^12 以及 imm % 2 == 0

jal rd,imm: rd = pc + 4; pc = pc + imm-2^20 <= imm < 2^20 以及 imm % 2 == 0

jalr rd,imm(rs1): tmp = ((rs1 + imm) / 2) * 2; rd = pc + 4; pc = tmp-2^11 <= imm < 2^11

系统

ecall:系统调用号位于 a7,参数位于 a0-a2,返回值位于 a0

许可证

版权所有 (c) 2020,Selfie 作者。保留所有权利。

遵循 MIT 许可协议。

依赖项

约 2MB
约 37K SLoC