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 だなぁ。別途実行される命令を直列に書くという手法でトレイス予定。