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 같은 게 문제가 아니로군요.

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.