分段错误的问题已经解决,但是仍然存在错误算法本身的问题,它正确地对数字进行排序,但将一些最大的数字放在文件的顶部。例如数字:
600196455 1215535209 1560271953 1491899466 2093817641 3618330810 519782898 3779504611 1656881276 670566484
排序后变为:
3618330810 3779504611 519782898 600196455 670566484 1215535209 1491899466 1560271953 1656881276 2093817641
OLD 我正在尝试实现一个汇编程序来从文件中读取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