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