Сборка сортировки выбора x86 [Nasm]: Странное увеличение значения j
У меня проблемы с сортировкой выбора, проблема в том, что когда 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
1 ответ
Ваш j
переменная имеет размер в байтах (то же самое касается i
а также min
). Однако, когда вы говорите, mov si, [j]
вы загружаете 2 байта, поэтому старший байт будет получен из следующей переменной (min
в случае j
). Вы должны исправить ваши нагрузки, например, с помощью movzx si, byte [j]
Примечание: общепринятая практика - использовать сдвиги для умножения на степени двойки.