;..........................................................;
;       SORT A GIVEN BYTE LIST IN DESCENDING ORDER         ;
;       INPUT   :  LIST OF UNORDERED NUMBERS               ;
;       OUTPUT  :  SORTED LIST                             ;
;..........................................................;
STACK SEGMENT PARA STACK 'STACK'
      DB      64 DUP('STACK')
STACK ENDS
;;
DATA SEGMENT PARA PUBLIC 'DATA'
	 NUMBER    DB  2,4,1,3,8,9,11,6
DATA ENDS
;;
CODE SEGMENT PARA PUBLIC 'CODE'

SORT_LIST     PROC    FAR
              ASSUME  SS:STACK,DS:DATA,CS:CODE
              PUSH    DS
              MOV     AX,0
              PUSH    AX
              MOV     AX,DATA
              MOV     DS,AX
;;
              MOV     SI,0                ;FIRST ELEMENT
              MOV     DI,0                ; 
OUTER:        MOV     AL,NUMBER[SI]       ;AL : FIRST NUMBER
              MOV     DI,SI               ;SI=DI
              INC     DI                  ;DI=NEXT POSITION TO SI
              
INNER:        CMP     AL,NUMBER[DI]       ;CHEAK IF NUMBER <=NEXT ONE
              JLE     SWAP                ;IF SO SWAP
CONTINUE:     INC     DI                  ;GET NEXT NUMBER
              CMP     DI,7                ;CHECK IF FIRST LOOP END
              JNE     INNER               ;IF NOT LOOP INNER
              
              INC     SI                  ;INCREMENT OUTLOOP COUNTER
              CMP     SI,6                ;CHECK IF END (N-1)
              JNE     OUTER               ;IF NOT LOOP
              JMP     FINISH              ;ELSE EXIT
              
SWAP:         MOV     DL,NUMBER[DI]       ;SWAP PROCEDUER
              XCHG    NUMBER[SI],DL       ;EXCHANGE AL WITH THE MEM.LOC.
              MOV     NUMBER[DI],DL
              JMP     CONTINUE
             
              
FINISH:       RET
SORT_LIST     ENDP
CODE          ENDS
              END     SORT_LIST
                                                                                          	       