首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序集冒泡排序交换

程序集冒泡排序交换
EN

Stack Overflow用户
提问于 2012-07-16 12:03:23
回答 2查看 9.8K关注 0票数 0

我试图在x86程序集中进行冒泡排序(是的,它必须是冒泡的,因为我不关心不同类型排序的速度优化),由于某种原因,我的代码不会交换必要的值。以下是我的代码

代码语言:javascript
复制
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寄存器具有包含我的值列表的数组的起始地址

代码语言:javascript
复制
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的值存储到特定地址。有什么帮助吗?

EN

回答 2

Stack Overflow用户

发布于 2012-07-16 12:29:16

我想我会使用指针指向列表中的当前位置,而不是每次使用时都需要缩放的索引:

代码语言:javascript
复制
    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
票数 3
EN

Stack Overflow用户

发布于 2012-07-16 12:35:45

代码的这一部分:

代码语言:javascript
复制
mov edx,[eax+edi*4]
mov [eax+edi*4], edx

它实际上不会改变内存中的任何东西,它从内存中读取一个值,并将其写回它刚刚获得的位置。

顺便说一句,您可能会对xchg指令感兴趣。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11497966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档