Ahsan Naqvi
Ahsan Naqvi

Reputation: 21

Array Bubble Sort in Assembly Language

Problem is that why is only sorting the last element and then putting 5 on every index?

I am posting for the first time so I apologize if my question is unclear.

arr BYTE 5,4,3,2,1  
arr1 BYTE 5 DUP(?)  
temp BYTE ?  
.code  
main PROC   
mov ecx,LENGTHOF arr    
mov esi,Offset arr  
mov edi,offset arr+1  
L1:
mov al,[esi]  
mov edx,ecx  
mov ecx,4  
    L2:
    mov bl,[edi]  
    cmp al,bl  
    JG L3  
    jmp L5  

    L3:
    mov temp,al
    mov [esi],bl
    ;mov dl,temp
    mov [edi],al
    inc edi
    L5:
    loop L2

    mov ecx,edx
    inc esi

loop L1

;Printing my array
mov ecx,LENGTHOF arr  
mov al,arr[0]  
CALL dumpRegs  
mov al,arr[1]  
CALL dumpRegs  
mov al,arr[2]  
CALL dumpRegs  
mov al,arr[3]  
CALL dumpRegs  

CALL dumpRegs
exit
main ENDP
END main

Screenshot

Upvotes: 2

Views: 1283

Answers (1)

Sep Roland
Sep Roland

Reputation: 39166

Problem is that why is only sorting the last element and then putting 5 on every index?

Your L2 InnerLoop works exclusively with the 1st array element since, once it is loaded in AL, you don't advance the pointer in ESI. And because this particular value happens to be the greatest value in the array, it gets stored everywhere.
Your L2 InnerLoop also works with a fixed count of 4 where it should be working with a count of CurrentOuterLoopCount - 1.

The correct solution does not need the 2 different pointer registers. The array elements that are to be compared are always adjacent to each other and so a simple offset of +1 will do the trick.

This is a working BubbleSort. Find out how it works, don't just copy it!

arr BYTE 5,4,3,2,1

.code
main PROC
  mov  ecx, LENGTHOF arr
  sub  ecx, 1
  jbe  Done               ; Array is empty or has but 1 element

OuterLoop:
  mov  edx, ecx           ; 5 elements means 4 comparisons
  mov  esi, Offset arr
InnerLoop:
  mov  al, [esi]
  mov  bl, [esi+1]
  cmp  al, bl
  jng  NoSwap
  mov  [esi], bl
  mov  [esi+1], al
NoSwap:
  inc  esi
  dec  edx
  jnz  InnerLoop
  dec  ecx                ; Next time 3 comparisons, then 2, and then 1
  jnz  OuterLoop

Done:

Upvotes: 2

Related Questions