これを MIPS のアセンブリ言語で実現するには 図 6 のようにする。
基本的には while 文、if 文、if-else 文と同様に、条件判定と分岐命令を 組み合わせることで実現するが、switch 文の場合 「ジャンプ・アドレス表」という概念が必要になるので 図 7 を用いてそれを解説する。図 7 は switch 文を使ったプログラムを 実行したときのメモリ上のデータの状態の一例である。 メモリには「テキスト領域」と「データ領域」が あり、テキスト領域には、実際のプログラムの命令列が、 データ領域には、プログラムで用いられるデータがそれぞれ 格納される。 前回までのメモリの模式図には、データ領域のみが書かれていたことに 注意しよう。
さて、例えばプログラムを CASE0 に分岐させたい時はどうすればよいだろうか。
テキスト領域を見ると、CASE0 はメモリアドレス 0x00400088 に対応している。
だから、もしレジスタ $t0 に 0x00400088 が代入されていれば、
jr $t0
という命令で CASE0 に分岐することができる。
同様に CASE1、 CASE2、 CASE3 はそれぞれ 0x0040009c、0x004000b9、0x004000c4 のアドレスに対応している。 これらのアドレスを表のように並べたものを、 ジャンプ・アドレス表という。 図中では case[0]、case[1]、case[2]、case[3] に 各ラベルのアドレスが書かれており、これがジャンプ・アドレス表である。 この表から、ジャンプすべきアドレスをレジスタに読み出して jr 命令 を実行すれば、switch 文が実現されることになる。
本章では、実際に switch 文を自分で記述してもらう。 プログラムの雛型は Switch.asm である。
メモリ上に という変数が確保されており、 まず、その値が または ならば、EXIT に分岐させ、 その後、 であればそれぞれ CASE0、CASE1、CASE2、CASE3 に分岐させる。
分岐させた後は画面に文字列を表示させるのだが、 この部分はすでに書かれている。 また、ジャンプアドレス表も既に作成されているので、 分岐構造の部分のみを記述すること。
記述ができたら、 の値をいろいろ変え、正しく分岐が行なわれている ことを確かめて欲しい。
なお、この問題は授業のプリントや
教科書に基づいているので、そちらがヒントになるかもしれない。