;; file: sumdigits.s ;; author: SS ;; date: Sep 11, 2019 ;; ;; This program reads in a nonnegative integer n, then prints ;; the sum of the digits of n (when written in base-10). It ;; demonstrates how to write recursive functions in SLIM. ;; ;; The SLIM code translates the following python code: ;; ;; def sumdigits(n): ;; if n < 10: ;; return n ;; return sumdigits(n // 10) + n % 10 allocate-registers sumdigits test n one ten cont sp s recursiveCase li sp 0 li one 1 li ten 10 li sumdigits sumdigitsL li recursiveCase recursiveCaseL read n li cont backL j sumdigits backL: write s halt ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; function: sumdigits ;; input registers: n ;; output register: s ;; return address register: cont ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; sumdigitsL: slt test n ten ; if n < 10: jeqz test recursiveCase li s 0 ; return n in s add s s n j cont recursiveCaseL: ; save context: n, cont st n sp add sp sp one st cont sp add sp sp one li cont afterL div n n ten j sumdigits ; computes sumdigits(n // 10) and get the result in s afterL: ; retrive context: cont, n sub sp sp one ld cont sp sub sp sp one ld n sp rem n n ten add s s n ; s now contains s + n % 10 j cont