Проблема с ошибкой сегментации решена, однако остается вопрос о неисправном самом алгоритме, который корректно сортирует числа, но кладет одни из самых больших в начало файла. Например числа:
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
ret
там делает? Тыcall
ничего не сделал! - person Frank Kotler   schedule 17.11.2012