大会冒泡排序交换(Assembly bubble sort swap)

2019-06-26 07:15发布

我试图做x86汇编冒泡排序(是的,它必须是泡沫,因为我对于不同类型的种种我不关心速度优化),由于某种原因,我的代码不会交换必要的值。 这里是我的代码

mov eax, list                   ;store list in eax
mov edx,[eax+4*edi-4]           ;temp = var1
cmp edx,[eax+edi*4]             ;compare
JLE SECOND_LOOP                 ;jump if var1 < var2
mov [eax+4*edi-4],[eax+edi*4]   ;var1 = var2
mov [eax+edi*4], edx            ;var2 = temp
jmp SECOND_LOOP

在那里它应该回到加载临时到地址,it..doesn't最后MOV指令。 EAX寄存器具有包含我的值列表数组的起始地址

0x*starting address* 0a 00 00 00 ec ff ff ff 05 00 00 00 0c 00 00 00 1e 00 00 00 fb ff ff ff ea
0x*address after   * ff ff ff 37 00 00 00 34 00 00 00 00 00 00 00

而下一个地址中包含了几个数字。 在十进制中,数字是10 -20 5 12 30 -5 -22 55 52 0 。 从本质上讲,现在我想移动FFFFFFEC0000000A ,然后移动0000000AFFFFFFEC 。 我可以把它存入我的临时寄存器EDX,但不能EDX的值存储到特定的地址。 任何帮助吗?

Answer 1:

我想我会使用指针到当前位置进入名单,而不是需要每次使用它时缩放索引:

    mov esi, offset list
top:
    mov edi, esi
inner:
    mov eax, [edi]
    mov edx, [edi+4]
    cmp eax, edx
    jle no_swap
    mov [edi+4], eax
    mov [edi], edx
no_swap:
    add edi, 4
    cmp edi, list_end - 4
    jb inner
    add esi, 4
    cmp esi, list_end - 4
    jb top


Answer 2:

你的这部分代码:

mov edx,[eax+edi*4]
mov [eax+edi*4], edx

不能有效地在存储任何改变,它从存储器中读取一个值,并写入它放回原处,它只是得到它。

顺便说一句,你可能有兴趣在xchg指令。



文章来源: Assembly bubble sort swap