[英]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.