;; list operation in S2 ;; P. Chongstitvatana 12 Feb 2007 ;; register convention ;; r31 system stack ;; r30 display ;; r29 link register ;; r28 return value .symbol NIL -1 ;; list operators ;; input r1, (r2 for cons) .code 200 :head ld r28 @0 r1 ret r29 :tail ld r28 @1 r1 ret r29 :isatom ld r28 @0 r1 ;; get head lt r28 r28 #10 ;; value < 10 is atom ret r29 :atom trap 5 ;; get a cell st @0 r28 r0 ;; set head slot to type int st @1 r28 r1 ;; set tail to be NIL ret r29 :cons ;; cons r1 r2 trap 5 ;; get a cell st @0 r28 r1 st @1 r28 r2 ret r29 ;; Count the number of elements in a list :count ;; input in r1, use r3 push r31 r29 ;; save link, recursive call push r31 r3 eq r3 r1 #NIL jf r3 count1 mv r28 #0 ;; return 0 jmp count2 :count1 jal r29 tail ;; call tail(e) mv r1 r28 jal r29 count ;; call count(tail(e)) add r28 r28 #1 ;; return 1 + count(tail(e)) :count2 pop r31 r3 pop r31 r29 ret r29 ;; Now we try the program .code 0 :main mv r31 #1000 ;; system stack at 1000 jal r29 make mv r30 r28 trap 6 ;; print list mv r1 r28 ;; r1 = (1 2 3) jal r29 count ;; count it mv r30 r28 trap 1 ;; print result trap 0 ;; make a list of (1 2 3) ;; use r1 r2, return r28 :make push r31 r29 mv r1 #3 jal r29 atom mv r1 r28 mv r2 #NIL jal r29 cons ;; cons(atom(3),NIL) mv r2 r28 ;; r2 = (3) mv r1 #2 jal r29 atom mv r1 r28 jal r29 cons ;; cons(atom(2),r2) mv r2 r28 ;; r2 = (2 3) mv r1 #1 jal r29 atom mv r1 r28 jal r29 cons ;; cons(atom(1),r2) pop r31 r29 ret r29 .end