Сортировка массива на ассемблере x86 - PullRequest
0 голосов
/ 08 ноября 2018

Я должен отсортировать массив в порядке убывания, используя параметры стека, массив и размер массива. Я передал размер по значению в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...