wlvm
Virtual machine with associated language written in Rust
Installation
cargo install wlvm
(https://crates.io/crates/wlvm)
Build
git clone https://github.com/wafelack/wlvm
cd wlvm/
cargo build
cargo test
Usage
Run repl
wlvm
Run program
wlvm run $program
Dump program's memory and registers
wlvm dump $program
Details
Virtual Machine datasheet
Registers
There are 6 multi purposes registers, marked from a to f.
There are 4 special registers :
- sp : The stack pointer
- ip : The instruction pointer
- st : The stack top value
- eq : The result of the last test performed
Instruction Set
Stack instructions
- psh <integer> : Pushes an integer onto the stack
- pop : Pops the stack
Arithmetic operations
- add <register_a> <register_b> : Adds the content of register_b to register_a
- sub <register_a> <register_b> : Substracts the content of register_b to register_a
- mul <register_a> <register_b> : Multiplies the content of register_b to register_a
- div <register_a> <register_b> : Divides the content of register_a by register_b
Memory operations
- mov <register_a> <register_b> : Copies content of register_b in register_a
- jmp <instruction> : Jump to <instruction> if Eq register is true
Boole algebra operations
- tee <register_a> <register_b> : Test if register_a == register_b
- tne <register_a> <register_b> : Test if register_a != register_b
- tll <register_a> <register_b> : Test if register_a < register_b
- tmm <register_a> <register_b> : Test if register_a > register_b
- tel <register_a> <register_b> : Test if register_a <= register_b
- tem <register_a> <register_b> : Test if register_a >= register_b
Other
-
dmp : Dumps the stack and the registers
-
drg <register> : Prints the content of the specified register
-
prt <register> : Prints the character corresponding to register value
-
hlt : Stops the program