「Nand2tetris」について、4章の感想を書く。ちなみに執筆次点で6章まで完了している。 当初の目標通り、5章までは4月中に完遂できた。
下記図の赤枠で囲った該当箇所だ。(5章は次回に書く)
4章 : 機械語
4章では、HackCPUの機械語仕様を学ぶ。 機械語はコンピュータアーキテクチャの上位にあたる概念だが、理解を深めるため本書では先に学ぶようだ。
先に機械語の仕様を学ぶことで、5章で作成するCPUがどのようにプログラムを処理するのかイメージしやすくなった。
Hack機械語はA命令、C命令の2種類からなる。 A命令は、Aレジスタに値をセットする命令で、C命令はALUによる演算指示コマンドだ。 今回は概略と感想がメインなので詳しくは延べないが、Hack機械語の仕様は下記サイトで確認できる。 https://www.nand2tetris.org/project04
本章のお題目としてHack仕様に基づいたアセンブリ言語でプログラムを作成することになる。
日頃、高水準言語(C言語)しか使ったことが無かったので、FOR文やIF文のありがたみを痛感した。これからはもっとC言語を敬いたい。(合掌)
Hackアセンブリ言語の鍵は、AコマンドとAレジスタを使いこなすことだろう。 ちなみに唐突に"Hack"という言葉が出てきたが、Hack とは本書で作成するコンピュータのアーキテクチャ名のことだ。
Hack仕様のAコマンドは、"@xxxx" の形式から成るコマンドで、用途はシンボル(変数)を表現、Aレジスタに値をセット、メモリアドレスの表現とHackアセンブリの肝となるコマンドだ。
演習
2つのプログラムをHackアセンブリ言語で作成することになった。
乗算プログラム 指示されたメモリに格納された2つの数値を掛け算し、結果を指定されたメモリに格納するプログラム。HackCPUではCPU命令セットとして乗算が用意されていないので、プログラムで実装する必要がある。乗算はこのあと実装する高水準な言語の前哨戦といったところだろうか。 慣れないAコマンドの使い方はこの演習で学べる。 作成したプログラムは下記を参照してほしい。 https://github.com/i-net-singularity/nand2tetris_projects/blob/main/04/mult/Mult.asm
入出力確認プログラム Hackにはキーボードとディスプレイという2つの仮想的なデバイスが接続されている。 キーボードから入力した文字をディスプレイに表示するプログラムを作成した。 この演習で「メモリマップ」という概念を学んだ。メモリアドレス空間の一部をデバイスに割り当てることで、デバイスとのやり取りを実現する仕組みだ。「メモリマップ」の概念を学んだことで、コンピュータに接続できるデバイス種類が自由自在に設計できる点と、デバイスドライバの仕組みが少し理解できた。 https://github.com/i-net-singularity/nand2tetris_projects/blob/main/04/fill/Fill.asm