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 中使用
39KB
808 行
RISC-U
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位寄存器,编号从0到31,分别记作zero、ra、sp、gp、tp、t0-t2、s0-s1、a0-a7、s2-s11、t3-t6,以及4GB的字寻址内存。
寄存器zero总是包含值0。任何尝试更新zero中的值的尝试都将被忽略。
指令
RISC-U指令以每条32位(4字节)编码,并存储在内存中,以便每64位双字有两个指令。然而,内存只能以64位双字粒度访问。
以下RISC-U指令规范中使用的参数 rd、rs1 和 rs2 可以代表任意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:将 rs1 和 rs2 相加,结果赋给 rd,即 rd = rs1 + rs2。
sub rd,rs1,rs2:将 rs1 和 rs2 相减,结果赋给 rd,即 rd = rs1 - rs2。
mul rd,rs1,rs2:将 rs1 和 rs2 相乘,结果赋给 rd,即 rd = rs1 * rs2。
divu rd,rs1,rs2: rd = rs1 / rs2; pc = pc + 4 其中 rs1 和 rs2 是无符号整数。
remu rd,rs1,rs2: rd = rs1 % rs2; pc = pc + 4 其中 rs1 和 rs2 是无符号整数。
比较
sltu rd,rs1,rs2: if (rs1 < rs2) { rd = 1 } else { rd = 0 } pc = pc + 4 其中 rs1 和 rs2 是无符号整数。
控制
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