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