[어셈블리] sort 문 어떻게 짜야되나요?
글쓴이: kknd345 / 작성시간: 목, 2005/04/21 - 3:22오후
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 는 밑에 있는 곳으로는 못 가나요?
그리고 어셈코드 대소문자 구분 하나요?
Forums:


not은 명령어라서 라벨로 못씁니다. 어셈블러에 따라 다르긴하지만 업
not은 명령어라서 라벨로 못씁니다. 어셈블러에 따라 다르긴
하지만 업계에서 많이 쓰는 masm의 경우는 명령어를 라벨로
못쓰게 하고 있습니다.
그리고 array[i]는 금시초문이네요.
메모리 주소 지정모드에 대해서 공부하시기 바랍니다.
메모리 주소 지정시 숫자와 레지스터 조합으로 하는데,
여기에는 제약이 있습니다. array[i]와 같은 경우 주소가
고정된 array는 상수 immediate로 넣고, i와 같은 변수는
레지스터에 넣어서 레지스터+메모리 형태로 주소접근하는게
보통입니다.
메모리 주소 지정모드만으로도 처리 못하는 array나(3차원이상) structure들은,
메모리 주소를 계산해서 레지스터에 넣은 다음 그 주소로
접근하도록 코드를 짭니다.
Written By the Black Knight of Destruction
[code:1].dataarray DWORD 21,40,22,3,7,
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%의 가능성이면 충분하다!
최선을 다하자!
댓글 달기