64位栈式虚拟机

Mistivia 8be90132c8 add docs 4 months ago
assembler 3e6bf6091c simplify asm language 4 months ago
examples 3e6bf6091c simplify asm language 4 months ago
scripts 789ebeb7d0 finish project framework 4 months ago
src 3e6bf6091c simplify asm language 4 months ago
tests 04f8a72b14 add test case for basic opcodes 4 months ago
.gitignore 3e6bf6091c simplify asm language 4 months ago
LICENSE 39f1c73025 add license 4 months ago
Makefile 3e6bf6091c simplify asm language 4 months ago
README.md 8be90132c8 add docs 4 months ago

README.md

Fantasy Virtual Machine

A 64-bit stack-based virtual machine and its assembler, created for fun.

Build

FVM includes two parts: the virtual machine and the assembler.

The build the assembler, you need to intall CHICKEN Scheme first. For example, on Arch Linux:

sudo pacman -S chicken

Then install CHICKEN Scheme dependencies:

sudo chicken-install matchable srfi-69 srfi-4

Then run make, which will build both components:

make

If successful, you will see two executables, the virtual machine fvm and the assemblerfvm-as.

Run

After writing the assembly code (examples can be found in the examples directory), first run the assembler:

./fvm-as input.asm bytecode.bin

This will generate the bytecode file output.bin. Then run the virtual machine:

./fvm bytecode.bin

Registers

FVM contains 4 registers:

  • SP: stack pointer
  • BP:base pointer
  • PC:program counter
  • RV: returned value

There are no general-purpose registers; all operations happen on the stack.

Opcodes

All opcodes are single-byte, except for immediate value instructions.

The instructions supported by FVM are as follows:

Register Instructions

sp
0x00
push stack pointer to stack

ssp
0x01
pop a 64-bit number from stack and set stack pointer to it.

bp

sbp

pc

rv

srv

Immediate Number

imm

Memory

ld

ld8

ld16

ld32

st

st8

st16

st32

Stack Operations

dup

pop

swap

over

rot

Call Frame

Pseudo-Opcodes