Subsections

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

教科書のList5-6のプログラムを例にして,繰り返し処理(ループ)について説明する.以 下のことが,ここでの学習の重要なポイントである. -5pt

4.1 プログラムの基本構造

高級言語のプログラムは,
順次
プログラムの命令は上から下へ実行される.
選択
制御式により実行される分が選択される.これは,FORTRANやC言語のif文の ことである.
繰り返し
ループあるいは反復とも呼ばれ,同じ命令を繰り返す.FORTRANではDO 文,C言語ではfor文などである.
の基本構造からなる.いままで,順次は気が付かないで使っていたが,なにも考えること はない.例題[3]で示した条件分岐(比較+ジャンプ)が選択の構造である.本日の例題 [6]では,繰り返し文を学習する.

4.2 教科書の例

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

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

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

4.3 繰り返し処理

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

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

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

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

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

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

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

ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
2006-02-14


no counter