使用x86汇编语言对数组进行排序

时间:2018-11-08 17:14:51

标签: arrays sorting assembly x86

我必须使用堆栈上的参数以降序对数组进行排序,以得到一个数组和一个数组大小。我在ebp+12处按值传递大小,在ebp+8处按引用传递数组。

我知道代码遍地都是,但我只是想尝试一些可行的方法,我可以尝试从那里清理它。

我一直在调试,它似乎可以按需要进行迭代,但是未对我的数组进行排序。我已经为此奋斗了数小时,因此任何指导将不胜感激。

我要遵循的伪代码算法是:

for(k=0, k<arrlength-1,k++)
    I=K
    for(J=k+1,J<arrlength,J++)
      if(arr[j]>arr[i])
      I=J
    xchg(arr[k], arr[i])

这是我在x86汇编中实现它的尝试:

;------------------------------------------------
sortlist PROC
;Sorts an array of specified size into descending order
;Receives: DWORD request value, address of an array
;Returns: array of size request, sorted in descending order
;------------------------------------------------
.data
first   DWORD   ?
next    DWORD   ?
.code
push    ebp
mov     ebp, esp
mov     ecx, [ebp+12]
mov     edi, [ebp+8]
mov     eax, 0
mov     ebx, 0
mov     edx, 0
mov     esi, 0

dec     ecx     ;loop for array length - 1
L1:
    add     edi, ebx              ;ebx = 0 first loop, 4 all remaining loops
    mov     eax, [edi]            ;get the value of the first element
    mov     first, edi            ;store address of first element in first
    mov     next, edi             
push    ecx
push    edi
L2:
    add     edi, 4            ;move to next element in array
    mov     edx, [edi]        ;set value of next element to edx
    cmp     [next], edx       ;compare element to next element
    jg      nxt        
    mov     next, edi         ;If less than, move address of greater to next
nxt:    
    loop    L2

    mov     eax,[next]        ;move values pointed to by 1st & next to regs
    mov     ebx,[first]
    mov     [first],eax       ;move values(swapped) to addresses
    mov     [next],ebx

    mov     ebx,4
    pop     edi
    pop     ecx
    loop    L1
pop     ebp
ret     8
sortlist ENDP

0 个答案:

没有答案