TinyVM-Go is a virtual machine with the goal of having a small footprint. Translating the source code into bytecodes that we can operate.
TinyVM-Go is inspired by the project [tinyvm] (https://github.com/jakogut/tinyvm) and implemented it in pure go.
Run
go get -v github.com/EricYT/tinyvm-go
cd $GOPATH/src/github.com/EricYT/tinyvm-go
make
or
make build
to complie these codes. This will use a docker image to build it, with
the current directory volume-mounted into place. This will store incrmental
state for the fastest possible build.
Run make all-build
to build for all architectures.
Run make clean
to clean up.
The program source file ./programs/tinyvm/jsr.vm
print_eax:
push ebp
mov ebp, esp
prn eax
pop ebp
ret
start:
mov eax, 42
call print_eax
mov eax, 23
call print_eax
Run
./bin/amd64/tvm ./programs/tinvm/jsr.vm
2018/01/11 21:26:10 Prepare to interpret the file programs/tinyvm/jsr.vm
42
23
There a simple debug tool named tdb
inspired by gdb
.
$ cat ./programs/tinyvm/jsr.vm
print_eax:
push ebp
mov ebp, esp
prn eax
pop ebp
ret
start:
mov eax, 42
call print_eax
mov eax, 23
call print_eax
$ ./bin/amd64/tdb programs/tinyvm/jsr.vm
2018/01/11 21:32:10 Prepare to interpret the file programs/tinyvm/jsr.vm
tdb >: bs 1
WARNING: "bs" is not a valid command.
tdb >: break 1
tdb >: run
BreakPoint hit at address: 1
tdb >: instr
Instruction index 1: mov ebp esp
tdb >: args
current program eip: 1 opcode: 2 instruction: mov
args: 67108864 67108862
tdb >: infos
register infos:
register eax value: i32: 42 i32Ptr is nil
register ebx value: i32: 0 i32Ptr is nil
register ecx value: i32: 0 i32Ptr is nil
register edx value: i32: 0 i32Ptr is nil
register esi value: i32: 0 i32Ptr is nil
register edi value: i32: 0 i32Ptr is nil
register esp value: i32: 67108862 i32Ptr is nil
register ebp value: i32: 67108864 i32Ptr is nil
register eip value: i32: 1 i32Ptr is nil
register r08 value: i32: 0 i32Ptr is nil
register r09 value: i32: 0 i32Ptr is nil
register r10 value: i32: 0 i32Ptr is nil
register r11 value: i32: 0 i32Ptr is nil
register r12 value: i32: 0 i32Ptr is nil
register r13 value: i32: 0 i32Ptr is nil
register r14 value: i32: 0 i32Ptr is nil
register r15 value: i32: 0 i32Ptr is nil
FLAGS: 0 Remainder: 0
tdb >: step
Advancing instruction pointer to 2
tdb >: step
42
Advancing instruction pointer to 3
tdb >: continue
BreakPoint hit at address: 1
tdb >: step
Advancing instruction pointer to 2
tdb >: continue
23
End of program readched.
- tdb print file source code