More S2 programming examples 

(from week 7 homework)
1 multiply by repeat addition
2  reverse order of elements in an array
3  check equality of two arrays
4  solve an equation

;; multiply n by m, use repeated addition
;; result in a

;; a = 0
;; while m > 0
;;   a = a + n
;;   m = m - 1

;; let r1 = n , r2 = m, r3 = test, r4 = a
.symbol
    n 50
    m 51
.code 0
    ld r1 n
    ld r2 m
    mv r4 #0
:loop    gt r3 r2 #0
    jf r3 exit
    add r4 r4 r1
    sub r2 r2 #1
    jmp loop
:exit    trap 0
.data 50
    7 8
.end

;; reverse order of element in A[0..9]
;;   simplest way is to use another array B[0..9]
;;   i = 0, j = 9, 
;;   B[j] = A[i], i++, j--
;;   and copy B back to A

;;   i = 0, j = 9
;;   while i <= 9     put to B in reverse order
;;      B[j] = A[i]
;;      i = i + 1
;;      j = j - 1
;;   i = 0
;;   while i <= 9     copy back to A
;;      A[i] = B[i]
;;      i = i + 1

;; let r1 = i, r2 = j, r3 = test, r4 = A[i]

.symbol
    A 50
    B 80
.code 0
    mv r1 #0
    mv r2 #9
:loop1    le r3 r1 #9
    jf r3 copy
    ld r4 @A r1
    st @B r2 r4
    add r1 r1 #1
    sub r2 r2 #1
    jmp loop1
:copy     mv r1 #0
:loop2    le r3 r1 #9
    jf r3 exit
    ld r4 @B r1
    st @A r1 r4
    add r1 r1 #1
    jmp loop2
:exit    trap 0
.data 50
    11 22 33 44 55 66 77 88 99 100
.end

;; check equality of two arrays of size n
;; result is flag 1 equal, 0 not equal

;; flag = 1
;; i = 0
;; while i < n
;;   if AR[i] != BR[i]
;;      flag = 0
;;      break
;;   i = i + 1

;;  let r1 = i, r2 = n, r3 = test, r4 = flag
;;  r5 = AR[i], r6 = BR[i], r7 = test2

.symbol
    n   40
    AR  50
    BR  100
.code 0
    mv r4 #1
    mv r1 #0
    ld r2 n
:loop    lt r3 r1 r2
    jf r3 exit
    ld r5 @AR r1
    ld r6 @BR r1
    ne r7 r5 r6
    jf r7 cont
    mv r4 #0
    jmp exit
:cont    add r1 r1 #1
    jmp loop
:exit    trap 0
.data 40
    10
.data 50
    1 2 3 4 5 6 7 8 9 10
.data 100
    1 2 3 4 5 6 7 8 9 10
.end

;; solve 3x^2 + 2x + 1 = 86 by trial x 0...n

;; x = 0
;; while true
;;   t1 = 3x^2
;;   t2 = 2x
;;   t1 = t1 + t2 + 1
;;   if t1 == 86 break else x = x + 1

;; let r1 = x, r3 = t1, r4 = t2, r5 = test

.code 0
    mv r1 #0
:loop    mul r3 r1 r1    ;; x * x
    mul r3 r3 #3    ;; 3x^2
    mul r4 r1 #2    ;; 2x
    add r3 r3 r4
    add r3 r3 #1    ;; t1 + t2 + 1
    eq r5 r3 #86
    jf r5 else
    jmp exit
:else    add r1 r1 #1
    jmp loop
:exit     trap 0
.end