簡體   English   中英

裝配氣泡排序交換

[英]Assembly bubble sort swap

我正在嘗試在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

在最后一個mov指令中,它應該將temp加載回該地址,但不是。 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 基本上現在,我正在嘗試將FFFFFFEC移至0000000A ,然后將0000000A移至FFFFFFEC 我可以將其存儲到臨時寄存器EDX中,但是不能將EDX的值存儲到特定地址中。 有什么幫助嗎?

我想我將使用指向列表當前位置的指針,而不是每次使用時都需要縮放的索引:

    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

您的代碼的這一部分:

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

有效地不會更改內存中的任何內容,它會從內存中讀取一個值,並將其寫回到剛從中獲取值的位置。

順便說一句,您可能對xchg指令感興趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM