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