1

我在使用这种选择排序时遇到了问题,问题是当 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
4

1 回答 1

1

您的j变量是字节大小的(同样适用于imin)。但是,当您说mov si, [j]要加载 2 个字节时,因此高字节将来自以下变量(min如果是j)。您应该修复负载,例如使用movzx si, byte [j]

旁注:通常的做法是使用移位来乘以 2 的幂。

于 2012-11-15T14:50:26.063 回答