diff options
Diffstat (limited to 'examples')
-rw-r--r-- | examples/memory-print.asm | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/examples/memory-print.asm b/examples/memory-print.asm new file mode 100644 index 0000000..ed32b7a --- /dev/null +++ b/examples/memory-print.asm @@ -0,0 +1,64 @@ +;;; memory-print: An example program that features a subroutine for +;;; printing a memory buffer, of any length, as characters. + ;; 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 + push.reg.word 0 + push.byte 'b' + mset.byte 1 + push.reg.word 0 + 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 + + 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 + ;; (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 |