An open API service indexing awesome lists of open source software.

https://github.com/tarekwiz/smallvm

A very small and minimal virtual machine written in rust.
https://github.com/tarekwiz/smallvm

rust rust-lang virtual-machine

Last synced: 9 months ago
JSON representation

A very small and minimal virtual machine written in rust.

Awesome Lists containing this project

README

          

# smallvm
A very minimal virtual machine written in rust.
### The virtual machine has:
- 8 Registers
- A stack
- A heap
- Data types include: u8, i8, u16, i16, u32, i32, u64, i64, f32, f64

## Instruction Set

### Root assembly instructions

| 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 |

### Debugging assembly instructions

| Instruction | Left Input | Right Input | Operation |
| ----------- | ---------- | ----------- | --------- |
| PRINTR | Register | | Print contents of register |
| PRINTV | Address | | Print contents of variable at address |

## Example Program:

```
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()
```