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

글쓴이: 익명 사용자 / 작성시간: 월, 2019/11/18 - 5:06오후
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의 밑으로 옮기면 원하는대로 출력이 안돼서 그런데 어떻게 해야지 제가 원하는대로 출력할 수 있을지 도와주셨으면 좋겠습니다 ㅜㅜForums:
Quote:tmp 이후 ret이 제일 밑에 있지
네, 그거 때문에 문제가 생기는 건 맞습니다.
방법이 하나 더 있지요. ret을 하나 더 넣으면 됩니다. findMin ENDP 바로 윗줄에요.
로직이 말이 되는지는 일단 별론으로 하고요.
보아하니 proc 안에는 ret가 한 개만 들어가야 한다고 생각하시는 것 같은데, ret은 mov, cmp 등과 같은 어셈블리 명령어일 뿐입니다. 필요한 만큼, 원하는 만큼 넣어도 됩니다.
물론 올바른 프로그램을 만들려면 올바른 자리에 올바른 명령어를 배치해야겠죠. 이건 다른 차원의 문제고요.
음 코드를 다시 읽어 봤는데 지금 ret 같은 게
음 코드를 다시 읽어 봤는데 지금 ret 같은 게 문제가 아니로군요.
어셈블리에 익숙하지 않으시면 고급 언어로 알고리즘을 구현해보세요. 그게 순서인 듯 합니다.
댓글 달기