next up previous
: マイクロプロセッサ演習 : [SPIM] if-else 文


[SPIM] switch 文

C 言語における switch 文は、図 5 のように実現される。
図 5: C 言語における switch 文
\begin{figure}{\tt
\hspace*{1cm}switch(k)\{\\
\hspace*{1cm}\hspace*{1cm}case 0:...
... 命令2;\\
\hspace*{1cm}\hspace*{1cm}$\cdots$\\
\hspace*{1cm}\}
}\end{figure}
$k=0$, $1$, $2$, $\cdots$ の値に応じて、 それぞれ命令0、命令1、命令2、$\cdots$ が実行さる。

これを MIPS のアセンブリ言語で実現するには 図 6 のようにする。

図 6: MIPS のアセンブリ言語における switch 文
\begin{figure}\begin{center}\epsfxsize =8cm \epsfbox{switch.eps}\end{center}\end{figure}
基本的には 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 文が実現されることになる。

図 7: switch 文を実現するために用いるジャンプ・アドレス表
\begin{figure}\begin{center}\epsfxsize =10cm \epsfbox{memory.eps}\end{center}\end{figure}

本章では、実際に switch 文を自分で記述してもらう。 プログラムの雛型は Switch.asm である。

メモリ上に $k$ という変数が確保されており、 まず、その値が $k<0$ または $k \geq 4$ ならば、EXIT に分岐させ、 その後、$k=0, 1, 2, 3$ であればそれぞれ CASE0、CASE1、CASE2、CASE3 に分岐させる。

分岐させた後は画面に文字列を表示させるのだが、 この部分はすでに書かれている。 また、ジャンプアドレス表も既に作成されているので、 分岐構造の部分のみを記述すること。

記述ができたら、$k$ の値をいろいろ変え、正しく分岐が行なわれている ことを確かめて欲しい。

なお、この問題は授業のプリントや 教科書に基づいているので、そちらがヒントになるかもしれない。


平成16年11月8日