DOUxx (条件までの繰り返し)

自由形式構文 (許可されていない - DOU 命令コードを使用)
コード 演算項目 1 演算項目 2 結果フィールド 標識
DOUxx 被比較値 被比較値

DOUxx 命令コードは、最低 1 回 (おそらくはそれ以上) 実行したい命令のグルー プの前に置かれます。 対応する ENDDO ステートメントが このグループの終わりを示します。DO グループの詳細と xx の意味については、構造化プログラミング命令を参照してください。

演算項目 1 と演算項目 2 には、リテラル、名前のついた定数、フィールド 名、テーブル名、配列要素、形象定数、またはデータ構造名を入れなければな りません。 演算項目 1 と演算項目 2 は同じデータ・タイプでなければなりませ ん。

DOUxx ステートメントでは、関係 xx を指示します。 より複雑な条件を指定するため には、DOUxx ステートメントの直後に ANDxx また は ORxx ステートメントを続けます。 DOUxx グループの命令は 1 回処理された後で、 次のいずれかに該当するまで繰り返されます。

このグループは、グループの開始時にこの条件が 真でない場合であっても、常に最低 1 回は処理されます。

DOUxx 命令自体のほかに、 DOUxx グループは、DOUxx および ENDDO ステートメントの条件付け標識に よっても制御されます。 DOUxx ステートメントの条件付け標識は、DOUxx 命令を開始するかどうかを 制御します。 対応する ENDDO ステートメントの条件付け標識では、DO ループを早期に終了 させることができます。

DOUxx 命令は次のステップに従って実行されます。

  1. DOUxx 命令は、DOUxx ステートメント行の条件付け標識が満たされた場合 に処理されます (ステップ 2)。 標識が満たされない場合には、対応する ENDDO ステートメントの後で処理され る次の命令に制御が渡されます (ステップ 6)。
  2. DOUxx 命令が処理されて、処理可能な次の命令に制御が渡されます (ステ ップ 3)。 DOUxx 命令では、この時点で演算項目 1 と演算項目 2 が比較されたり、指定さ れた条件がテストされることはありません。
  3. DO グループのそれぞれの命令が処理されます。
  4. ENDDO ステートメントの条件付け標識が満たされない場合には、対応する ENDDO ステートメントの後の次の演算命令に制御が渡されます (ステップ 6)。 そうでない場合には ENDDO 命令が処理されます (ステップ 5)。
  5. ENDDO 命令が処理されて、DOUxx 命令の演算項目 1 と演算項目 2 が比較さ れるか、あるいは命令を組み合わせて指定した条件がテストされます。 演算項目 1 と演算項目 2 の間に関係 xx が存在するか、または指定された条件が存在 する場合には、DO グループが終了されて、ENDDO ステートメントの後の次の演 算命令に制御が渡されます (ステップ 6)。 演算項目 1 と演算項目 2 の間に関 係 xx が存在しないか、または指定された条件が存在しない場合には、DO グル ープの命令が繰り返されます (ステップ 3)。
  6. DOUxx または ENDDO ステートメントの条件付け標識が満たされない場合 (ステップ 1 または 4)、あるいはステップ 5 で演算項目 1 と演算項目 2 の間 に関係 xx が存在するかまたは指定された条件が存在する場合には、ENDDO ス テートメントの後のステートメントが処理されます。

これらの命令が DOUxx 命令にどのような影響を与えるかについて は、LEAVE (Do/For グループからの抜け出し)および ITER (繰り返し)を参照してください。

詳細については、比較命令または 構造化プログラミング命令を参照してください。

図 281. DOUxx 命令
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
 *
 *  DOUEQ 操作により DO グループ内で、少なくとも 1 回の操作が実行されます。
C
C     FLDA          DOUEQ     FLDB
C
 *
 *  ENDDO 操作では FLDA が FLDB に等しいかどうか判断するための
 *  テストが行われます。FLDA が FLDB に等しくない場合、先行の操作が
 *  再度処理されます。このループは FLDA が FLDB に等しくなるまで
 *  継続されます。FLDA が FLDB に等しくなると、プログラムは
 *  ENDDO 操作のすぐ後の操作に分岐します。
C
C                   SUB       1             FLDA
C                   ENDDO
C
 *
 *  DOUEQ ANDEQ OREQ 結合操作は DO グループ内で
 *  少なくとも 1 回操作を処理します。
C
C     FLDA          DOUEQ     FLDB
C     FLDC          ANDEQ     FLDD
C     FLDE          OREQ      100
C
 *
 *  ENDDO 命令では、FLDA が FLDB に等しく FLDC が FLDD に
 *  等しいという、指定された条件が満たされているかどうかを
 *  判別するためのテストが行われます。その条件が満たされて
 *  いる場合、プログラムは、ENDDO 命令の直後の命令に分岐
 *  します。DOUEQ 条件と ANDEQ 条件が満たされている場合に
 *  は、FLDE が 100 に等しいという OREQ 条件をテストする
 *  必要はありません。指定された条件が満たされていない場合
 *  には、OREQ 条件がテストされます。OREQ 条件が満たされて
 *  いる場合には、プログラムは、ENDDO の直後の命令に分岐
 *  します。それ以外の場合には、OREQ 命令の後に続く命令が
 *  処理されて、プログラムは、2 番目の DOUEQ 命令から後の
 *  条件テストを処理します。DOUEQ および ANDEQ 条件も、
 *  OREQ 条件も満たされない場合には、OREQ 命令の後に続く
 *  命令が再び処理されます。
C
C                   SUB       1             FLDA
C                   ADD       1             FLDC
C                   ADD       5             FLDE
C                   ENDDO