この章では、次章で作る素朴なコンピュータの設計仕様書を考えます。
どういう機能をコンピュータに実装するかを考えましょう。
ハードウェアに直接組み込まれている記憶領域をレジスタといいます。これは通常メインメモリよりは小規模で、計算の途中結果を格納するのに使われます。現代的な CPU であれば 64 ビットのレジスタが数十個あるのですが、今回は 8 ビットのレジスタを 2 個としましょう。これらをレジスタ A、レジスタ B とよびます。それぞれ 8 ビットの記憶ができます。
コンピュータが実行すべき命令について考えましょう。これまで作ったパーツだけで構成しなければならないので、そこまで多くの命令を実装することは期待できません。今回は以下の 3 つの命令を考えましょう。
コンピュータに movi n と命令すると、レジスタ A に 数 n が格納されるようにします。たとえば、movi 3 と命令すると、レジスタ A の値は次のクロックで 3 に変わるとします。
コンピュータに add と命令すると、レジスタ B に A + B の値が格納されるようにします。たとえば、レジスタ A の値が 12、レジスタ B の値が 5 の状況で add と命令すると、次のクロックでレジスタ B の値が 17 に変わるとします。
コンピュータに swap と命令すると、レジスタ A と B の値が交換されるようにします。たとえば、レジスタ A の値が 12、レジスタ B の値が 5 の状況で add と命令すると、次のクロックでレジスタ A の値が 5、レジスタ B の値が 12 に変わるとします。
出力はレジスタ B の値がそのまま LED に常に表示され続けるとします。
以上の命令だけで一体何ができるのだという感じですが、組み合わせることで色んな計算が実現できます。実例をいくつか見てみましょう。
フィボナッチ数は \(F_0 = 0, F_1 = 1, F_{n+2} = F_{n+1} + F_n\) で定義される数列です。
以下は movi, add, swap 命令だけで作ったフィボナッチ数 \(F_5\) の計算プログラムです。右二列は補助的に、命令を実行した後の各レジスタの値を示しています。
命令 | レジスタ A の値 | レジスタ B の値 |
movi 1 | 1 | 0 |
add | 1 | 1 |
swap | 1 | 1 |
add | 1 | 2 |
swap | 2 | 1 |
add | 2 | 3 |
swap | 3 | 2 |
add | 3 | 5 |
swap | 5 | 3 |
add | 5 | 8 |
swap | 8 | 5 |
add | 8 | 13 |
以下は movi, add, swap 命令だけで作った 3^4 の計算プログラムです。
命令 | レジスタ A の値 | レジスタ B の値 |
movi 3 | 3 | 0 |
add | 3 | 3 |
add | 3 | 6 |
add | 3 | 9 |
movi 0 | 0 | 9 |
swap | 9 | 0 |
add | 9 | 9 |
add | 9 | 18 |
add | 9 | 27 |
movi 0 | 0 | 27 |
swap | 27 | 0 |
add | 27 | 27 |
add | 27 | 54 |
add | 27 | 81 |
- 次章で作るコンピュータのスペックを考えた
次章ではいよいよこのスペックのコンピュータを実装します。