;
asize	EQU 10		; number of elements in array
;
array:	db 9
	db 8
	db 7
	db 6
	db 5
	db 4
	db 3
	db 2
	db 1
	db 0
;

; ----------------------------
; | bubble_sort
; |     sort an array pointed to by array
; |
; | algorithm outline:
; |     for i = 0 to size-1
; |            if arr_idx[i] > arr_idx[i+1] then swap(arr_idx[i], arr_idx[i+1]);
; |
; |  i is mapped to SI
; |  bx hold the base array index
; |  cx is to hold the size
; ----------------------------
;
Start:
	call bubble
;
; After this call, the array my_arr is sorted
;
	hlt
bubble:
; save all registers used
;
		push  ax
		push  bx
		push  cx
		push  si
		push  dx
;
		mov   bx, array
		mov   cx, asize
		dec   cx		; maximum index bound is one less than size
;
loopi:
		mov   si, 0
		mov   dl, 0		; clear swap flag
		mov   al, [bx+si]	; AL = array[i]
;
loopj:
		cmp   al, [bx+si+1]	; compare with array[i+1]
		jle   noswap
;
		mov   dl, 1		; set swap flag
		mov   ah, [bx+si+1]
		mov   [bx+si], ah
		jmp   check:
;
noswap:		
		mov   [bx+si], al
		mov   al, [bx+si+1]
;
check:
		inc   si		; increase i
		cmp   si, cx
		jb    loopj
;
; end of loop j
;
		mov   [bx+si], al
		dec   cx
		cmp   dl, 0		; check swap flag
		jnz   loopi		; not done if swap occured
;
; end of loop i
;
		pop   dx
		pop   si
		pop   cx
		pop   bx
		pop   ax
	        ret
;
end Start