daisuzz.log

"コンピュータシステムの理論と実装 第4章 機械語" を読んだ

「コンピュータシステムの理論と実装」を読んだメモを書いていきます。

前回は↓

iikanji.hatenablog.jp

メモ

機械語

  • 機械語によって算術演算や論理演算、メモリからのフェッチやデータの格納などをプロセッサに実行させる
  • 決められた形式に従って、プロセッサとレジスタを用いてメモリを操作する

メモリ

  • データや命令を格納するハードウェアデバイス
  • 固定幅のワードが連続して並び、それぞれにユニークなアドレスが振られている

プロセッサ

  • いわゆるCPU
  • レジスタやメモリからデータをロードして仕様で決められた命令セットを実行し、実行結果をレジスタやメモリに格納する

レジスタ

  • メモリへのアクセスは比較的時間がかかる
  • レジスタはプロセッサから近い場所にあるためメモリに比べて高速にアクセスできる

ニーモニック

  • 命令を記号や英単語で表したもの
  • 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つはキーボードとスクリーンの入出力を使ったプログラム。 実際に作成したプログラムは以下。

github.com

感想

  • アセンブリで書かれたプログラムを読んだ経験はあったが、アセンブリでプログラムを書いた経験はなかったので、経験としては面白かった。
  • HackアセンブラやCPUエミュレータインタラクティブモードを使うことで、アセンブリの各行が16ビットのバイナリに変換される様子を確認できるのは勉強になった。
  • 入出力を使ったプログラムで、スクリーンのアドレスを指定して値を書き換える際に、Hack言語のA命令をうまく使うことができず苦戦した。(C命令の実行前にAレジスタにアドレスを指定することで、C命令の対象アドレスを指定できることがわかっていなかった)
  • Hack言語のA命令, C命令それぞれのビット列の仕様を読むことで、アセンブラがどういうルールでHack言語をバイナリに変換しているかを知ることができた

次章はこちら

iikanji.hatenablog.jp