A very minimal virtual machine written in rust.
- 8 Registers
- A stack
- A heap
- Data types include: u8, i8, u16, i16, u32, i32, u64, i64, f32, f64
| Instruction | Left Input | Right Input | Operation |
|---|---|---|---|
| NOP | No Operation | ||
| MOV | Register | Variable | Move variable to register |
| MOVR | Register | Register | Move register contents to another register |
| JMP | Register | Jump to memory location | |
| JE | Register | Jump if equal | |
| JNE | Register | Jump not equal | |
| JG | Register | Jump if greater | |
| JL | Register | Jump if less | |
| CMP | Register | Register | Compare two registers |
| ADD | Register | Register | Add 2 registers, push result to stack |
| SUB | Register | Register | Subtract 2 registers, push result to stack |
| MUL | Register | Register | Multiply 2 registers, push result to stack |
| DIV | Register | Register | Divide 2 registers, push result to stack |
| AND | Register | Register | Bitwise AND on 2 registers, push result to stack |
| OR | Register | Register | Bitwise OR on 2 registers, push result to stack |
| XOR | Register | Register | Bitwise Exclusive OR on 2 registers, push result to stack |
| SHR | Register | Variable | Shift register to the right by Variable |
| SHL | Register | Variable | Shift register to the left by Variable |
| VPUSH | Variable | Push variable contents on to stack | |
| VPUSHR | Register | Push register contents on to stack | |
| VPOP | Variable | Pops variable from stack to register | |
| CALL | Register | Calls function at address in the register | |
| RET | Return from routine | ||
| HALT | Halt CPU/Exit | ||
| VSTORE | Address | Variable | Store var into VMHeap at specific address from stack |
| VLOAD | Address | Load var from VMHeap and push value to stack | |
| VSTORER | Address | Register | Store var in VMHeap from register contents |
| VLOADR | Register | Address | Loads a variable from VMHeap to register |
| Instruction | Left Input | Right Input | Operation |
|---|---|---|---|
| PRINTR | Register | Print contents of register | |
| PRINTV | Address | Print contents of variable at address |
1 0 0 10 MOV(R0, 10)
1 1 0 8 MOV(R1, 8)
1 2 0 22 MOV(R2, 23) Location to jump to if R0 is greater than R1
1 3 0 25 MOV(R3, 25) Location to jump to otherwise
6 0 1 CMP(R0, R1)
23 2 JG(R2) Jump if R0 is greater than R1
3 3 JMP(R3)
7 0 PRINTR(R0)
22 HALT()
7 1 PRINTR(R1)
22 HALT()