2012-11-15 3 views
1

이 선택 정렬에 문제가 있습니다. 문제는 vecnums [j]가 (<) vecnums [min]부터 minor min으로 증가시킨 다음 j를 1 씩 증가시킨 다음 SI에서 j를로드 할 때 j는 더 이상 필요하지 않은 값입니다 (디버거를 사용하여 0102 일 때 계산해야 함). 나는 왜 그런 일이 일어날 지 모른다. 누군가 나를 도와 주면 정말로 감사하겠다. :)선택 정렬 어셈블리 x86 [Nasm] : 이상한 값 증가 j

나는 자신을 잘 표현하지 않으면 사과한다. 당신이 이해하지 못하는 것을 묻지 않는다.

시간 내 주셔서 감사합니다.

Vecnums는 숫자 배열 (2 바이트 크기)이며 5, -11,3, -4,10,1005,0,5, -1,23, -34,85, - 30 -82,1

i  resb  1 
j  resb  1 
min  resb  1 
     db  0 
vecnums  times 60 db 0 
nlog  resb  1 ;for the example is 15 

ssort:  
     mov  byte[i],0 
     mov  ch,0 
     mov  cl,[nlog] 
     sub  cl,1 
cicloi:  
     mov  ah,0 
     mov  al,[i] 
     mov  [min],al ; min=i 

     push  cx 
     mov  cl,[i] 
     add  cl,1 
     mov  byte[j],cl 
     mov  cl,[nlog] 
     sub  cl,[j] 
cicloj: 
     mov  si,[j] 
     imul  si,2 
     mov  ax,word[vecnums+si] 
     mov  si,[min] 
     imul  si,2 
     mov  dx,word[vecnums+si] 
     cmp  ax,dx ;ax=vecnums[j] dx=vecnums[min] 
     jnl  noMenor 
     mov  ah,0 ;vecnums[j] < vecnums[min] 
     mov  al,[j] 
     mov  [min],al ; min=j 
noMenor:          ; vecnums[j] > vecnums[min] 
     inc  byte[j] 
     loop  cicloj 
     mov  si,[j] 
     imul  si,2 
     mov  ax,word[vecnums+si] 
     mov  si,[min] 
     imul  si,2 
     mov  dx,word[vecnums+si] 
     mov  si,[j] 
     imul  si,2 
     mov  word[vecnums+si],dx 
     mov  si,[min] 
     imul  si,2 
     mov  word[vecnums+si],ax 
     inc  byte[i] 
     pop  cx 
     loop  salto 
     jmp  finrut 
salto:  jmp  cicloi ;the reason for this is that the jump is too long to do it with loop (couldn't assemble if I do it directly with loop) 
finrut: 
    ret 

답변

1

j 변수는 바이트 크기 (동일 imin과 마찬가지)이다. 그러나 mov si, [j]라고 말하면 2 바이트를로드하므로 높은 바이트는 다음 변수 (j의 경우 min)에서 나옵니다. 예를 들어 movzx si, byte [j]

사이드 노트를 사용하여로드를 수정해야합니다. 2의 거듭 제곱에 대해 시프트를 사용하는 것이 일반적입니다.

+0

맞습니다! 나는 당신의 도움을 주셔서 감사합니다. (나는 코드의 다른 부분에서 그 문제를 가지고 있었지만 그것을 고쳤습니다. 그러나이 경우에는 그것을 깨닫지 못했습니다). I 있던 다른 오류는 그 코드의 부분 : 'MOV SI, [J]' 'IMUL SI, 2' 'MOV 도끼 워드 [vecnums + SI] ' 'MOV '루프 cicloj' SI [분] ' 'IMUL의 SI, 2' 'MOV DX를 워드 [vecnums + SI]' 'MOV SI, [J]' 'IMUL SI, 2' Redithion