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
- $s0-$s7 -> 16-23
- 今まで、記号で命令を表わしてきた。これをアセンブリ言語という。数値で命令を表わした場合はそれを機械語という。
- 「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)
- R形式 (6 5 5 5 5 6) (op rs rt rd shamt funct)
- 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に対応可能である。
- レジスタは32bitなので、レジスタに入る数値の幅は、
- 「コンピュータ内では、数値は高と低の電気信号系列の形で保持される。」
とりあえず、ここまで。
0 件のコメント:
コメントを投稿