教科書のList5-6のプログラムを例にして、繰り返し処理(ループ)について説明する。
教科書のプログラムは、
- ラベルDATAから、ラベルKOSUUが示す語数の整数のデータが格納されて
いる。
- このデータの最大値を探し出し、それをラベルMAXが示す領域に格納する。
という問題を解く、プログラムである。このプログラムは、教科書のp.98のList5-6に示
されている。まず最初に、
を考える。これは、さんざんやったので理解できているものとする。
このプログラムの核となる部分は、最大値を探すアルゴリズムである。教科書の例では、
それは、次のようなアルゴリズムとなっている。
- 最初に読み込むデータ(アドレス[data])を暫定最大値とする。
- それ以降は繰り返し処理。
- 次のデータと最大値を比較する
- 個数分のデータの比較が済んでいなければ、2a(次データ
処理)に戻る
である。最大値を探すアルゴリズムには、次々にデータを最大値と比較する処理が必要で
ある。ここに繰り返し処理が使われる。
高級言語では繰り返し専用の命令が用意されているが、アセンブラ言語にはない。そのた
め、条件分岐を使い繰り返しを行うことにする。アセンブラ言語では、以前学習したよう
に、条件分岐は比較命令(
CPA,CPL)とジャンプ命令
(
JMI,JNZ,JZE,JUMP,JPL,JOV)を上手に使って、繰り返し処理を行うことになる。フ
ローチャートで書くと、図
1の様な構造である。
このような繰り返し構造を実現するためには、一度実行した命令に戻る必要がある。その
ために、フローチャートの上へ分岐(ジャンプ)するのである。このままだと、無限ループ
に陥るので、そこから抜けるための機構も必要である。パラメーターの値に従いループを
続けるか、そこから抜けるかを決める。それは、分岐(比較とジャンプ命令)で実現できる。
今回の問題であれば、データの個数分だけ繰り返せばよい。そのために、カウンターを用
いて、データ数のカウントをしている。これはまた、指標レジスターにも使える。
このプログラムのフローチャートを図
2に示す。ループ構造
になっているのが分かるだろう。それについての説明の前に、データを取り扱うレジスター
やラベルの内容を表
1に示しておく。
表 1:
汎用レジスターとメモリの内容
GR0 |
読み込んだデータ(比較すべき対象)を入れる。 |
GR1 |
データ数から1引いた値。指標レジスタの最大値。 |
GR2 |
データのカウンタ。0から始まり、指標レジスタとしてつかう。 |
DATA |
調べるデータの先頭アドレス。 |
KOSUU |
調べるデータ数が書かれているアドレス。 |
MAX |
調べたデータの最大値を入れるアドレス。 |
図 2:
教科書のList5-6のプログラムの構造とフローチャート
|
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成17年1月26日