0

分段错误的问题已经解决,但是仍然存在错误算法本身的问题,它正确地对数字进行排序,但将一些最大的数字放在文件的顶部。例如数字:

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
4

1 回答 1

0

你用ret没用过callcall用于将当前位置压入堆栈。ret基本上只是回到堆栈顶部的东西,因为没有调用,堆栈的顶部是你最后放的东西,所以它会跳转到一个奇怪的位置,我认为你的操作系统是合理的,在程序造成任何损害之前,它会出现段错误。

于 2012-11-25T13:31:30.433 回答