我在使用这种选择排序时遇到了问题,问题是当 vecnums[j] 小于 (<) vecnums[min] 时,我必须将 j 放入 min 然后将 j 增加 1,然后当我加载 j 时SI, j 不再是它必须的值(使用调试器我发现它应该是 0102,它应该是 0002)。我不知道为什么会这样,如果有人可以帮助我,我将非常感激:)
如果我没有很好地表达自己,我深表歉意,请不要怀疑任何你不明白的地方。
谢谢你的时间!
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