バブルソート
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]