wip stack oriented VM
This commit is contained in:
parent
054012418b
commit
51f7c33011
|
@ -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")
|
||||||
|
|
|
@ -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")
|
||||||
|
|
Loading…
Reference in New Issue