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

时间:2019-05-24 07:21:10

标签: arrays sorting assembly x86 cpu-registers

我正在尝试使用从大到小的寄存器对数组进行排序,但似乎没有任何效果。 ecx是我拥有的数字量,esi是我的由双字组成的列表的地址。我使用edx将每个元素向上增加4个字节。我的代码没有对整个数组进行排序,我知道我需要找到max的位置,然后将其设置为等于外部循环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

1 个答案:

答案 0 :(得分:0)

您要查找的是一个'reversed'Bubble Sort(当然,您可以使用所需的任何排序算法,但这只是一个示例)。我不确定您使用的是哪种汇编程序,但这是一个简短的汇编函数,它将完成存储在数组/列表n中的arr 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偏移指针,并直接使用该指针进行比较。这样,您不必同时跟踪计数器寄存器和指针。 :)