1

この選択ソートで問題が発生しています。問題は、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
4

1 に答える 1

1

変数jはバイトサイズです( と についても同じですiminmov si, [j]ただし、 2バイトをロードしていると言うと、上位バイトは次の変数から取得されます(minの場合j)。たとえば、次を使用して、負荷を修正する必要がありますmovzx si, byte [j]

補足: 2 のべき乗にシフトを使用するのが一般的な方法です。

于 2012-11-15T14:50:26.063 に答える