MAIN START
LAD GR1,DAT ;ソート領域の先頭アドレス
LD GR2,SIZE ;領域のサイズ
CALL BUBBLEST
RET
SIZE DC 9
DAT DC 5 ;DAT[0]
DC 2 ;DAT[1]
DC 9 ;DAT[2]
DC 7 ;DAT[3]
DC 6 ;DAT[4]
DC 4 ;DAT[5]
DC 1 ;DAT[6]
DC 8 ;DAT[7]
DC 3 ;DAT[8]
END
;
;指定された領域をバブルソートで降順に並び替える
;input:
;GR1:領域の先頭アドレス
;GR2:領域のサイズ
;
;GR0は破壊される
;バブルソートアルゴリズム
;for(i=先頭データアドレス; iが最後尾データアドレスでない; i=i+1){
; for(j=最後尾データアドレス; jがiと等しくない ; j=j-1){
; if(DAT[j-1] < DAT[j]){ //隣り合ったデータを比較して並び順が逆なら交換する
; (DAT[j-1],DAT[j])=(DAT[j],DAT[j-1]);
; }
; }
;}
;
BUBBLEST START
ST GR1,TOP ;先頭アドレスをTOPに取っておく
ST GR2,SIZE ;領域サイズをSIZEに取っておく
ADDL GR1,GR2 ;LAST=GR1=TOP+SIZE-1
SUBL GR1,=1
ST GR1,LAST ;最後尾アドレスをLASTに取っておく
;
PUSH 0,GR3 ;GR3を外側ループ変数(i)として使う
PUSH 0,GR4 ;GR4を内側ループ変数(j)として使う
LD GR3,TOP ;i=先頭データアドレス
OUTLOOP CPL GR3,LAST ;iと最後尾データアドレスを比較
JZE EXIT ;一致したらループ終了
LD GR4,LAST ;j=最後尾データアドレス
INLOOP CPL GR4,GR3 ;jとiを比較
JZE OUTNEXT ;一致したら内側ループ終了、外側ループの次処理
LD GR0,-1,GR4 ;GR0=DAT[j-1]
LD GR1,0,GR4 ;GR1=DAT[j]
CPA GR0,GR1 ;DAT[j-1]とDAT[j]を比較
JMI SWAP ;DAT[j-1]<DAT[j]なら交換する
JUMP INNEXT ;交換しない場合、内側ループの次の処理
SWAP ST GR0,0,GR4 ;DAT[j]←DAT[j-1]
ST GR1,-1,GR4 ;DAT[j-1]←DAT[j-1]
INNEXT SUBL GR4,=1 ;j=j-1
JUMP INLOOP ;内側ループ繰り返し
OUTNEXT ADDL GR3,=1 ;i=i+1
JUMP OUTLOOP ;外側ループ繰り返し
;復旧
EXIT LD GR1,TOP
LD GR2,SIZE ;GR2は、破壊されていないので必要ない
POP GR4
POP GR3
RET
TOP DS 1
LAST DS 1
SIZE DS 1
END
お礼
丁寧に教えて下さり本当にありがとうございました。 無事に理解する事ができ大変感謝しております(*_ _)