CASL U - 最大値・最小値
 前へ 目次へ 次へ

最大値・最小値

 あるデータ領域に格納されている整数データから最大値と最小値を求める副プログラムを作成する。
 整数データは−32768〜32767の範囲にあるものとする。


最大値を求める。  副プログラム MAX1
 データが格納された領域の先頭アドレスをGR1に、データの個数をGR2に格納して副プログラムに渡し、最大値をGR0に格納して戻る。手順は次のとおりである。

  1. GR0を最小値で初期化する。最小値は-32768(#8000)である。
  2. GR1番地(データ領域)のデータをレジスタGR3に格納する。
  3. GR0とGR3を算術比較する。
  4. GR3の方が小さければ 6. へ移動する。GR3の方が大きければ次へ
  5. GR3の内容をGR0に格納する。
  6. GR1番地に1を加算する。
  7. データ個数GR2から1を減算する。
  8. 個数が0でなければ 2. へ移動する。0ならば次へ。
  9. 呼び出し元に戻る。

 合計の計算をするプログラムとほぼ同じである。上の赤色部分が変わる部分である。
 ・GR0に設定する初期値は、最大値を求めたいので最小値を設定しておく。
 ・3.と4.で比較し判定する。GR0>GR3ならば1行飛ばして、GR0<GR3ならば次の行へ移動する。
 ・5.はGR0<GR3のときだけで、GR3の方が大きいのでGR3をGR0に格納する。

MAIN1    START
         LAD     GR1, AREA
         LD      GR2, KOSUU
         CALL    MAX1
         ST      GR0, ANS
         RET
KOSUU    DC      10
AREA     DC      5,4,3,2,1,10,9,8,7,6
ANS      DS      1
         END
MAX1     START
         RPUSH
         LAD     GR0, #8000     ;1. 最小値を設定.
LOOP     LD      GR3, 0, GR1    ;2. データをGR3に格納.
         CPA     GR0, GR3       ;3. 比較.
         JPL     NEXT           ;4. GR0>GR3のときNEXTへ移動する。.
         LD      GR0, GR3       ;5. GR3の内容をGR0に記憶する。(最大値).
NEXT     LAD     GR1, 1, GR1    ;6. アドレス1加算.
         SUBA    GR2, =1        ;7. 個数を1減.
         JNZ     LOOP           ;8. 個数が0でなければLOOPへジャンプ
         RPOP
         RET                    ;9.
         END

 1つ目のデータを暫定的に最大値として設定する方法もある。副プログラムMAX2を次に示す。

MAX2     START
         RPUSH
         LD      GR0, 0, GR1    ;1つ目のデータを設定.
         LAD     GR1, 1, GR1    ;アドレス1加算.
         SUBA    GR2, =1        ;個数を1減.
         JZE     OWARI          ;個数が0ならOWARIへジャンプ.
LOOP     LD      GR3, 0, GR1    ;データをGR3に格納.
         CPA     GR0, GR3       ;比較.
         JPL     NEXT           ;GR0>GR3のときNEXTへ移動する。.
         LD      GR0, GR3       ;GR3の内容をGR0に記憶する。(最大値).
NEXT     LAD     GR1, 1, GR1    ;アドレス1加算.
         SUBA    GR2, =1        ;個数を1減.
         JNZ     LOOP           ;個数が0でなければLOOPへジャンプ.
OWARI    RPOP
         RET                    ;
         END


最小値を求める。  副プログラム MIN1
 データが格納された領域の先頭アドレスをGR1に、データの個数をGR2に格納して副プログラムに渡し、最小値をGR0に格納して戻る。手順は次のとおりである。

  1. GR0を最大値で初期化する。最大値は32767(#7FFF)である。
  2. GR1番地(データ領域)のデータをレジスタGR3に格納する。
  3. GR0とGR3を算術比較する。
  4. GR3の方が大きければ 6. へ移動する。GR3の方が小さければ次へ
  5. GR3の内容をGR0に格納する。
  6. GR1番地に1を加算する。
  7. データ個数GR2から1を減算する。
  8. 個数が0でなければ 2. へ移動する。0ならば次へ。
  9. 呼び出し元に戻る。

 最大値のプログラムとほとんど同じである。上の赤色部分が変わる部分である。
 ・1.の初期化データの変更と4. の比較判定を最大値のときと逆にする。

MAIN2    START
         LAD     GR1, AREA
         LD      GR2, KOSUU
         CALL    MIN1
         ST      GR0, ANS
         RET
KOSUU    DC      10
AREA     DC      5,4,3,2,1,10,9,8,7,6
ANS      DS      1
         END
MIN1     START
         RPUSH
         LAD     GR0, #7FFF     ;1. 最大値を設定.
LOOP     LD      GR3, 0, GR1    ;2. データをGR3に格納.
         CPA     GR0, GR3       ;3. 比較.
         JMI     NEXT           ;4. GR0<GR3のときNEXTへ移動する。.
         LD      GR0, GR3       ;5. GR3の内容をGR0に記憶する。(最小値).
NEXT     LAD     GR1, 1, GR1    ;6. アドレス1加算.
         SUBA    GR2, =1        ;7. 個数を1減.
         JNZ     LOOP           ;8. 個数が0でなければLOOPへジャンプ
         RPOP
         RET                    ;9.
         END

 最大値のときと同じように、1つ目のデータを暫定的に最小値として設定した場合の副プログラムMIN2を次に示す。

MIN2     START
         RPUSH
         LD      GR0, 0, GR1    ;1つ目のデータを設定.
         LAD     GR1, 1, GR1    ;アドレス1加算.
         SUBA    GR2, =1        ;個数を1減.
         JZE     OWARI          ;個数が0ならOWARIへジャンプ.
LOOP     LD      GR3, 0, GR1    ;データをGR3に格納.
         CPA     GR0, GR3       ;比較.
         JMI     NEXT           ;GR0<GR3のときNEXTへ移動する。.
         LD      GR0, GR3       ;GR3の内容をGR0に記憶する。(最小値).
NEXT     LAD     GR1, 1, GR1    ;アドレス1加算.
         SUBA    GR2, =1        ;個数を1減.
         JNZ     LOOP           ;個数が0でなければLOOPへジャンプ.
OWARI    RPOP
         RET                    ;
         END

 このとき、最大値を求めるMAX2との違いはリストの赤色部分1行だけである。


最大値・最小値を求める。  副プログラム MAXMIN
 データが格納された領域の先頭アドレスをGR1に、データの個数をGR2に格納して副プログラムに渡し、最大値をGR3に、最小値をGR4に格納して戻る。

MAIN5    START
         LAD     GR1, AREA
         LD      GR2, KOSUU
         CALL    MAX1
         ST      GR0, ANS
         RET
KOSUU    DC      10
AREA     DC      5,4,3,2,1,10,9,8,7,6
ANS      DS      1
         END
MAXMIN   START
         PUSH    0, GR1
         PUSH    0, GR2
         PUSH    0, GR5
         LD      GR3, 0, GR1    ;1つ目のデータを最大値として設定.
         LD      GR4, 0, GR1    ;1つ目のデータを最小値として設定.
         LAD     GR1, 1, GR1    ;アドレス1加算.
         SUBA    GR2, =1        ;個数を1減.
         JZE     OWARI          ;個数が0ならOWARIへジャンプ.
LOOP     LD      GR5, 0, GR1    ;データをGR3に格納.
         CPA     GR3, GR5       ;比較.
         JPL     NEXT1          ;GR3>GR5のときNEXTへ移動する。.
         LD      GR3, GR5       ;
NEXT1    CPA     GR4, GR5       ;比較.
         JMI     NEXT2          ;GR4<GR5のときNEXT2へ移動する。.
         LD      GR4, GR5       ;
NEXT2    LAD     GR1, 1, GR1    ;アドレス1加算.
         SUBA    GR2, =1        ;個数を1減.
         JNZ     LOOP           ;個数が0でなければLOOPへジャンプ.
OWARI    POP     GR5
         POP     GR2
         POP     GR1
         RET                    ;
         END


課題1 データが格納された領域の先頭アドレスをGR1に、データの個数をGR2に格納して副プログラムに渡し、負数の場合は絶対値に変換するとともに個数をカウントする。個数はGR0に格納して戻る。

AREA  DC  5, -4, 3, -2, 1, -10, 9, -8, 7, -6    ;テストデータ


 前へ 目次へ 次へ
 CASL U Copyright © 2003,2017  Hiroshi Masuda

 

 

inserted by FC2 system