SICP 読み (241) 5.1 レジスタ計算機の設計

昨晩はいつの間にか死亡。今日も死にかけましたがとりあえず復活。エントリ投入にトライしてみます (何

問題 5.5

fibonacci なソレが面倒臭いな、と思いつつもとりあえず、(factorial 3) くらいでトレイスしてみる事に。
あと、どう書けば良いのか微妙ですが、とりあえず控えてみる、とゆー事で一部のみ。

(save continue) ;; 最初は (label fact-done) が continue に設定
(save n) ;; n は 3
(assign n (op -) (reg n) (const 1)) ;; n に 2 が設定
(assign continue (label after-fact)) ;; after-fact に戻る
(goto (label fact-loop))

;; (fact 2)

(save continue) ;; n が 2 の時の continue は after-fact
(save n) ;; n は 2
(assign n (op -) (reg n) (const 1)) ;; n に 1 が設定
(assign continue (label after-fact)) ;; after-fact に戻る
(goto (label fact-loop))

;; (fact 1)

(test (op =) (reg n) (const 1))
(branch (label base-case))

;; 戻りはじめの base-case

(assign val (const 1)) ;; val に 1 が設定
(goto (reg continue)) ;; continue は after-fact

;; pop が始まる

(restore n) ;; n は 2 に
(restore continue) ;; after-fact が continue に設定
(assign val (op *) (reg n) (reg val)) ;; 1 * 2 が val に設定
(goto (reg continue)) ;; after-fact に戻る

;; 次はどうなるか

(restore n) ;; n が 3 に
(restore continue) ;; fact-done に戻る
(assign val (op *) (reg n) (reg val)) ;; 2 * 3 が val に設定
(goto (reg continue)) ;; fact-done に jmp

これはまだ簡単ってか面倒ではないんだよね。fibonacci って面倒クサくって嫌い。同じコトやるんなら memo しちゃえ、ってのが次の問題の解じゃねぇのか、と。
とりあえず (fib 5) あたりで見てみるんですが面倒臭いなぁ。(を

(save continue) ;; 最初は (label fib-done) が continue に設定
(assign continue (label afterfib-n-1)) ;; after で分けてるらしい
(save n) ;; n は 5
(assign n (op -) (reg n) (const 1)) ;; n に 4 を設定
(goto (label fib-loop)) 

;; (fib 4)
(save continue) ;; ここの continue は afterfib-n-1
(assign continue (label afterfib-n-1))
(save n) ;; n は 4
(assign n (op -) (reg n) (const 1)) ;; n に 3 が
(goto (label fib-loop))

これは (fib 2) までトバす (を

;; (fib 2)
(save continue) ;; ここでも afterfib-n-1
(assign continue (label afterfib-n-1))
(save n) ;; n は 2
(assign n (op -) (reg n) (const 1)) ;; n は 1 に
(goto (label fib-loop))

;; (fib 1)
(test (op <) (reg n) (const 2)) ;; n は 2 より (以下略
(branch (label (immediate-answer)))

;; immediate-answer
(assign val (reg n)) ;; n は 1 なんで val も 1
(goto (reg continue)) ;; afterfib-n-1 に jmp

;; afterfib-n-1
(restore n) ;; n は直前の save で復帰なんで 2
(restore continue) ;; 直前 save は afterfib-n-1 らしい

(assign n (op -) (reg n) (const 2)) ;; n は 0 に
(save continue) ;; 戻りが afterfib-n-1 って何故だ
(assign continue (label afterfib-n-2)) ;; continue は afterfib-n-2 らしい
(save val) ;; val は 1
(goto (label fib-loop))

いかん。酔ってる上にこんなアセンブラ的なソレがイメージできるような頭になってません。トレイスの仕方も悪そげ。
追記できれば入れますが多分無理。

追記

次の日です。それにしても gdgd だなぁ。別途実行される命令を直列に書くという手法でトレイス予定。