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