参考資料



地球シミュレータ動画(mpg形式 8分40秒 約46MB) DownLoad↓


FAQ

English mode
講義「コンピュータアーキテクチャ」に関するFAQを載せています。参考にしてください。
  • レジスタに関する質問
  • アドレッシングに関する質問
  • 命令に関する質問

  • 配列に関する質問
  • 問題に関する質問
  • その他の質問

  • 1.レジスタに関する質問

    (Q1)「変数レジスタ$s、一時レジスタ$tの違い」
    (A1)変数レジスタ$sは、Cプログラム中の変数に対応するレジスタであり、一時レジスタ$tは、計算の一時結果を格納するためのレジスタである。
    (Q2)「$atの使い方」
    (A2)$atはアセンブラ専用のレジスタであり、ユーザプログラム内では使用できない。
    (Q3)「レジスタの退避とは」
    (A3)例えば、メインルーチンがサブルーチンを呼び出す場合を考える。下図のようにサブルーチン内で「メインルーチンが使用しているレジスタ」を使おうとすると競合が生じる(下図の場合は$t5)。そのため、「メインルーチンが使用しているレジスタ」の内容をスタックに退避しておき(@)、サブルーチンがそのレジスタを使って計算をする(A)。計算終了後、そのレジスタにメインルーチンが使用していた値を復旧する(B)。そうすることで、下図の場合では$t5には値3が入り、以前の値が復旧されたことになる。
    (Q4)「レジスタは初期化すべきか」
    (A4)プログラムの入力変数として使用するレジスタは必ず初期化しなければならない。結果を格納するレジスタや、一時レジスタはプログラムの途中で値が入るので初期化をする必要がないように思われるが、プログラムが正しく動かなかった場合などに、それらのレジスタから予測外の結果が得られることがある。そのため、どのレジスタも初期化はしておいたほうが良い。
    ページ先頭へ戻る

    2. アドレッシングに関する質問

    (Q1)「PC相対アドレッシングと擬似直接アドレッシングについて」
    (A1)PC相対アドレッシングとはPCと命令中に指定した定数との和によってアドレスを示す方式であり、条件分岐命令で使用される。また、擬似直接アドレッシングは命令中の26ビットとPCの上位6ビットを連結したものがジャンプ・アドレスとなる。ジャンプ命令で使用される。
    (Q2)「ベース相対アドレッシング、PC相対アドレッシングでの指定範囲」
    (A2)アドレスフィールドは16ビットなので、ベースレジスタ(PC)から−32768〜32767の範囲を指定できる。
    (Q3)「セカンドキャッシュはレジスタか」
    (A3)セカンドキャッシュはシステムを高速化するために、CPUの外部に用意されるキャッシュメモリである。レジスタはCPUが処理を実行するために、一時的にデータを格納する場所である。
    ページ先頭へ戻る

    3. 命令に関する質問

    (Q1)「擬似命令と普通の命令の違い」
    (A1)擬似命令を使用すると、ハードウェアで実現されている以上に豊富なアセンブリ言語命令セットを用意することが出来る。
    例えば、
    blt $t1, $t2, loop($t1と$t2を比較して$t1の方が小さいときにloopに分岐)
    という本来MIPSの命令セットにはない擬似命令は
    slt $t3, $t1, $t2
    bne $t3 $zero loop
    という二つの命令に変換される。

    また、
    move $t0, $t1
    という擬似命令は
    add $t0, $zero, $t1
    という命令に置き換えられる。つまり、擬似命令を使用するとアセンブリプログラムが直感的に分かりやすくなり、見やすくなる。
    (Q2)「命令の数え方」
    (A2)分岐命令は分岐条件を判断して条件を満たすなら分岐先の命令を、満たさないなら次の命令を実行する。すなわち、分岐命令は分岐するしないにかかわらず1命令と数える。
    (Q3)「sltiとsltiuの違い」
    (A3)sltiは「set less than immediate」で符号付即値。sltiuは「set less than immedeate unsigned」で符号なし即値である。
    (Q4)「addとaddiの使い分け」
    (A4)addはレジスタ加算、addiはレジスタと定数の加算である。「値をコピーする」などの場合はどちらを使っても良い。
    (Q5)「lw、swとlb、sbの違い」
    (A5)lw、swは1語(MIPSの場合は32ビット)をレジスタやメモリに転送する。lb、sbは1バイト(8ビット)をレジスタやメモリに転送する。これはASCIIコードの文字列やI/Oデータなどは8ビットが多いので、そのたびに32ビットをロードしていたのでは無駄が多いなどの理由がある。
    (Q6)「addiはなぜ即値フィールドの左端のビットを語の上位16ビットに格納するのか」
    (A6)addiは正負の数を扱うので、符号拡張を行う必要がある。正の数ならば最上位ビットが0なので、語の上位16ビットに0を埋める。負の数ならば最上位ビットが1であるので、語の上位16ビットに1を埋める。
    (Q7)「即値を使用できる命令」
    (A7)addi, addiu, slti, sltiu, andi, ori, luiの7命令。また、即値用のフィールド(immediate)は16ビットであり、表現できる範囲は−32768〜32767。subiがないのは、addiにより負数を足し合わせることができるからである。
    (Q8)「lw命令で$a0にベースアドレス、$t0にインデックス値*4が入っている場合、lw $s0,$t0($a0)とせずに、add $t1, $a0, $t0 lw $s0,0($t1)とするのはなぜか」
    (A8)このロード命令中の0($t1)はベースレジスタ$t1にオフセット値0を加えたメモリアドレスの内容を参照するが、この場合オフセット値は定数でなければならない。
    (Q9)「ジャンプ命令中のアドレスフィールドについて(P137補足)」
    (A9)j 2500と書くと10000にジャンプする。これはMIPSはバイトアドレス方式を取っているためである。
    (Q10)「ワードとバイトについて」
    (A10)1ワード(語)はMIPSの場合は32ビットである。1バイトは8ビット。
    ページ先頭へ戻る

    4. 配列に関する質問

    (Q1)「配列のアドレス計算はadd2回よりもシフトの方が速いのでは?」
    (A1)add2回で4倍するよりも、シフト演算のほうが速い。
    (Q2)「P130例題について」
    (A2)P130ページの中ほどに「yは語の配列ではなくバイトの配列であるから」とあるが、この点に関して質問があったので解答する。 「yはバイトの配列」とは、例題において「strcpy( char x[ ],char y[ ])」の部分である。C言語ではchar型で定義されると8ビットの領域を確保する。つまり、図における箱1つである。例えば、「char y[5]」を宣言したとすると、メモリ領域において左上の添え字0から順に4までを確保することとなる。よってy[i]ならば、添え字iがそのまま箱を示すこととなる。よって、iを4倍する必要はない。
    ページ先頭へ戻る

    5. 問題に関する質問

    (Q1)「問題3.2―プログラムの意味―」
    (A1)11行目で等しいかどうかの判定をして12行目でカウントアップをする。14行目で配列の終わりかどうかを判定し、終わりならカウントアップした値と出力すべき値を比較し(15、16行目)、カウントアップした値のほうが大きかったら更新する(17行目)。$t4には比較元の値が入っている。
    (Q2)「問題3.3―実行命令数について―」
    (A2)対象となるプログラムを実行するのに必要なクロックサイクル数を数える。周波数から1クロックにかかる時間(クロックサイクル時間)を算出し、対象となるプログラムを実行するのにかかる時間を計算すれば良い。
    (Q3)「問題3.5―16ビット以上のアドレスにアクセスする場合とメモリロケーションについて―」
    (A3)16ビット以上のアドレスにアクセスする場合、1命令では実現できない。問題にある4000000は32ビットの2進数に直すと、0000_0000_0011_1101_0000_1001_0000_0000となるので、上位16ビットをlui命令、下位16ビットをaddiまたはori命令により32ビットの整数を生成する(Q26参照)。
    「メモリ・ロケーション4000000から始まるものとする」とは「メモリの4000000番地から配列を割り付ける」とうことである。メモリ・ロケーションとはメモリの番地のことである。
    (Q4)「問題3.7―loopの扱いについて―」
    (A4)loop開始場所がbneの次の命令から何命令前かを計算する。例えば、loopがbneの3行前にあるとすると、-4となる。これは分岐命令がpc相対アドレッシングモードを取っているからである。
    (Q5)「問題3.10―擬似命令「big」「small」の働き―」
    (A5)「big」「small」ともに定数。「big」は32ビットで表す必要がある場合に使用し、「small」は16ビットで表せる定数をいう。
    (Q6)「問題3.10―bigの扱い方(32ビット定数の生成法)について―」
    (A6)bigを$t5にロードする場合を考える。bigを16進数表記でABCDEFGHとするとlui $t5, ABCDで$t5=ABCD0000となる。次に、ori $t5 EFGHで$t5=ABCDEFGHとなる。oriのかわりにaddiを使うと、ABCD0000と1111EFGHが足されてしまう。これはaddiは符号付きの即値を扱うため、即値フィールドの最上位ビットが1だと、上位16ビットに1を埋めて計算してしまうからである。oriの上位16ビットは常に0である。
    また、bigの具体的な数値について問題には載っていないので、各自適当な数値を設定しても良い。
    (Q7)「問題3.11―データの参照回数―」
    (A7)ロード命令でメモリ内のデータを読み出し、ストア命令でメモリ内にデータを書き込む。参照という意味ではロード命令だけだが、ここではロード/ストアの回数をそれぞれ数える。
    ページ先頭へ戻る

    6.その他の質問

    (Q1)「最適化の定義」
    (A1)最適化とは基本的に実行時間の短縮とプログラム行数(メモリ量)の短縮を行うことである。
    実際には対象とするアーキテクチャを考慮した上で実行時間を短縮するという方向もあるし、パイプラインで実行するならストール回数を減らすという方向もある。しかし、現段階ではアーキテクチャは問題ではないので、アセンブリプログラムの行数を少なくするとか、使用するレジスタ数を減らすなどの最適化を行えば良い。
    (Q2)「MIPSの機械コードは覚える必要があるのか」
    (A2)機械コードのビットパターン自体は覚える必要はない。しかし、命令セットアーキテクチャ(命令の種類、アドレッシング方法、レジスタ使用方法など)を理解した上で、マニュアルを見ればアセンブリプログラムが書けるようにしておく必要がある。
    (Q3)「gccとspiceについて」
    (A3)共にMIPSアーキテクチャを評価するためのベンチマークである。
    (Q4)「アセンブリプログラムの必要性」
    (A4)情報家電など組み込みシステムのソフトウェアを開発する際に用いられる。C言語で開発している場合でも、アセンブリ言語を併用している場合が多い。
    ページ先頭へ戻る