SICP 読み (243) 5.2 レジスタ計算機での計算

もの凄いスピード感。これは一種の vm なんだろうか、と言いつつざくざく進んでいく。現在アセンブラな部分でちょっと停滞している状態ッス。とりあえず問題 5.7 を。

問題 5.7

これはシミュレータがまだ無いので机上ベースで。シミュレータができ次第、戻って試験実施、ってコトで。

(define expt-machine
  (make-machine
   '(b n continue val)
   (list (list '- -) (list '* *) (list '= =))
   '(controller
     (assign continue (label expt-done))
     expt-loop
     (test (op =) (reg n) (const 0))
     (branch (label base-case))
     (save continue)
     (save n)
     (assign n (op -) (reg n) (const 1))
     (assign continue (label after-expt))
     (goto (label expt-loop))
     after-expt
     (restore n)
     (restore continue)
     (assign val (op *) (reg b) (reg val))
     (goto (reg continue))
     base-case
     (assign val (const 1))
     (goto (reg continue))
     expt-done)))

controller って不要なのだろうか。多分要らんのだろうな。

(set-register-contents! expt-machine 'b 2)
done
(set-register-contents! expt-machine 'n 5)
done
(start expt-machine)
done
(get-register-contents expt-machine 'val)
32

ってカンジになるんだろうか。あるいは b. なソレだと以下ですか。

(define expt-machine
  (make-machine
   '(b n c p)
   (list (list '= =) (list '- -) (list '* *))
   '((assign c (reg n))
     (assign p (const 1))
     test-b
     (test (op =) (reg c) (const 0))
     (branch (label expt-done))
     (assign c (op -) (reg c) (const 1))
     (assign p (op *) (reg b) (reg p))
     (goto (label test-b))
     expt-done)))

で、こんなカンジ??
# count とかヤッてる (修正済み

(set-register-contents! expt-machine 'b 2)
done
(set-register-contents! expt-machine 'n 5)
done
(start expt-machine)
done
(get-register-contents expt-machine 'p)
32

うーん。とりあえず assemble 以降に目を通してみます。