2 [例題6]繰り返し処理

教科書のList5-6のプログラムを例にして、繰り返し処理(ループ)について説明する。

2.1 教科書の例

教科書のプログラムは、 という問題を解く、プログラムである。このプログラムは、教科書のp.98のList5-6に示 されている。まず最初に、 を考える。これは、さんざんやったので理解できているものとする。

このプログラムの核となる部分は、最大値を探すアルゴリズムである。教科書の例では、 それは、次のようなアルゴリズムとなっている。

  1. 最初に読み込むデータ(アドレス[data])を暫定最大値とする。
  2. それ以降は繰り返し処理。
    1. 次のデータと最大値を比較する
    2. 個数分のデータの比較が済んでいなければ、2a(次データ 処理)に戻る
である。最大値を探すアルゴリズムには、次々にデータを最大値と比較する処理が必要で ある。ここに繰り返し処理が使われる。

2.2 繰り返し処理

高級言語では繰り返し専用の命令が用意されているが、アセンブラ言語にはない。そのた め、条件分岐を使い繰り返しを行うことにする。アセンブラ言語では、以前学習したよう に、条件分岐は比較命令(CPA,CPL)とジャンプ命令 (JMI,JNZ,JZE,JUMP,JPL,JOV)を上手に使って、繰り返し処理を行うことになる。フ ローチャートで書くと、図1の様な構造である。

このような繰り返し構造を実現するためには、一度実行した命令に戻る必要がある。その ために、フローチャートの上へ分岐(ジャンプ)するのである。このままだと、無限ループ に陥るので、そこから抜けるための機構も必要である。パラメーターの値に従いループを 続けるか、そこから抜けるかを決める。それは、分岐(比較とジャンプ命令)で実現できる。

今回の問題であれば、データの個数分だけ繰り返せばよい。そのために、カウンターを用 いて、データ数のカウントをしている。これはまた、指標レジスターにも使える。

図 1: 分岐命令を使った繰り返し構造
\includegraphics[keepaspectratio, scale=1.0]{figure/loop_structure.eps}

2.3 プログラムの構造とフローチャート

このプログラムのフローチャートを図2に示す。ループ構造 になっているのが分かるだろう。それについての説明の前に、データを取り扱うレジスター やラベルの内容を表1に示しておく。
表 1: 汎用レジスターとメモリの内容
GR0 読み込んだデータ(比較すべき対象)を入れる。
GR1 データ数から1引いた値。指標レジスタの最大値。
GR2 データのカウンタ。0から始まり、指標レジスタとしてつかう。
DATA 調べるデータの先頭アドレス。
KOSUU 調べるデータ数が書かれているアドレス。
MAX 調べたデータの最大値を入れるアドレス。

図 2: 教科書のList5-6のプログラムの構造とフローチャート
\includegraphics[keepaspectratio, scale=0.8]{flow_chart/REI5-6.eps}



ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成17年1月26日


no counter