分段故障的问题已经解决了,但是仍然存在一个错误的算法本身的问题,它正确地对数字进行排序,但是将一些最大的数据放在文件的顶部。 例如数字:
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
答案 0 :(得分:0)
您在未使用ret
的情况下使用call
。 call
用于将当前位置推送到堆栈。 ret
基本上只是回到堆栈顶部的东西,因为没有调用,堆栈的顶部是你最后放在它上面的东西,所以它会跳转到一个奇怪的位置,我认为你的操作系统是合理的,它会在程序造成任何损害之前发生段错误。