bubble sort구현 하는 과제가 나와서 이를 구현해보고 글로 남겨보았다.
Problem
-
변수명 num에 수록된 값을 콘솔에 한 라인으로 출력
-
변수명 num에 나열된 값을 크기순으로 정렬
-
변수명 num에 정렬된 값을 콘솔에 한 라인으로 출력
Code
코딩을 할 때 다음 두가지를 생각하며 구현했다.
- num의 i 번쨰 와 i+1 번쨰를 비교하는 코드
- 비교 후 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까지 반복하도록 했다.