aboutsummaryrefslogtreecommitdiff
path: root/test.asm
diff options
context:
space:
mode:
Diffstat (limited to 'test.asm')
-rw-r--r--test.asm25
1 files changed, 21 insertions, 4 deletions
diff --git a/test.asm b/test.asm
index 6f857b8..8131003 100644
--- a/test.asm
+++ b/test.asm
@@ -1,5 +1,7 @@
+ ;; Allocate a buffer of 3 characters
malloc.byte 3
mov.word 0
+ ;; Setup the buffer to be equivalent to "abc"
push.reg.word 0
push.byte 'a'
mset.byte 0
@@ -10,36 +12,51 @@
push.byte 'c'
mset.byte 2
+ ;; Save buffer to W[8] because the first 8 registers should be
+ ;; reserved for library routines as it may be overwritten
push.reg.word 0
mov.word 8
+
push.reg.word 0
+ ;; Call the routine
call print_cptr
+
+ ;; Delete allocated buffer
push.reg.word 8
mdelete
- push.byte '\n'
- print.char
-
halt
;;; print_cptr: Prints pointer to a buffer of characters. Pointer
;;; should be on the stack as a word.
print_cptr:
+ ;; Save pointer in layout to W[0], P -> W[0]
mov.word 0
+ ;; iterator I -> W[1]
push.word 0
mov.word 1
- push.reg.word 0
+ ;; (W[0])[W[1]] -> P[I]
+ push.reg.word 0 ; <-- #
push.reg.word 1
mget.stack.byte
print.char
+
+ ;; I += 1
push.reg.word 1
push.word 1
plus.word
mov.word 1
+
+ ;; if I != |P| ...
push.reg.word 1
push.reg.word 0
msize
eq.word
not.byte
+ ;; then go to #
jump.if.byte *-13
+ ;; else print a newline
+ push.byte '\n'
+ print.char
+ ;; return back to the caller
ret