2014-12-23 55 views
0

我试过在互联网上阅读这些内容,但这里是我的问题。我给了一串双字。x86 Asm插入排序

我在递减顺序从这些双字的低字(至少显著)将字符串订购。高级词汇保持不变。 对于例如:DY 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 

回答

0
ls equ ($-s)/4 ;this is supposed to be the length of my source string 

这实际上计算元件的数量。

mov cx, di 
sub cx, offset d ;here I find out with how many words ... 

在你插入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的单个增量,因此会产生错误,因为您想在该位置存储单词。

+0

Ooo谢谢!我修好了,它现在工作正常^ _ ^是的,我以前用scasw工作过,但是我把它改成了cmp,然后不再需要DI增量了。非常感谢。 – Katie44