이 선택 정렬에 문제가 있습니다. 문제는 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
맞습니다! 나는 당신의 도움을 주셔서 감사합니다. (나는 코드의 다른 부분에서 그 문제를 가지고 있었지만 그것을 고쳤습니다. 그러나이 경우에는 그것을 깨닫지 못했습니다). 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