From 3e6bf6091cc32cf11d61c0250bde9115208ad5d5 Mon Sep 17 00:00:00 2001 From: Mistivia Date: Sat, 7 Dec 2024 22:54:12 +0800 Subject: simplify asm language --- .gitignore | 3 +++ Makefile | 8 ++++++-- assembler/fvm-as.scm | 9 +++++---- compile_commands.json | 43 ------------------------------------------- examples/fibo.asm | 25 ++++++++----------------- src/fvm.c | 4 ++++ 6 files changed, 26 insertions(+), 66 deletions(-) delete mode 100644 compile_commands.json diff --git a/.gitignore b/.gitignore index 6f1c27d..cc0ac3f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ fvm *.d *.bin .cache +compile_commands.json +fvm-as +debug-*.sh diff --git a/Makefile b/Makefile index 1a79f46..6ef7466 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,18 @@ target = fvm -cflags = -g +cflags = -g -O3 ldflags = -lm cc = gcc +csc = chicken-csc src = $(shell find src/ -name '*.c' -not -name 'main.c') obj = $(src:.c=.o) tests=$(shell find tests/ -name '*.c') tests_bin=$(tests:.c=.bin) -all: $(target) +all: $(target) fvm-as + +fvm-as: assembler/fvm-as.scm + $(csc) $< -o $@ full: all $(tests_bin) diff --git a/assembler/fvm-as.scm b/assembler/fvm-as.scm index 555f36f..a057a63 100644 --- a/assembler/fvm-as.scm +++ b/assembler/fvm-as.scm @@ -39,10 +39,10 @@ (define pseudo-op-table (alist->hash-table '((rel . (pc add)) - (bpick . ((imm 8) mul bp add ld)) - (spick . ((imm 8) mul sp add ld)) - (bput . ((imm 8) mul bp add st)) - (sput . ((imm 8) mul bp add st))))) + (ldarg . ((imm 2) add (imm 8) mul bp add ld)) + (ldvar . ((imm -1) swap sub (imm 8) mul bp add ld)) + (starg . ((imm 2) add (imm 8) mul bp add st)) + (stvar . ((imm -1) swap sub (imm 8) mul bp add st))))) (define (is-pseudo-op? sym) (hash-table-ref/default pseudo-op-table sym #f)) @@ -60,6 +60,7 @@ (match lst (() (reverse ret)) (('imm num . r) (loop r (cons (list 'imm num) ret))) + (((? number? x) . r) (loop r (cons (list 'imm x) ret))) ((x . r) (if (keyword? x) (loop r (cons (list 'tag diff --git a/compile_commands.json b/compile_commands.json deleted file mode 100644 index 5702bfd..0000000 --- a/compile_commands.json +++ /dev/null @@ -1,43 +0,0 @@ -[ - { - "arguments": [ - "/usr/bin/gcc", - "-c", - "-g", - "-o", - "src/fvm.o", - "src/fvm.c" - ], - "directory": "/home/mistivia/repos/fvm", - "file": "/home/mistivia/repos/fvm/src/fvm.c", - "output": "/home/mistivia/repos/fvm/src/fvm.o" - }, - { - "arguments": [ - "/usr/bin/gcc", - "-c", - "-g", - "-o", - "src/main.o", - "src/main.c" - ], - "directory": "/home/mistivia/repos/fvm", - "file": "/home/mistivia/repos/fvm/src/main.c", - "output": "/home/mistivia/repos/fvm/src/main.o" - }, - { - "arguments": [ - "/usr/bin/gcc", - "-c", - "-Isrc/", - "-g", - "src/fvm.o", - "-o", - "tests/test_opcodes.bin", - "tests/test_opcodes.c" - ], - "directory": "/home/mistivia/repos/fvm", - "file": "/home/mistivia/repos/fvm/tests/test_opcodes.c", - "output": "/home/mistivia/repos/fvm/tests/test_opcodes.bin" - } -] diff --git a/examples/fibo.asm b/examples/fibo.asm index 7aa0cb9..5be4217 100644 --- a/examples/fibo.asm +++ b/examples/fibo.asm @@ -1,34 +1,25 @@ ;; fibo(30) - imm 30 + 30 fibo rel call ;; pop arguments and push return value to stack pop rv ;; call print_number (syscall number is 1) - imm 1 syscall + 1 syscall exit -fibo: - ;; setup stack pointer and base pointer - bp sp sbp - ;; get first argument - imm 2 bpick +fibo: ;; function fibo(x) ;; if (x > 2) then - imm 2 gt + 0 ldarg 2 gt .else rel jz ;; return fibo(x - 2) + fibo(x - 1) - imm 2 bpick - imm 1 sub + 0 ldarg 1 sub fibo rel call pop rv - imm 2 bpick - imm 2 sub + 0 ldarg 2 sub fibo rel call pop rv add srv - .end rel jmp + ret .else: ;; else return 1 - imm 1 srv - .end rel jmp -.end: - bp ssp sbp + 1 srv ret diff --git a/src/fvm.c b/src/fvm.c index 3a5a4e2..1384e92 100644 --- a/src/fvm.c +++ b/src/fvm.c @@ -340,8 +340,12 @@ int64_t fvm_execute(struct fvm *vm) { a = fvm_pop(vm); fvm_push(vm, vm->pc + 1); vm->pc = a; + fvm_push(vm, vm->bp); + vm->bp = vm->sp; break; case FVM_OP_RET: + vm->sp = vm->bp; + vm->bp = fvm_pop(vm); a = fvm_pop(vm); vm->pc = a; break; -- cgit v1.0