wip stack oriented VM

This commit is contained in:
zongor 2025-10-12 22:11:54 -07:00
parent 054012418b
commit 51f7c33011
2 changed files with 54 additions and 59 deletions

View File

@ -1,32 +1,26 @@
((code ((code
(label main (label main
(load-immediate $0 1) (push 1)
(push $0) (push 1)
(load-immediate $0 1)
(push $0)
(call &add) (call &add)
(pop $0) (int-to-string)
(int-to-string $1 $0) (call &pln)
(push $1)
(call &println)
(halt)) (halt))
(label add (label add
(pop $0) (add-int)
(pop $1)
(add-int $2 $1 $0)
(push $2)
(return)) (return))
(label println (label pln
(load-immediate $0 &terminal-namespace) (dup)
(syscall OPEN $0 $0 $0) (string-length)
(load-immediate $3 &new-line) (push &terminal-namespace)
(pop $1) (syscall WRITE)
(string-length $2 $1) (push &new-line)
(syscall WRITE $0 $1 $2) (dup)
(string-length $4 $3) (string-length)
(syscall WRITE $0 $3 $4) (push &terminal-namespace)
(syscall WRITE)
(return))) (return)))
(data (data
(label terminal-namespace "/dev/term/0") (label terminal-namespace "/dev/term/0")

View File

@ -1,42 +1,43 @@
((code ((code
(label main (label main
(load-immediate $0 35) (push 35)
(push $0)
(call &fib) (call &fib)
(pop $0) (int-to-string)
(int-to-string $1 $0)
(push $1)
(call &pln) (call &pln)
(halt)) (halt))
(label fib (label fib
(pop $0) (dup) ; dup num
(load-immediate $1 2) (push 2) ; Base case: n < 2
(jump-lt-int &base-case $0 $1) (jump-lt-int &base-case)
(load-immediate $3 2)
(sub-int $4 $0 $3) (dup)
(push $4) (push 2) ; First call: fib(n-2)
(sub-int) ; n - 2
(call &fib) (call &fib)
(load-immediate $3 1)
(sub-int $4 $0 $3) (over) ; get n over the previous answer
(push $4) (push 1) ; Second call: fib(n-1)
(call &fib) (sub-int) ; n-1 (using saved n)
(pop $4) (call &fib) ; Result in $2
(pop $5)
(add-int $6 $5 $4) ; Combine results
(push $6) (add-int) ; fib(n-2) + fib(n-1)
(return) (return) ; Return result
(label base-case (label base-case
(push $0) (return))) ; Return n directly
(return)))
(label pln (label pln
(load-immediate $0 &terminal-namespace) (dup)
(syscall OPEN $0 $0 $0) (string-length)
(load-immediate $3 &new-line) (push &terminal-namespace)
(pop $1) (syscall WRITE)
(string-length $2 $1) (push &new-line)
(syscall WRITE $0 $1 $2) (dup)
(string-length $4 $3) (string-length)
(syscall WRITE $0 $3 $4) (push &terminal-namespace)
(syscall WRITE)
(return))) (return)))
(data (data
(label terminal-namespace "/dev/term/0") (label terminal-namespace "/dev/term/0")