masm 코드에 질문이 있습니다.

익명 사용자의 이미지

masm으로 선택정렬을 구현하려고 하는데 제가 원하는대로 값이 출력되지 않는데 어떤 부분이 문제인지 알려주실 수 있나요?

INCLUDE Irvine32.inc
.data
intArray DWORD -117, 10, -1231, 2, 5, -11, -16, 7, 8, 9, 10, 1231, 123, 2, 123, 1, -123, 123, 12333, 875, 844, 111
.code
main PROC
mov ecx,LENGTHOF intArray
mov esi,0
mov edi,1
mov eax,0
outer:
	call findMin ; 최소값을 찾고
	call swap ; esi번째의 원소와 최소값을 swap
	inc esi
	inc edi
	loop outer
call printArray
exit
main ENDP
 
printArray PROC
mov ecx, LENGTHOF intArray
mov esi, 0
L1:
	mov eax, intArray[esi * 4]
	call writeInt
	mov al, ' '
	call writeChar
	inc esi
	Loop L1
call crlf
ret
printArray ENDP
 
findMin PROC USES esi ecx edi
mov ecx, LENGTHOF intArray
sub ecx, esi ; 불필요한 반복 횟수 삭제를 위해
inner:
	mov eax, intArray[esi * 4]
	cmp eax, intArray[edi * 4]
	JG tmp ; esi번째 원소가 edi번째 원소보다 클 경우
	inc edi
	loop inner
mov edi,ebx ; edi에 최소값의 인덱스 저장
ret
tmp : ; ebx에 edi번째 원소 인덱스 저장 후 esi를 edi 바꿔 계속 비교
	mov ebx, edi
	mov esi, edi
findMin ENDP
 
swap PROC
mov eax, intArray[esi * 4]
mov ebx, intArray[edi * 4]
xchg eax, ebx
mov intArray[esi * 4], eax
mov intArray[edi * 4], ebx
ret
swap ENDP
 
END main
main PROC

제가 생각하기에 JG tmp 이후 ret이 제일 밑에 있지 않아서 문제가 생기는 거 같은데 그렇다고 tmp를 inner의 윗줄로 옮기거나 ret을 tmp의 밑으로 옮기면 원하는대로 출력이 안돼서 그런데 어떻게 해야지 제가 원하는대로 출력할 수 있을지 도와주셨으면 좋겠습니다 ㅜㅜ
익명 사용자의 이미지

Quote:
tmp 이후 ret이 제일 밑에 있지 않아서 문제가 생기는 거 같은데

네, 그거 때문에 문제가 생기는 건 맞습니다.

Quote:
tmp를 inner의 윗줄로 옮기거나 ret을 tmp의 밑으로 옮기면

방법이 하나 더 있지요. ret을 하나 더 넣으면 됩니다. findMin ENDP 바로 윗줄에요.
로직이 말이 되는지는 일단 별론으로 하고요.

보아하니 proc 안에는 ret가 한 개만 들어가야 한다고 생각하시는 것 같은데, ret은 mov, cmp 등과 같은 어셈블리 명령어일 뿐입니다. 필요한 만큼, 원하는 만큼 넣어도 됩니다.

물론 올바른 프로그램을 만들려면 올바른 자리에 올바른 명령어를 배치해야겠죠. 이건 다른 차원의 문제고요.

익명 사용자의 이미지

음 코드를 다시 읽어 봤는데 지금 ret 같은 게 문제가 아니로군요.

어셈블리에 익숙하지 않으시면 고급 언어로 알고리즘을 구현해보세요. 그게 순서인 듯 합니다.