;sort an array using the Bubble Sort algorithm in ascending order.
;compare adjacent elements and sort with respect to each other.
;number of passes is one less than the number of elements in the array
;and number of iterations in each pass is the
;total number of elements minus the current pass number.
ORG 0H
ARRAY_ADDR EQU 4000H
NO_ELEMENTS EQU 08H
MAIN:
MOV DPTR, #ARRAY_ADDR
MOV A, #02H
MOVX @DPTR, A
INC DPTR
MOV A, #13H
MOVX @DPTR, A
INC DPTR
MOV A, #0A4H
MOVX @DPTR, A
INC DPTR
MOV A, #24H
MOVX @DPTR, A
INC DPTR
MOV A, #76H
MOVX @DPTR, A
INC DPTR
MOV A, #43H
MOVX @DPTR, A
INC DPTR
MOV A, #0BCH
MOVX @DPTR, A
INC DPTR
MOV A, #37H
MOVX @DPTR, A
LCALL SORT
SJMP MAIN
SORT:
MOV R0, #NO_ELEMENTS ;Counter for LOOP1
loop1: ;Outer Loop - Handles number of passes
MOV DPTR, #ARRAY_ADDR ;Point to beginning of array
MOV A, R0 ;Initialize R1 - the counter for LOOP2
MOV R1, A ;to the value of R0 - the number of iterations in each pass is same
;as the number of elements minus serial number of the current pass.
loop2: ;Inner Loop - Handles each pass.
MOVX A, @DPTR ;Copy a number of the array to the accumulator
MOV R2, A ;and store it in R2.
INC DPTR ;Move to the net number
MOVX A, @DPTR ;and store that in the accumulator.
SUBB A, R2 ;Subtract the first from the second.
JNC iteration ;If no carry is generated the second is greater and the numbers are
;in order with respect to each other. Otherwise they must be swapped.
swapnumbers:
MOVX A, @DPTR ;Move the second number to the accumulator.
XCH A, R2 ;Exchange contents of the accumulator and R2. This makes A contain
;the first number and R2 the second.
MOVX @DPTR, A ;Store the first number at the place where the second one was stored.
DEC DPL ;Move to the previous memory location.
MOV A, R2 ;Copy the second number to the accumulator
MOVX @DPTR, A ;and store it in the first number's place.
INC DPTR ;Move to the next memory location.
iteration: DJNZ R1, loop2 ;Move on to the next iteration of the current pass.
pass: DJNZ R0, loop1 ;Move on to the next pass.
RET
END
; bubble sort
; external memory
ORG 0H
START :
MOV R1,#10H ;Outer loop count
OUTLOOP: MOV R0,#10H ;Inner loop count
MOV DPTR,#9000H
INLOOP: CLR C ;Carry=0
MOVX A,@DPTR
MOV R2,A ;R2=first no
INC DPTR
MOVX A,@DPTR ;Acc=second no
MOV R3,A
SUBB A,R3 ;Compare
JNC SKIP
XCH A,R2 ;Exchange
SKIP: MOVX @DPTR,A ;Big no -> mem
DEC 82H ;DPL=DPL-1
MOV A,R2
MOVX @DPTR,A ;Small no -> mem
INC DPTR
DEC R0
CJNE R0,#01H,INLOOP
DEC R1
CJNE R1,#01H,OUTLOOP
SJMP $
END
; bubble sort ascending order
; external memory
ORG 0H
MOV R0,#05
L1: MOV DPTR,#9000H
MOV A,R0
MOV R1,A
L2: MOVX A,@DPTR
MOV B,A
INC DPTR
MOVX A,@DPTR
CLR C
MOV R2,A
SUBB A,B
JNC NOEXCHG
MOV A,B
MOVX @DPTR,A
DEC DPL
MOV A,R2
MOVX @DPTR,A
INC DPTR
NOEXCHG: DJNZ R1,L2
DJNZ R0,L1
SJMP $
ORG 9000H
DB 2,5,1,9,7,6
END
; Result: 9000:01, 02, 05,06,07,09
Related topics:
8051 Program - sorting ascending order | 8051 Program - sorting descending order | 8051 Program - bubble sort descending order | 8051 Program - pwm | 8051 Program - decimal to hex | 8051 Program - sum of a set of numbers | 8051 Program - memory subroutines | 8051 Program - math subroutines | 8051 Program - conversion subroutines
List of topics: 8051
No comments:
Post a Comment