- mvm: A VM, just like jvm.
- masm: A Compiler that compiles the VM's Assembly language.
- msm: Assembly language for the VM.
- demasm: Disassembler for the bytecode.
A Virtual Machine capable of running bytecode, just like jvm. It is used to run programs generated by masm.
Features:
- Stack size: 942
- Turing Complete
- Own asm language
> mvm.exe -i [input.mbc]
To see a list of all Flags type:
> mvm.exe -h
The Compiler that compiles msm to .mbc (Minimalistic byte code) files.
> masm.exe [input.vsm] [output.sbc]
The Disassembler for the bytecode generated by the masm compiler.
> demasm.exe [input.sbc]
Assembly language for the Virtual Machine.
msm has no registers and is there for completely stack based.
Also the maximum amount of operands is only one.
NOTE: For code examples see ./examples/.
Instruction | Arguments | Description |
---|---|---|
push | value |
Pushes a value on to the stack. |
dup | addr |
Duplicates the value at the given stack addr . |
swap | addr |
Swaps the top value and the value at the given addr . |
drop | NONE | Removes the top value from the stack. |
plusi | stack: a, b |
Adds the top two values on the stack. (for integers) |
minusi | stack: a, b |
Subtracts the top two values on the stack. (for integers) |
multi | stack: a, b |
Multiplies the top two values on the stack. (for integers) |
divi | stack: a, b |
Divides the top two values on the stack. (for integers) |
plusf | stack: a, b |
Adds the top two values on the stack. (for floats) |
minusf | stack: a, b |
Subtracts the top two values on the stack. (for floats) |
multf | stack: a, b |
Multiplies the top two values on the stack. (for floats) |
divf | stack: a, b |
Divides the top two values on the stack. (for floats) |
equal | stack: a, b |
Pushes ZERO on the stack if the top two values are not equal, else it pushes ONE. |
not | stack: a |
Reverses the top value on the stack. e.g. 0 to 1 and 1 to 0 (for integers, 0-1) |
geeqf | a, b |
Pushes ZERO on the stack if the top value on the stack is grater or equal to the second value. (for floats) |
geeqi | a, b |
Pushes ZERO on the stack if the top value on the stack is grater or equal to the second value. (for integers) |
leeqf | a, b |
Pushes ZERO on the stack if the top value on the stack is less or equal to the second value. (for floats) |
leeqi | a, b |
Pushes ZERO on the stack if the top value on the stack is less or equal to the second value. (for integers) |
jmp | label or addr |
Jumps to the the given label or addr . |
jmpif | label or addr |
Jumps to the the given label or addr if the top value on the stack is ZERO. |
call | label or addr |
Jumps to the the given label or addr and pushes the addr from the instruction after the current instruction on to the stack. |
ret | stack: addr |
Jumps to the the given addr (top value on the stack). |
int | interruptAddr stack: args |
Generates a software interrupt and calls one of the interrupt functions pointed to by the given interruptAddr , the args are parsed from the stack. |
hlt | NONE | Stops the execution. |
You can define a label
by writing the name
followed by a colon.
You are also able to write one instruction
on the same line as the label
definition as shown below.
;; Fibonacci example
%include "../msmlib/stdlib.mlb"
jmp main
; Iterations:
%define I 30
; Define a label:
main:
push 0
push 1
push I
; Define a label with instruction on same line:
loop: swap 2
dup 0
call println_u64
dup 1
plusi
swap 1
swap 2
push 1
minusi
dup 0
push 0
equal
not
jmpif loop
hlt
In msm calls
are just like label jmps
with the addition that you have
to kep track of the return addr
that is pushed one the stack by the call instruction
.
%include "../msmlib/stdlib.mlb"
jmp main
%define A 10
%define B 5
;; Function that adds to nums togeter ;;
add:
swap 2 ; Swap the return addr to the bottom.
plusf
swap 1
ret
;; ---------------------------------- ;;
main:
push A
push B
call add ; Calls the functions
ncall println_u64 ; Prints the result
hlt
Instruction | Arguments | Description |
---|---|---|
define | name value |
Defines a constant with name name and value value |
include | path |
Includes a masm lib located at the given path . |
In msm all directives start with a percent sign as shown below.
%include "../msmlib/stdlib.mlb"
%define NUMBER 420
The value can also be a string.
%define STRING "Some string.\n"
Interrupt name | Address | args | Description |
---|---|---|---|
print_char | 0 | ascii_code |
Prints the given ascii_code value as char to stdout. |
print_f64 | 1 | f64_value |
Prints the given f64_value value to stdout. |
print_i64 | 2 | i64_value |
Prints the given i64_value value to stdout. |
print_u64 | 3 | u64_value |
Prints the given u64_value value to stdout. |
print_ptr | 4 | ptr |
Prints the given ptr value to stdout. |
alloc | 5 | size |
Allocates a block of memory, returning a pointer to the beginning of the block. |
free | 6 | ptr |
Deallocates a space previously allocated by alloc, using the given 'ptr' value. |
mem_dump | 7 | ptr size |
Dumps the memory, starting from the given ptr up to ptr + size . |
write | 8 | ptr str_size |
Writes a memory string to stdout. |
readline | 9 | NONE | Reads a line from stdin to the stack in reverse. |
In msm interrupts are used as shown below. All args are parsed over the stack.
push 420
int 2 ; print_u64