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 每月下载量

MIT/Apache

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