「コンピュータシステムの理論と実装」を読んだメモを書いていきます。
前回は↓
メモ
機械語
メモリ
- データや命令を格納するハードウェアデバイス
- 固定幅のワードが連続して並び、それぞれにユニークなアドレスが振られている
プロセッサ
レジスタ
- メモリへのアクセスは比較的時間がかかる
- レジスタはプロセッサから近い場所にあるためメモリに比べて高速にアクセスできる
ニーモニック
- 命令を記号や英単語で表したもの
- ADDとかR0とか
オペランド
- 演算対象の値
アセンブリ言語(アセンブリ)
アセンブラ
- アセンブリ言語からバイナリへ変換するプログラム
機械語のコマンド
- 算術演算
- 加算減算など
- ADD R2, R1, R3
- 論理演算
- ビットシフト、ビット否定など
- AND R1, R2, R2
- メモリアクセス
- アドレッシングモードを用いて処理を実現する
- アドレッシングモード
- 要求されたメモリのワードに対して、そのアドレスを指定する方法
- direct addressing
- アドレスを直接指定してメモリにアクセスする
LOAD R1, 10 // Memory[10]をR1に読み込む
- アドレスを直接指定してメモリにアクセスする
- immediate addressing
- 値を指定してメモリにアクセスする
LOAD R1, 10 // 10をR1に読み込む
- 値を指定してメモリにアクセスする
- indirect addressing
- アドレスを保持しているメモリアドレスを指定することでメモリにアクセスする
- ポインタで使われる
- x=foo[i]の場合
- 配列のためのメモリ領域を確保
- ベースアドレスを参照するfooを作成
- iにアクセスするにはfoo+iのアドレスを読み込む
- 分岐命令
- 反復
- ループ処理の開始位置に戻る
- 条件分岐
- もし条件がfalseであればif then節の後の位置に戻る
- サブルーチン呼び出し
- コードセグメントの最初のコマンドに戻る
- 反復
実装
Hack言語を使ったプログラムを2つ作成する。 1つは乗算のプログラム、もう1つはキーボードとスクリーンの入出力を使ったプログラム。 実際に作成したプログラムは以下。
感想
- アセンブリで書かれたプログラムを読んだ経験はあったが、アセンブリでプログラムを書いた経験はなかったので、経験としては面白かった。
- HackアセンブラやCPUエミュレータのインタラクティブモードを使うことで、アセンブリの各行が16ビットのバイナリに変換される様子を確認できるのは勉強になった。
- 入出力を使ったプログラムで、スクリーンのアドレスを指定して値を書き換える際に、Hack言語のA命令をうまく使うことができず苦戦した。(C命令の実行前にAレジスタにアドレスを指定することで、C命令の対象アドレスを指定できることがわかっていなかった)
- Hack言語のA命令, C命令それぞれのビット列の仕様を読むことで、アセンブラがどういうルールでHack言語をバイナリに変換しているかを知ることができた
次章はこちら