[어셈블리] sort 문 어떻게 짜야되나요?

kknd345의 이미지

for (int i=0; i< array.Length ; i++)
{
    for ( int j=i; j< array.Length ; j++)
    {
        if( array[j] < array[i] )
	{
	    temp = array[j];
	    array[j]= array[i];
	    array[i]= temp;
	    }
	}
    }
}

위 정렬코드를 바꾸려다가.....

;=======================================;


mov i, 0

iLOOP:
    
    mov cx, LENGTHOF array	;   반복 횟수 지정
    sub cx, i			;   반복 횟수 지정

    mov si, i


    jLOOP:

	add si, TYPE array

	mov edx, array[i]   ; 에러난 줄

	cmp array[si], edx
	JAE NOT                 ; 에러난 줄
    
	OK:
		mov eax,array[si]
		mov edx,array[i]  ; 에러난 줄

		mov array[i],eax ; 에러난 줄
		mov array[si],edx

	NOT: ; 에러난줄

    loop jLOOP


    add i, TYPE array

cmp i, LENGTHOF array
JB iLOOP
;=======================================;

배열은 DWORD 형이고요. i는 WORD형 데이터입니다.

삽질만 거듭하다가 결국 GG입니다 ㅜㅜ...
제 코드에서 문제점좀 지적해 주세요...

( 코드자체가 실행이 안되니 다 문제이긴 하지만... ^^;;)

어셈에서 jmp 는 밑에 있는 곳으로는 못 가나요?
그리고 어셈코드 대소문자 구분 하나요?

Necromancer의 이미지

not은 명령어라서 라벨로 못씁니다. 어셈블러에 따라 다르긴
하지만 업계에서 많이 쓰는 masm의 경우는 명령어를 라벨로
못쓰게 하고 있습니다.

그리고 array[i]는 금시초문이네요.
메모리 주소 지정모드에 대해서 공부하시기 바랍니다.
메모리 주소 지정시 숫자와 레지스터 조합으로 하는데,
여기에는 제약이 있습니다. array[i]와 같은 경우 주소가
고정된 array는 상수 immediate로 넣고, i와 같은 변수는
레지스터에 넣어서 레지스터+메모리 형태로 주소접근하는게
보통입니다.

메모리 주소 지정모드만으로도 처리 못하는 array나(3차원이상) structure들은,
메모리 주소를 계산해서 레지스터에 넣은 다음 그 주소로
접근하도록 코드를 짭니다.

Written By the Black Knight of Destruction

kknd345의 이미지

.data
array DWORD 21,40,22,3,7,9,22
tmpEDI DWORD 1 DUP(0)
mov edi, 0
iLOOP:
    
    mov ecx, LENGTHOF array	; 
    sub ecx, tmpEDI		; 
    dec ecx			;  반복 횟수 지정~
    
		cmp ecx, 0 ; 위에 처리에서 ecx=0 이 나왔다는 소리는 sort 가 끝났다는 소리이다.
		JE endSort 				

    mov esi, edi		; j= i
    
  jLOOP:

	add esi, TYPE array ; j+1

	mov edx, array[edi]

	cmp array[esi], edx
	JAE noChange
    
	;Change:
  		mov eax,array[esi]
		mov edx,array[edi]
		mov array[edi],eax
		mov array[esi],edx

	noChange:
		loop jLOOP

		add edi, TYPE array
		inc tmpEDI
    jmp iLOOP

endSort:

코드가 좀 지저분하긴 하지만 이렇게 하니깐 이제 sort 되네요 ^^
답변 주셔서~ 고맙습니다~

1%의 가능성이면 충분하다!
최선을 다하자!

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.