next up previous
: [SPIM] 繰り返し構造を使ったプログラムの記述 : マイクロプロセッサ演習 : 今回の演習に必要な予備知識


[SPIM] 配列の和

いつものように圧縮ファイル data04.zip をダウンロードしよう。

$n$ 個の要素を持つ配列 array[$n$] の和、すなわち

\begin{displaymath}
S = \sum_{i=0}^{n-1} \mbox{array}[i]
\end{displaymath} (1)

を考えよう。$n=3$ の時の $S$ を求めるのがプログラム LoadStore3.asm であった。 $n=3$ であれば、MIPS のアセンブリ言語の命令 add を 2 回書くだけで良いが、 $n$ が大きくなると add 命令の記述回数もどんどん増えていってしまい、 大変である。

このように、同じような命令を繰り返し実行するプログラムを記述する時のために、 ほとんどのプログラム言語では「繰り返し構造」という仕組みを用意している。 たとえば、C 言語では (1) 式は以下のように記述できる。

\begin{figure}{\tt
i=0;\\
S=0;\\
while(i < n)\{\\
\hspace*{1cm} S = S + array[i];\\
\hspace*{1cm} i = i+1;\\
\}
}
\end{figure}

ここで、i はカウンタのようなもので i=i+1 に従って 1、2、3、と値が増えていき、 i<n が成り立っている間は while ループの中身、すなわち S = S + array[i] が実行される。 in 以上になるとプログラムは while ループを外れるが、 そのとき S の値は (1) 式で表される配列 array[] の 和になっている、という仕組みである。

この仕組みを MIPS のアセンブリ言語で行なうのがプログラム SumArray.asm である。 このプログラムは完成済みのものなので、動かして動作を確認してみてほしい。 $n=10$ であり、array[$i$] $=i+1$ ( $0\leq i \leq 9$) の値がメモリに格納されている ときに (1) 式を計算するプログラムである。

  1. 計算結果はどこに現れているか?
  2. C 言語版でのカウンタ $i$ の役割はどのレジスタが担っているか?
  3. レジスタ $t0 はどんな役割をし、プログラムの進行とともに値はどう変化するか?
[SumArray.asm を理解するためのヒント]

平成16年11月1日