【问题标题】:Sorting an array from biggest to least in Assembly language x86用汇编语言 x86 从大到小对数组进行排序
【发布时间】:2019-05-24 07:21:10
【问题描述】:

我正在尝试使用寄存器从大到小对数组进行排序,但似乎没有任何效果。 ecx 是我拥有的数字数量,esi 是我的列表的地址,它由双字组成。我使用 edx 将每个元素增加 4 个字节。我的代码没有对整个数组进行排序我知道我需要找到最大值的位置,然后将其设置为等于外部循环 edx 但我似乎无法弄清楚如何更改数组中的元素,因为我只有edx寄存器。我尝试推动该位置,然后在内循环完成时将其弹出,但这似乎不起作用。请感谢我已经解决这个问题超过 4 个小时。

push    ebp
mov     ebp,esp
mov     ecx,[ebp+8]
mov     esi,[ebp+12]
mov     edx,-4

outerloop:
add     edx,4
push    edx
push    ecx
mov     ebx,[edx+esi]

innerloop:
add     edx,4
mov     eax,[edx+esi]
cmp     ebx,eax
jl      change
finish:
loop    innerloop
pop     ecx
pop     edx
loop    outerloop
jmp     done


change:
mov     [edx+esi],ebx
mov     [edx+esi-4],eax
sub     edx,4
push    edx
mov     edx,offset change1
call    writestring
pop     edx
jmp     finish

done:
pop     ebp
ret     8

【问题讨论】:

    标签: arrays sorting assembly x86 cpu-registers


    【解决方案1】:

    您正在寻找的是一个“反转”Bubble Sort(您当然可以使用任何您希望的排序算法,但这只是一个简单的示例)。我不确定您使用的是什么汇编程序,但这是一个简短的汇编函数,它将完成一种存储在数组/列表arr 中的n int32_t 整数。 (这个例子是用 NASM 写的)

    ;int *sort(int *arr,int n);
    sort:
        push ebp
        mov ebp,esp
        mov edx,[ebp+12]
    
    .loop1:
        mov esi,[ebp+8] ;arr ptr
        mov ecx,[ebp+12] ;n number of ints
    
    .loop2:
        mov eax,[esi] ;compare
        mov ebx,[esi+4]
        cmp eax,ebx
        jg .skip
    
        mov [esi],ebx ;swap
        mov [esi+4],eax
    
    .skip:
        add esi,4 ;perform loop checks
        dec ecx
        cmp ecx,1
        ja .loop2
        dec edx
        ja .loop1
    
        mov eax,[ebp+8] ;return arr
    
        mov esp,ebp
        pop ebp
        ret
    

    请记住,这个示例并没有真正优化(例如,它在整个数组中迭代了太多次)。有时(尤其是在汇编语言中),少即是多。您可以增加数组指针(或它的副本),而不是通过 ecx/edx 偏移指针,并直接使用它进行比较。这样您就不必同时跟踪计数器寄存器和指针。 :)

    【讨论】:

      猜你喜欢
      • 2021-01-13
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      相关资源
      最近更新 更多