CASL U - 最大値・最小値 |
あるデータ領域に格納されている整数データから最大値と最小値を求める副プログラムを作成する。
整数データは−32768〜32767の範囲にあるものとする。
最大値を求める。 副プログラム MAX1
データが格納された領域の先頭アドレスをGR1に、データの個数をGR2に格納して副プログラムに渡し、最大値をGR0に格納して戻る。手順は次のとおりである。
- GR0を最小値で初期化する。最小値は-32768(#8000)である。
- GR1番地(データ領域)のデータをレジスタGR3に格納する。
- GR0とGR3を算術比較する。
- GR3の方が小さければ 6. へ移動する。GR3の方が大きければ次へ
- GR3の内容をGR0に格納する。
- GR1番地に1を加算する。
- データ個数GR2から1を減算する。
- 個数が0でなければ 2. へ移動する。0ならば次へ。
- 呼び出し元に戻る。
合計の計算をするプログラムとほぼ同じである。上の赤色部分が変わる部分である。
・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に格納して戻る。手順は次のとおりである。
- GR0を最大値で初期化する。最大値は32767(#7FFF)である。
- GR1番地(データ領域)のデータをレジスタGR3に格納する。
- GR0とGR3を算術比較する。
- GR3の方が大きければ 6. へ移動する。GR3の方が小さければ次へ
- GR3の内容をGR0に格納する。
- GR1番地に1を加算する。
- データ個数GR2から1を減算する。
- 個数が0でなければ 2. へ移動する。0ならば次へ。
- 呼び出し元に戻る。
最大値のプログラムとほとんど同じである。上の赤色部分が変わる部分である。
・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 |