【问题标题】:arranging values in random array using bubble sort x86使用冒泡排序 x86 在随机数组中排列值
【发布时间】:2011-12-06 15:48:36
【问题描述】:

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

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

提前感谢您的帮助。

【问题讨论】:

    标签: assembly x86 masm


    【解决方案1】:

    编辑:

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

    1- mov reg,0

    最好对寄存器进行异或运算,而不是将 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,反正都是push。

    【讨论】:

    • 所以将我的阵列放入 esi 然后进入一个程序可能会推送和弹出 esi 注册表?
    • 嗯,即使我摆脱了USES esi,甚至尝试使用 eax 注册表,我也得到了与以前相同的输出。
    • 推入 ecx 的值用于循环。我正在推动和弹出它,以便它循环正确的次数。我还删除了第二个mov esi,OFFSET arr,得到了相同的结果。
    • 您不需要xchg 指令:只需将寄存器存储到与加载它们的位置相反的位置即可。此外,不要使用 xor-zero 和 mov 加载字节,只需使用 movzx eax, byte ptr [esi]It's faster than 2 instructions 如果你关心效率,don't use the loop instruction
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2013-09-28
    相关资源
    最近更新 更多