;; ggT in Scheme (define (gcd a b) (if (= b 0) a (gcd b (remainder a b)))) ;; ggT-Maschine (data-paths (a (a<-b (register b))) (b (b<-t (register t))) (t (t<-r (operation rem))) (flags (=0 (operation =0)))) (operations (rem (a b)) (=0 (b))) (controller test (=0) (branch gcd-done) (t<-r) (a<-b) (b<-t) (goto test) gcd-one) ;; ggT im Drei-Adreß-Format (registers a b t) (operations rem =) (controller test (test (op =) (reg b) (const 0)) (branch (label gcd-done)) (assign t (op rem) (reg a) (reg b)) (assign a (reg b)) (assign b (reg t)) (goto (label test)) gcd-done) ;; Divisionsrest in Scheme (define (remainder n d) (if (< n d) n (remainder (- n d) d))) ;; ggT-Maschine mit ausprogrammiertem Divisionsrest (registers a b t) (operations = < -) (controller test (test (op =) (reg b) (const 0)) (branch (label gcd-done)) (assign t (reg a)) rem-loop (test (op <) (reg t) (reg b)) (branch (label rem-done)) (assign t (op -) (reg t) (reg b)) (goto (label rem-loop)) rem-done (assign a (reg b)) (assign b (reg t)) (goto (label test)) gcd-done)