(load "5.13.scm") (define expt-recur (make-machine (list (list '= =) (list '- -) (list '* *)) '( (assign continue (label expt-done)) expt-loop (test (op =) (reg n) (const 0)) (branch (label return-one)) (save continue) (assign continue (label got-result)) (assign n (op -) (reg n) (const 1)) (goto (label expt-loop)) got-result (restore continue) (assign val (op *) (reg b) (reg val)) (goto (reg continue)) return-one (assign val (const 1)) (goto (reg continue)) expt-done))) (define (test-expt-recur) (set-register-contents! expt-recur 'b 7) (set-register-contents! expt-recur 'n 3) (start expt-recur) (get-register-contents expt-recur 'val)) (define expt-iter (make-machine (list (list '= =) (list '- -) (list '* *)) '( (assign val (const 1)) loop (test (op =) (reg n) (const 0)) (branch (label end)) (assign val (op *) (reg val) (reg b)) (assign n (op -) (reg n) (const 1)) (goto (label loop)) end))) (define (test-expt-iter) (set-register-contents! expt-iter 'b 7) (set-register-contents! expt-iter 'n 3) (start expt-iter) (get-register-contents expt-iter 'val))