Sorting x86 Asm插入排序

Sorting x86 Asm插入排序,sorting,assembly,x86,insertion-sort,Sorting,Assembly,X86,Insertion Sort,我试着在互联网上读到这些,但这是我的问题。我得到了一串双字 我必须按降序排列这些双字中低位字(最低有效)的字符串。高调的话语保持不变。 例如:斯特林DD 12345678h 1256ABCDh,12AB4344h 结果是1234ABCDh、12565678h、12AB4344h 现在我试着写一些代码,但它不能正常工作,我的插入过程。如果你能看看,告诉我我做错了什么,我会很感激的。 我试着在td模式下运行它,但我就是不明白 assume cs:code, ds:data data segment

我试着在互联网上读到这些,但这是我的问题。我得到了一串双字

我必须按降序排列这些双字中低位字(最低有效)的字符串。高调的话语保持不变。 例如:斯特林DD 12345678h 1256ABCDh,12AB4344h 结果是1234ABCDh、12565678h、12AB4344h

现在我试着写一些代码,但它不能正常工作,我的插入过程。如果你能看看,告诉我我做错了什么,我会很感激的。 我试着在td模式下运行它,但我就是不明白

assume cs:code, ds:data
data segment
    s dd 12345678h, 1256ABCDh, 12AB4344h
    ls equ ($-s)/4  ;this is supposed to be the length of my source string
    d dd ls dup (?) ;this is my destination string
    aux dw ?
    aux2 dw ?
data ends

code segment
insert proc
    push di ;here I use the stack to get more free registers
    push cx
    cmp di, offset d ;if di=offset d it means that I didn't store any number yet
    je addPrim 
    std ;we plan on working form right to left on the string for the next part
    mov cx, di
    sub cx, offset d ;here I find out with how many words I have to compare the word from AX
    dec di
    dec di ;since I work with doublewords, for some reason I thought I should decrease di
    dec di ;3 times but here my procedure gets fuzzy and doesn't work properly anymore
    repeta1: ;this repeat is supposed to compare the word from AX with the rest of the least 
        scasw ;significant words from es:di
        jge DIplus2 ;if my number from AX is bigger or equal than what's in es:di, I increment
 ;di twice and store it
        mov bx, word ptr es:[di+1] ;this part is supposed to interchange words but it's not
 ;working how I planned so I don't know how to change it
        mov word ptr es:[di+2], bx
        loop repeta1

    jmp DIplus1

    DIplus2:
        inc di

    DIplus1:
        inc di

    addPrim: ;this label  just adds the first word in the destination string
        stosw

    pop cx
    pop di
    inc di
    inc di
    cld
    ret 
    insert endp

start:
    mov ax, data
    mov ds, ax
    mov es, ax
    mov si, offset s
    mov di, offset d
    mov cx, ls ; store in cx the length of the strings
    jcxz exit

repeta:
    lodsw ;because of little endian, my first word will be my least significant word in the 
;in the doubleword so right after it is moved in ax, i apply the procedure insert
    call insert
    lodsw ;here it moves in ax my most significan word in the dd, so i auto store it 
    stosw ;in my destination string 
    loop repeta

exit:
    mov ax, 4c00h
    int 21h

code ends
end start
这实际上是计算元素的数量

mov cx, di
sub cx, offset d ;here I find out with how many words ...
在第二次调用insert proc时,这将设置CX=4,这对于只有3个值的列表来说太大了。我建议你把CX除以4

dec di
dec di ;since I work with doublewords...
dec di ;3 times but here my procedure gets fuzzy
这肯定是错误的。SCASW指示您减量4或根本不减量

mov bx, word ptr es:[di+1] ;this part is supposed to interchange words...
mov word ptr es:[di+2], bx
这无法工作,因为偏移量仅相隔1字节

jmp DIplus1

这会产生一个DI增量,因此会产生一个错误,因为您希望在该位置存储一个单词。

Ooo谢谢!我修复了它,现在它正常工作了^ ^是的,我以前使用scasw,但我将其更改为cmp,然后不再需要DI增量。谢谢。
jmp DIplus1