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.
- Host: GitHub
- URL: https://github.com/tarekwiz/smallvm
- Owner: tarekwiz
- Created: 2020-06-03T16:49:56.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2020-06-06T07:08:10.000Z (about 6 years ago)
- Last Synced: 2025-04-15T21:40:41.589Z (about 1 year ago)
- Topics: rust, rust-lang, virtual-machine
- Language: Rust
- Size: 13.7 KB
- Stars: 108
- Watchers: 4
- Forks: 5
- Open Issues: 10
-
Metadata Files:
- Readme: README.md
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()
```