Coding/assembly

bubble sort 구현

bubble sort구현 하는 과제가 나와서 이를 구현해보고 글로 남겨보았다.

Problem

  • 변수명 num에 수록된 값을 콘솔에 한 라인으로 출력

  • 변수명 num에 나열된 값을 크기순으로 정렬

  • 변수명 num에 정렬된 값을 콘솔에 한 라인으로 출력

[출력 예시]

Code

코딩을 할 때 다음 두가지를 생각하며 구현했다.

  1. num의 i 번쨰 와 i+1 번쨰를 비교하는 코드
  2. 비교 후 i 번쨰가 더 큰 숫자이면 두 숫자의 위치를 바꿔주는 코드

전체적으로 1번이 동작하면서 내부에 2번이 동작하는? 느낌으로 구현해 보았다.

추가로 num의 저장된 숫자를 출력하는 함수를 따로 구현하여 출력을 해주었다.

TITLE   bubblesort  (bubblesort.asm)

INCLUDE c:\Irvine\Irvine32.inc

.data
num         BYTE        98, 54, 76, 23, 12, 89, 45, 32, 67, 3
str1        BYTE        ">> 변수 초기 값 : ", 0
str2        BYTE        ">> 변수 정열 값 : ", 0

.code
print       PROC
            mov     ecx, 0
            mov     edx, OFFSET num
            mov     ebx, LENGTHOF num
L1:
            movzx   eax, byte ptr [edx][ecx]
            call        WriteDec
            mov     al, 32
            call        WriteChar
            inc     ecx
            cmp     ecx, ebx
            jne     L1
            ret
print       ENDP

main        PROC
            mov     edx, OFFSET str1
            call        WriteString
            call        print
            mov     edi, OFFSET num
            mov     ebx, LENGTHOF num
            dec     ebx
            mov     ecx, 0
run :
            mov     al, byte ptr[edi][ecx]
            mov     ah, byte ptr[edi][ecx + 1]
            cmp     al, ah
            jna     skip
            mov     byte ptr[edi][ecx], ah
            mov     byte ptr[edi][ecx + 1], al
skip :
            inc     ecx
            cmp     ecx, ebx
            je      maintain
            jmp     run
maintain :
            mov     ecx, 0
            dec     ebx
            cmp     ebx, 0
            je      last
            jmp     run
last :
            call    CrLf
            mov     edx, OFFSET str2
            call        WriteString
            call    print
            call    CrLf
            exit
main        ENDP
            END     main

구현한 코드는 위와 같으며, 추가적으로 설명을 하자면

  • print
    • num에 저장된 숫자를 출력하는 함수이다.
    • 32(0x20)을 출력해주는 것은 0x20이 asciicode로 space에 해당하기 때문에 이를 해주었다.
  • register
    • ebx가 num의 길이 만큼 가져서 전체적으로 반복할 횟수를 가지고 있다.
    • ecx는 비교할 index를 지정하기 위해 0부터 ebx까지 반복하도록 했다.