2008年6月7日土曜日

【パタヘネ】2章 命令:コンピュータの言葉 (その2)

2章全体にざっと目をとおした。
MIPSアーキテクチャについて、自分なりにまとめながら、理解を深めることにする。

blogger上にtableタグで整理しようと思ったが、tableは使えないみたい。うむー。


  • 2.1 はじめに

    • 「コンピュータのハードウエアに命令を伝えるには、コンピュータの言葉で話さなければならない。」
    • 命令(instruction):コンピュータの言葉
    • 命令セット(instruction set):コンピュータの語彙

      • 「命令セットには人が書くときの形とコンピュータが読むときの形がある...」



  • 2.2 コンピュータ・ハードウエアの演算

    • 算術演算ができないものは、コンピュータとは呼ばない。
    • 各演算命令によって、ハードウエアは1つの演算のみ行なう。
    • 演算命令において、必ず変数を3つ付記せねばならない。
    • その変数のことをオペランドという。


  • 2.3 コンピュータ・ハードウエアのオペランド

    • レジスタ:ハードウエアに直接組込まれている特殊な記憶領域。
    • 算術命令のオペランドは、レジスタでなければならない。
    • 語(word) = レジスタ長:レジスタのサイズ。32ビット。
    • レジスタ数:一般的に有限であり、32本。
    • 「レジスタを表わすのに$記号の後ろに2文字をつけた名前を使用する。」
    • コンパイラがプログラムの変数に対して割り当てるレジスタを$s0,$s1,...と呼ぶことにする。
    • プログラムの変数としては存在していないが、コンパイルするために必要となるため、コンパイラが一時的に使用するレジスタを$t0,$t1,...と呼ぶことにする。

    • 配列や構造体のようなデータ構造は、大きいので、レジスタに入らない。メモリ中に保持する。
    • データ転送命令(data transfer instruction):メモリとレジスタの間でデータをやりとりする命令。
    • メモリ:巨大な一次元の配列。語が複数格納されており、メモリアドレスでそれらを指定できる。
    • バイト:しかし、多くのアプリケーションで8ビット(1バイト)という単位が有効であるため、メモリアドレスはバイト単位である。
    • 整列化要件:なので、語にアクセスするためのアドレスは4の倍数となる。それ以外を指定してはいけない。
    • コンパイラは、配列を扱うとき、その配列の開始メモリアドレスを決める。それをベースアドレスという。
    • 配列を含む命令は配列の要素をベースアドレスとオフセットの組で表現する。
    • ベースアドレスを指定すると配列が定まるのだから、ベースアドレスは配列の名前そのものといえる。配列のベースアドレスは$s0等で扱う。

    • スピル・アウト:レジスタの値をメモリに退避すること。
    • 定数をいちいちメモリとレジスタでやりとりするのはうまくない。
    • 定数を含んだ算術演算をひとつつくってしまう。これを即値加算と呼ぶ。


  • 2.4 コンピュータ内での命令の表現

    • 「コンピュータ内では、数値は高と低の電気信号系列の形で保持される。」
    • それを人がもっとも直接的に扱うには、2進数の数値と解釈する。
    • コンピュータで扱う情報は、すべて、バイナリ・デジット(ビット)で構成される。
    • レジスタに名前をつける、とはレジスタに数値を割り当てることである。

      • $s0-$s7 -> 16-23
      • $t0-$t7 -> 8-15

    • 今まで、記号で命令を表わしてきた。これをアセンブリ言語という。数値で命令を表わした場合はそれを機械語という。
    • 「1命令は1語からなる。」
    • 命令は32bitの2進数なのだが、これの中身を区切ることによって、構文とする。
    • 区切られた部分をフィールドと呼ぶ。
    • 区切り方は複数種類ある。

      • R形式 (6 5 5 5 5 6) (op rs rt rd shamt funct)
      • I形式 (6 5 5 16) (op rs rt (constant or address))


      • op:命令操作コード(オペコード)
      • rs:第一のソース・オペランドのレジスタ
      • rt:第二のソース・オペランドのレジスタ
      • rd:デスティネーション・オペランドのレジスタ
      • shamt:シフト量
      • funct:機能コード(function code)

    • I形式は、即値およびデータ転送命令用である。
    • ちょっと整合性チェック。

      • レジスタは32bitなので、レジスタに入る数値の幅は、
        0〜4294967296(2^32)。
      • メモリのアドレスをレジスタ1つで指定できるようにするには、メモリのアドレスはこれと同じ値域が最大となる。
      • メモリはバイトでアドレスされており、データ転送命令は語毎の指定だから、語アドレスの数は、
        1073741824(2^30) 個
        となる。
      • レジスタは32個あるので、これに数値の名前をつけるには、32=2^5bitが必要。r系フィールドのサイズとあっている。
      • I形式のaddressフィールドは16bitである。これは幅でいうと0〜65536のバイトアドレスであり、語にすると16384個に相当する。
      • intの配列も語による取り扱いなのか? (すると3byte無駄?)が不明。
      • 即値のconstantも同様であり、2の補数として、+-32768に対応可能である。




とりあえず、ここまで。

0 件のコメント: