Сборка сортировки выбора 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]

Примечание: общепринятая практика - использовать сдвиги для умножения на степени двойки.

Другие вопросы по тегам