C сборочное приспособление пузырьковой сортировки - PullRequest
1 голос
/ 08 мая 2020

Мне нужно написать пузырьковую сортировку в C с помощью инструмента сборки. Мой код C выглядит так:

#include <stdio.h>

extern int arraysort(int array[],int length);
int main () {
    int array[]= {7,4,3,6,2,1};
    int length = 6;
    printf("Unsorted array: %d,%d,%d,%d,%d,%d\n",array[0],array[1],array[2],array[3],array[4],array[5]);
    arraysort(array,length);
    printf("Sorted array: %d,%d,%d,%d,%d,%d\n",array[0],array[1],array[2],array[3],array[4],array[5]);

    return 0;
}

А мой код сборки выглядит так:

.intel_syntax noprefix

.text
.global arraysort
arraysort: # int sortarray(int array[],int length)

    #function prologue
    push ebp
    mov ebp, esp
    # function prologue end

    push ebx   # save ebx for cdecl convection
    # 1.argumentum [ebp + 4*2] this is the array
    # 2.argumentum [ebp + 4*3] this is the length

    mov ecx, [ebp + 12]   #array length (6)
    dec ecx               #array length (5)
    mov edx, 1            #variable j
    mov esi, [ebp + 8] #array address
loop1:
      cmp ecx, 0  # (int i =length; i> length;i--)
      jg end
    loop2:
    mov eax, [esi + 4*ecx] #array[0]
    mov ebx, [esi + 4*edx] #array[1]
    cmp eax, ebx #if eax > ebx jump to csere
    jg swap
    dec ecx  #i--
    inc edx#j++
    jz end
    jmp loop2

swap:
    mov [esi + 4*edx], eax #change the two elements
    mov [esi + 4*ecx], ebx
    jmp loop2

end: 
    pop ebx
    mov esp, ebp
    pop ebp
    ret

Я не знаю, в чем проблема, и я борюсь с этим. Если я изменю первый l oop jg на jl, я получу бесконечность l oop: / Извините за мой engli sh и мои навыки программирования на ассемблере, но я все еще изучаю этот язык. Пожалуйста, помогите мне! Спасибо

1 Ответ

1 голос
/ 08 мая 2020

Вот основная проблема:

    mov ecx, [ebp + 12]   #array length (6)
    dec ecx               #array length (5)
    mov edx, 1            #variable j
    mov esi, [ebp + 8] #array address
loop1:
      cmp ecx, 0  # (int i =length; i> length;i--)
      jg end

Сосредоточьтесь на ecx там. Вы в основном говорите if(--length > 0) goto end;, поэтому вы пропускаете всю суть вашей функции.

Теперь, когда вы исправите это, вы начнете получать segfault. Вот почему:

    dec ecx  #i--
    inc edx#j++
    jz end

Это эквивалентно --i; if(!++j) goto end;. В результате ваш l oop будет выполнять гораздо больше итераций, чем вы хотите (до тех пор, пока j не переполнится, но на практике сначала произойдет segfault). Я предполагаю, что вы хотели переключить dec ecx и inc edx, так что l oop закончится, когда i дойдет до 0.

В любом случае, с этим тоже исправлено, ваш код вернется обновленный массив, но он все равно будет неправильным. На данный момент это просто потому, что ваша пузырьковая сортировка неверна, а не из-за каких-либо ошибок, связанных со сборкой, поэтому я остановлюсь на этом.

...