アプリ版:「スタンプのみでお礼する」機能のリリースについて

次のプログラムに、
指定された整数値配列の中から最大値を調べるサブルーチンMAXを作成する、
指定された整数値配列の中から最小値を調べるサブルーチンMAXを作成する、
指定された整数値配列を昇順にソートするサブルーチンSORTを作成する、
指定された整数値配列の平均値(整数値)を調べるサブルーチンAVEを作成する、

これらについて教えてください。

PGM START
LAD GR1, DATA
LD GR2, =10
CALL SUM
ST GR0, RESULT
RET
DATA DC 1,9,3,7,5,10,2,8,4,6
RESULT DS 1
END
SUM START
PUSH 0, GR1
PUSH 0, GR7
LD GR0, =0
LD GR7, =0
MAIN CPA GR7, GR2
JZE QUIT
ADDA GR0, 0, GR1
LAD GR1, 1, GR1
LAD GR7, 1, GR7
JUMP MAIN
QUIT POP GR7
POP GR1
RET
END


GR1はデータの先頭番地、SUMをコールするとGR1が1ずつ加算されてデータが参照できる。
GR2はデータの個数、ラベルMAINで個数を比較している。
などのことはわかるのですが、
プログラムを作るとなるとまったくわかりません。

どなたか教えていただけませんか??
お願いします!!

A 回答 (1件)

回答がないので調べてみました。

アセンブルは下記を使用しました。バグがあるようなのと知らないのであまり自信がありません。
http://www.chiba-fjb.ac.jp/fjb_labo/casl/index.h …

PGM START
LAD GR1, DATA
LD GR2, =10
CALL SUM
ST GR0, RESULT

CALL AVE
ST GR7,WK2

CALL MAX
ST GR0,WK3

DUMP RESULT,3 ;システムコール、結果の確認
RET

DATA DC 1,9,3,7,5,10,2,8,4,6
RESULT DS 1
WK2 DS 1
WK3 DS 1

SUM
PUSH 0, GR1
PUSH 0, GR7
LD GR0, =0
LD GR7, =0
MAIN CPA GR7, GR2
JZE QUIT
ADDA GR0, 0, GR1
LAD GR1, 1, GR1
LAD GR7, 1, GR7
JUMP MAIN
QUIT POP GR7
POP GR1
RET

;---------------------
; 割り算
; GR7=GR0/GR2
;HOLD : GR1-GR6
;---------------------
AVE
LD GR7,=0
LOOP2
SUBA GR0,GR2
JMI QUIT2

LAD GR7,1,GR7
JUMP LOOP2
QUIT2
RET

;-----------------------------
; 最大値の検索
; IN : GR1=DATA TOP
; : GR2=DATA SU
;HOLD : GR1-GR6
;---------------------
MAX
PUSH 0,GR1
LD GR0,0,GR1
LD GR7,=0
LOOP3
LAD GR7,1,GR7
CPA GR7,GR2
JZE QUIT3

LAD GR1,1,GR1
CPA GR0,0,GR1
JPL LOOP3

LD GR0,0,GR1
JUMP LOOP3
QUIT3
POP GR1
RET
END

;--------------
; 以下はソート
;--------------
PGM START
LAD GR1, DATA
LD GR3, =10 ;DATA SU
CALL SORT
DUMP DATA,10 ;システムコール、結果の確認
RET
DATA DC 1,9,3,7,5,10,2,8,4,6
;-------------------------------------
; バブルソート
; IN : GR1=DATA TOP
; : GR3=DATA SU
; WORK : GR2=比較用 DATA TOP
; : GR4=SWAP用WORK
; : GR6=基準データ数カウンタ
; : GR7=比較データ数カウンタ
;DESTORY : GR3,GR5以外すべて
;-------------------------------------
SORT
LD GR6, =0 ;I=0
FOR_I
LAD GR2,0,GR1 ;D[I]=D[J] DATA TOP アドレスを同じにする
LAD GR6,1,GR6 ;I=I+1
CPA GR6, GR3
JZE QUIT ;I==DATA SU

LD GR7,GR6 ;J=I
FOR_J
LAD GR7,1,GR7 ;J=J+1
LAD GR2, 1, GR2 ;D[J] 比較用のデータアドレスを進める
LD GR0,0,GR2 ;GR0=D[I]
CPA GR0,0,GR1
JPL NEXT ;D[J]>D[I] 順の入れ替え不要
JZE NEXT ;D[J]=D[I] ”

LD GR5,GR0 ;GR5=D[J]
LD GR0,0,GR1 ;GR0=D[I]
ST GR0,0,GR2 ;D[J]=GR0
ST GR5,0,GR1 ;D[I]=GR5 SWAP D[I],D[J]
NEXT
CPA GR7, GR3
JMI FOR_J ;J<DATA SU

LAD GR1,1,GR1 ;D[I]のアドレスをつぎの配列に進める
JUMP FOR_I

QUIT
RET
END
    • good
    • 1
この回答へのお礼

丁寧で迅速な説明、ありがとうございます!!

今更なんですが、問題にへんなところがありました。。
最小値のほうのサブルーチンはMAXではなくてMINですね。。
ごめんなさい。

お礼日時:2008/01/07 01:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!