Categories Uncategorized

I made a virtual machine interpreter for embedded devices

machine code

Meet picoVM. A fully featured, minimal footprint, VM for embedded devices.

Written in pure C for maximum efficiency and portability. Essentially just a single header file and one source file that you can include in your project.

The machine supports 8,16 and 32bit integer operations along with floating point numbers. You get this at a 1000 bytes footprint, and by removing unnecessary features you can get down to 700 bytes. 

You can get the source code at my GitHub page here. Along the source code you can find examples that make use of the VM, along with a -crude- assembler. 

Here is what a hello world program looks like in picoVM:

;
;  Hello world example in picoVM assembly
;

loop:       LOAD16 message      ; load the message address
            LOAD16 [idx]        ; load the index
            LOAD                ; using the loaded address and index load the char
            JEQ finish          ; if zero the string terminated 

            CALLUSER            ; print the character

            POP                 ; pop the character

            LOAD [idx]          ; Increase the index
            LOAD 1              ;
            ADD                 ;
            STORE [idx]         ;

            JMP loop            ; repeat

finish:
            HLT

idx:        DB 0x0000

message:    DB "Hello World!"
            DB 0x00

Yes, I know, I just put assembly code in front of your eyes. I am not sorry! There are more advanced examples in the source code, if you are interested. 

Now, lets see who will create an LLVM backend for this… Have fun!

About the author