NASM - 选择排序实现不起作用

时间:2012-11-17 17:47:25

标签: assembly nasm i386

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

 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

1 个答案:

答案 0 :(得分:0)

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

相关问题