8个版本
0.3.1 | 2020年11月11日 |
---|---|
0.3.0 | 2020年11月6日 |
0.2.0 | 2020年10月19日 |
0.1.4 | 2020年10月18日 |
#308 在 模拟器
28 每月下载量
11KB
99 行
imperative-rs
此crate提供了一种特质定义、错误类型和过程宏,可以从枚举类型自动派生指令集。
imperative_rs::InstructionSet
特质包含两个函数。 fn InstructionSet::encode(&&self, buf:&mut [u8]) -> Result<usize, EncodeError>
将指令(即枚举变体)编码为操作码(即字节数组),返回写入的字节数。 fn decode(&mem:&[u8]) -> Result<(usize, Self), DecodeError>
从字节数组中解码指令,并返回指令和读取的字节数。
指令集由对应 枚举
变体的属性定义。指令集可以定义为二进制或十六进制字符串,可以包含下划线以增强可读性,并使用变量名。这种方式允许用户编码变量的位置,但同时也意味着变量名只能有一个符号长(目前是这样)且不能包含十六进制数字。
示例
use imperative_rs::InstructionSet;
#[derive(InstructionSet)]
enum Is {
//constant opcode
#[opcode = "0x0000"]
Nop,
//hex opcode with split variable x
#[opcode = "0x1x0x"]
Inc{x:u8},
//hex opcode with three variables
#[ opcode = "0x2xxyyzz" ]
Add{x:u8, y:u8, z:u8},
//bin opcode with two variables and underscores for readability
#[ opcode = "0b100000000_xxxxyyyyy_xyxyxyxy" ]
Mov{x:u8, y:i8},
}
fn main() {
let mut mem = [0u8; 1024];
let (num_bytes, Is::Nop) = Is::decode(&mem).unwrap();
let instruction = Is::Add{x:0xab, y:0xcd, z:0xef};
assert_eq!(4, instruction.encode(&mut mem[100..]);
assert_eq!([0x2a, 0xbc, 0xde, 0xf0], mem[100..104])
}
依赖项
~1.5MB
~35K SLoC