この選択ソートで問題が発生しています。問題は、vecnums [j]が(<)vecnums [min]に対してマイナーであり、jをminに入れてから、jを1ずつインクリメントする必要がある場合です。その後、jをロードするときにSI、jは、本来あるべき値ではなくなりました(デバッガーを使用して、0002になるはずの0102になることがわかりました)。なぜそうなるのかわかりません。誰かが私を助けてくれたら、本当にありがたいです:)
うまく表現できなかった場合は、お詫び申し上げます。わからないことは何でも聞いてください。
御時間ありがとうございます!
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