在汇编语言 x86 中从最大到最小对数组进行排序

Sorting an array from biggest to least in Assembly language x86

我正在尝试使用寄存器从大到小对数组进行排序,但似乎没有任何效果。 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

您要查找的是 'reversed' Bubble Sort(您当然可以使用任何您希望的排序算法,但这对于示例来说很简单)。我不确定你使用的是什么汇编程序,但这里有一个简短的汇编函数,它将完成一种存储在 array/list 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,然后直接使用它进行比较。这样您就不必同时跟踪计数器寄存器和指针。 :)