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

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

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

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

DOUxx ステートメントでは、関係 xx を指示します。 より複雑な条件を指定するため には、DOUxx ステートメントの直後に ANDxx また は ORxx ステートメントを続けます。 DOUxx グループの命令は 1 回処理された後で、 次のいずれかに該当するまで繰り返されます。
  • 演算項目 1 と演算項目 2 の間にこの関係が存在する
  • DOUxx、ANDxx、または ORxx 命令を組み合わせて指定した条件が存在する

このグループは、グループの開始時にこの条件が 真でない場合であっても、常に最低 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 (繰り返し)を参照してください。

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

図 1. DOUxx 命令
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
 *
 *  The DOUEQ operation runs the operation within the DO group at
 *  least once.
C
C     FLDA          DOUEQ     FLDB
C
 *
 *  At the ENDDO operation, a test is processed to determine whether
 *  FLDA is equal to FLDB.  If FLDA does not equal FLDB, the
 *  preceding operations are processed again.  This loop continues
 *  processing until FLDA is equal to FLDB.  When FLDA is equal to
 *  FLDB, the program branches to the operation immediately
 *  following the ENDDO operation.
C
C                   SUB       1             FLDA
C                   ENDDO
C
 *
 *  The combined DOUEQ ANDEQ OREQ operation processes the operation
 *  within the DO group at least once.
C
C     FLDA          DOUEQ     FLDB
C     FLDC          ANDEQ     FLDD
C     FLDE          OREQ      100
C
 *
 *  At the ENDDO operation, a test is processed to determine whether
 *  the specified condition, FLDA equal to FLDB and FLDC equal to
 *  FLDD, exists.  If the condition exists, the program branches to
 *  the operation immediately following the ENDDO operation.  There
 *  is no need to test the OREQ condition, FLDE equal to 100, if the
 *  DOUEQ and ANDEQ conditions are met.  If the specified condition
 *  does not exist, the OREQ condition is tested.  If the OREQ
 *  condition is met, the program branches to the operation
 *  immediately following the ENDDO.  Otherwise, the operations
 *  following the OREQ operation are processed and then the program
 *  processes the conditional tests starting at the second DOUEQ
 *  operation.  If neither the DOUEQ and ANDEQ condition nor the
 *  OREQ condition is met, the operations following the OREQ
 *  operation are processed again.
C
C                   SUB       1             FLDA
C                   ADD       1             FLDC
C                   ADD       5             FLDE
C                   ENDDO