NASM — реализация сортировки выбором не работает

Проблема с ошибкой сегментации решена, однако остается вопрос о неисправном самом алгоритме, который корректно сортирует числа, но кладет одни из самых больших в начало файла. Например числа:

 600196455
1215535209
1560271953
1491899466
2093817641
3618330810
 519782898
3779504611
1656881276
 670566484

после сортировки становятся:

3618330810
3779504611
 519782898
 600196455
 670566484
1215535209
1491899466
1560271953
1656881276
2093817641

СТАРЫЙ Я пытаюсь реализовать программу на ассемблере для чтения 32-битных чисел из файла (максимум 32768 чисел), сортировать их с помощью сортировки выбором и сохранять в указанный файл. До сих пор я успешно писал части, которые читают и записывают данные, однако в моем алгоритме сортировки есть ошибка, которая приводит к ошибке сегментации.

Я использую 32-битную Fedora, процессор i386, ассемблер NASM.

Спасибо

Мой код выглядит следующим образом

section .text
global _start

_start:
    ; read from input
    mov eax, 3
    mov ebx, 0
    mov ecx, array
    mov edx, 4*32768
    int 80h

    mov [fileLength], eax
    shr eax, 2
    mov [numbersCount], eax
    mov [numbersCount1], eax
    dec dword [numbersCount1]

    ; sort
    mov ebp, array
    xor ecx, ecx
    for1:
            mov dword [min], ecx
            xor edx, edx
            mov edx, ecx
            inc edx
            for2:
                    xor esi, esi
                    mov esi, dword [min]
                    mov eax, dword [ebp+4*edx]
                    mov ebx, dword [ebp+4*esi]
                    cmp eax, ebx
                    jge if1
                    mov dword [min], edx
                    if1:
                            inc edx
                            cmp edx, [numbersCount]
                            jl for2
                    xor ebx, ebx
                    xor edx, edx
                    mov ebx, dword [min]

                    mov eax, dword [ebp+4*ebx]
                    mov edx, dword [ebp+4*ecx]
                    mov dword [ebp+4*ebx], edx
                    mov dword [ebp+4*ecx], eax

                    inc ecx
                    cmp ecx, [numbersCount1]
                    jl for1
                    ret
    ; write to output
    mov eax, 4
    mov ebx, 1
    mov ecx, array
    mov edx, [fileLength]
    int 80h

    ; exit to linux
    mov     eax,1
    mov     ebx,0
    int     80h

; initialized data section
; use directives DB (byte), DW (word), DD (doubleword), DQ (quadword)
section .data

; uninitialized data section
; use directives RESB (byte), RESW (word), RESD (doubleword), RESQ (quadword)
section .bss
    fileLength resd 1
    numbersCount resd 1
    numbersCount1 resd 1
    min resd 1
    array resd 32768
    item resd 1

person user1832258    schedule 17.11.2012    source источник
comment
Вам нужно выполнить этот код в gdb, чтобы увидеть, в чем проблема.   -  person Paul R    schedule 17.11.2012
comment
Что мне искать? Пустые или поврежденные регистры, которые я пытаюсь переместить?   -  person user1832258    schedule 17.11.2012
comment
Какую ошибку вы получаете?   -  person Joshua Dwire    schedule 17.11.2012
comment
Когда я пытаюсь запустить его с помощью команды ./selectionSort ‹ файл1 › файл2, я получаю только сообщение о том, что ошибка сегментации (сброс ядра)   -  person user1832258    schedule 17.11.2012
comment
Что ret там делает? Ты call ничего не сделал!   -  person Frank Kotler    schedule 17.11.2012
comment
Конечно! Как глупо с моей стороны. Спасибо за помощь! Еще кое-что. Я запустил его, и произошло то, что он правильно отсортировал эти числа (100 чисел), однако самые большие 44 числа находятся вверху файла, а остальные (оставшиеся 66) - под ними.   -  person user1832258    schedule 17.11.2012


Ответы (1)


Вы используете ret, но не использовали call. call используется для помещения текущего местоположения в стек. ret в основном просто возвращается к тому, что находится на вершине стека, поскольку вызова нет, вершина стека — это то, что вы в последний раз поместили на него, поэтому он перейдет в странное место, где, как я предполагаю, ваша ОС разумна. , он выдает ошибку до того, как программа успевает нанести какой-либо ущерб.

person Code Bundle    schedule 25.11.2012
comment
Спасибо. У меня есть еще один вопрос. Программа работает, но сортирует как-то странно. Проблема начинается, когда у меня есть 6 или более чисел, и происходит то, что пара (зависит от количества чисел) самых больших чисел помещается вверху. Итак, мой отсортированный список выглядит так: 60, 4, 5, 12, 22, 43. Похоже, проблема возникает на первом этапе. Я потратил довольно много времени на поиск ошибки, но я не могу ее найти. Вы его случайно не видите? - person user1832258; 25.11.2012
comment
Какой алгоритм сортировки вы используете, чтобы сэкономить мне время на чтение кода? - person Code Bundle; 25.11.2012
comment
Это сортировка выбором для 32-битных чисел. - person user1832258; 25.11.2012
comment
Ok. Я решил это. Я изменил инструкции «jge» и «jl» на «jae» и «jb» соответственно. Однако я не понимаю этого до конца. В соответствии с определением этих инструкций jge работает для знаковых и jae для беззнаковых целых. В моем случае, к счастью, нет отрицательных чисел, но что произойдет, если мне придется оперировать большими отрицательными числами? Как с этим справиться? - person user1832258; 28.11.2012