Stack-based virtual machine. Version 1.0.4.
Code
Instruction
0x11
";" (comment)
0x22
"labl" (label)
Code
Instruction
0xAA
(void string)
0xBB
(undefined code)
Bytecode
Stack
Args
Instruction
0x0A
0
1
push
0x0B
1
0
pop
0x0C
1
0
inc
0x0D
1
0
dec
0x0E
3
0
jg
0x0F
3
0
je
0x1A
1
0
jmp
0x1B
2
0
stor
0x1C
1
0
load
0x1D
1
0
call
0x1E
0
0
hlt
extern int cvm_compile (FILE * output , FILE * input );
extern int cvm_load (uint8_t * memory , int32_t msize );
extern int cvm_run (int32_t * * output , int32_t * input );
Bytecode
Stack
Args
Instruction
0xA0
2
0
add
0xB0
2
0
sub
0xC0
2
0
mul
0xD0
2
0
div
0xE0
2
0
mod
0xF0
2
0
shr
0xA1
2
0
shl
0xB1
2
0
xor
0xC1
2
0
and
0xD1
2
0
or
0xE1
1
0
not
0xF1
3
0
jl
0xA2
3
0
jne
0xB2
3
0
jle
0xC2
3
0
jge
0xD2
1
0
allc
$ make install
> git clone https://github.com/number571/extclib.git
$ make
> gcc -o cvm -Wall -std=c99 cvm.c cvmkernel.c extclib/type/stack.c extclib/type/hashtab.c extclib/type/list.c
> ./cvm build main.vms -o main.vme
> ./cvm run main.vme
>
{
"result": [50],
"return": 0
}
Example: mul5 function (assembly code)
labl _start
push begin
jmp
; main
labl begin
; mul5(x) = x * 5
; where x = 10
push 10
push mul5
call
push end
jmp
; exit
labl end
hlt
; x = arg[1]
labl mul5
; y = x * 5
push - 2
load
push 5
mul
; x = y
push - 1
push - 3
stor
; return
pop
jmp
Example: mul5 function (binary code)
0a00 0000 061a 0a00 0000 0a0a 0000 0018
1d0a 0000 0017 1a1e 0aff ffff fe1c 0a00
0000 05c0 0aff ffff ff0a ffff fffd 1b0b
1a