使用冒泡排序x86在随机数组中排列值

时间:2011-10-13 04:21:29

标签: assembly x86 masm

我有一个由15个随机整数组成的dword数组,存储在esi中。我有一个冒泡排序算法,下面应该排列从最低到最高的值。但是当我的程序运行这个算法时,它似乎没有触及任何值,当我打印数组时,它就像以前一样。想法?

BubbleSort PROC USES eax ebx ecx edx esi

    mov ecx, 0 
    mov ecx, 15

    OUTER_LOOP: 
        push ecx
        mov ecx,0
        mov ecx,14
        mov esi, OFFSET arr

        COMPARE:
            mov ebx,0
            mov edx,0
            mov bl, [esi]
            mov dl, [esi+1]
            cmp bl,dl
            jg SWAP 

            CONTINUE:      
                add esi,4      
                loop COMPARE

        mov esi, OFFSET arr

        pop ecx     
        loop OUTER_LOOP

    jmp FINISHED

    SWAP:
        mov bl, [esi]
        mov dl, [esi+1]
        xchg bl,dl 
        mov [esi],dl 
        mov [esi+1],bl
        jmp CONTINUE 

    FINISHED:
    ret

BubbleSort ENDP

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

编辑:

我在您的代码中发现了不同的问题。我已将它们修复到下面并且ESI实际上已更改(未排序因为我认为排序算法错误但没有时间更改它)

1- mov reg,0

最好是对寄存器进行xor而不是向它移动0。 XOR指令更短。

2-在CONTINUE循环中我使用add esi,2(也许你在64位窗口?)

3-在SWAP循环中,前2个mov指令无用。我删除了它们。

4-在SWAP循环中,您需要交换将值放回到esi和esi + 1中的行(实际上您甚至不需要xchg指令。)

现在ESI改变了。您需要处理排序算法。

BubbleSort PROC uses ECX
    xor ecx,ecx 
    mov ecx, 15

    OUTER_LOOP: 
        push ecx
        xor ecx,ecx
        mov ecx,14
        mov esi, OFFSET arr

        COMPARE:
            xor ebx,ebx
            xor edx,edx
            mov bl, byte ptr ds:[esi]
            mov dl, byte ptr ds:[esi+1]
            cmp bl,dl
            jg SWAP 

            CONTINUE:      
                add esi,2      
                loop COMPARE

        mov esi, OFFSET arr

        pop ecx     
        loop OUTER_LOOP

    jmp FINISHED

    SWAP:
        xchg bl,dl 
        mov byte ptr ds:[esi+1],dl 
        mov byte ptr ds:[esi],bl
        jmp CONTINUE 

    FINISHED:
    ret
BubbleSort ENDP

编辑: 在外部循环中,您有2个 mov esi,OFFSET arr

第二个就在退出之前发生。所以你基本上把数组偏移量放回到ESI中,就像它在开始时一样。

下面的USES ESI说明成立。你需要删除它。

ECX在此程序中使用的是什么?它从未使用过,但是您要分配值,pushig并弹出它们?


使用eax ebx ecx edx esi

这个masm助手将ESI推入堆栈。

退出程序时,它会像之前一样弹出。

所以你可能不想在那里加入ESI。

注意,您还希望将DWORD放在另一个寄存器中,如EAX。在某些情况下进入程序ESI时,无论如何都会推送喜欢的程序。