我正在尝试在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的值存储到特定地址中。有什么帮助吗?
答案 0 :(得分:3)
我想我会使用指针进入列表中的当前位置,而不是每次使用时需要缩放的索引:
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
答案 1 :(得分:1)
这部分代码:
mov edx,[eax+edi*4]
mov [eax+edi*4], edx
实际上不会改变内存中的任何内容,它会从内存中读取一个值并将其写回原来的位置。
顺便说一下,您可能对xchg
指令感兴趣。