5. 反復処理

条件分岐による反復処理を行うと,さまざまな計算が実現できます.

基本的な枠組み

以下の枠組みによって,指定された条件を満たすまで,反復処理を行います.
  1. 計算をする
  2. 条件を満たしているならば,プログラムを終了する
  3. (条件を満たしていないので)1に戻る

基本的な枠組み


反復処理の例 "1から10までの和"

反復処理を使ったプログラムの例として, "1から10までの和" を計算するプログラムを考えてみます.下図の左側が ED21 で実行できるプログラムです.このプログラムは教科書 P.156 図7.2 (下の図の右側)のプログラムを ED21 用に書き直したものです.

対応関係

各命令の対応関係は以下のようになっています.

LOAD ADD STORE SUB JZ J STOP
load add store subtract jumpzero jump halt

教科書では結果を出力する命令として write が用いられていますが,ED21では "アキュムレータ" の値を見ることができますので,そこで値を確認しましょう.

プログラムの読み込みと実行

"1から10までの和" は,ED21に付属のサンプルプログラムにはありません.そこで,下のプログラムをエディタにコピー&ペーストします.

LOAD 10
ADD 11
STORE 10
LOAD 11
SUB 12
STORE 11
JZ 8
J 0
LOAD 10
STOP 0
0
10
1

コピー&ペーストは,以下の手順で行います.

  1. マウスの左ボタンをプレスしたままマウスをドラッグして,上のプログラムを範囲指定する
  2. マウスの右ボタンをプレスするとメニューが現れるので,"コピー"を選択する
  3. ドラッグして右プレスしてコピー

  4. エディタ上でマウスの右ボタンをプレスするとメニューが現れるので,"ペースト"を選択する
    ※メニューが現れない場合,「コマンドキー(四つ葉のクローバーが描かれたキー)」を押しながら「V」を押すことでもペーストできます
  5. 右プレスしてペースト

  6. "Write" ボタンをクリックして "メインメモリ" にエディタの内容を書き込む
  7. "Write" ボタンをクリックして "メインメモリ" にプログラムの書き込み

スライドの青線を見るとわかるようにEE21の行番号がずれて表示されるかもしれませんが, 実行に影響はありません.

メインメモリに書き出したら,"ステップ実行"をクリックして,反復処理の過程を追いかけてみましょう.

1. "LOAD 10" の実行

LOAD命令により,"メインメモリ" の10番地の値 "0" を "アキュムレータ" に読み込みます.

1. "LOAD 10" の実行

2. "ADD 11" の実行

ADD命令により,"アキュムレータ" の値である "0" に "メインメモリ" の11番地の値 "10" を加えて,結果の値を "アキュムレータ" に格納します.

2. "ADD 11" の実行

3. "STORE 10" の実行

STORE命令により,"アキュムレータ" の値 "10" を "メインメモリ" の10番地に書き出します.

3. "STORE 10" の実行

4. "LOAD 11" の実行

LOAD命令により,"メインメモリ" の11番地の値 "10" を "アキュムレータ" に読み込みます.

4. "LOAD 11" の実行

5. "SUB 12" の実行

SUB命令により,"アキュムレータ" の値 "10" から "メインメモリ" の12番地の値 "1" を引き,結果の値を "アキュムレータ" に格納します.

5. "SUB 12" の実行

6. "STORE 11" の実行

STORE命令により,"アキュムレータ" の値 "9" を "メインメモリ" の11番地に書き出します.

3. "STORE 11" の実行

"STORE 11" なので "アキュムレータ" の値 "9" を11番地に書き込みます.

7. "JZ 8" による条件分岐

JZ命令により,"アキュムレータ" の値がゼロだった場合,"プログラムカウンタ" の値を8にして,プログラムの実行を8番地にジャンプします.

7. "JZ 8" による条件分岐

最初の実行では "アキュムレータ" の値は "9" であり,ゼロではないのでジャンプせずに次の命令を実行します.しかし,実行が進むにしたがって,5の "SUB 12" により11番地の値が1つずつ小さくなり,ゼロになるときがきます.

8. "J 0" による無条件ジャンプ

J命令により,無条件で "プログラムカウンタ" の値を0にして,プログラムの実行を0番地にジャンプします.

8. "J 0" による無条件ジャンプ

9. 1〜6 の反復と実行の終了

7に書いたように"メインメモリ" の11番地の値が "0" になるまで,1〜6の実行を反復します."メインメモリ" の11番地の値が "0" になると,"JZ 8" によりプログラムの実行は8番地にジャンプします.そこで "LOAD 10"が実行された後,9番地の"STOP 0" が実行されプログラムが終了します.終了状態は下のようになります.

終了状態

解説

このプログラムの実行によって,メインメモリ上の10〜12番地の値は,以下のようになることがわかります.