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せずに使用しcallます。call現在の場所をスタックにプッシュするために使用されます。ret基本的には、スタックの一番上に戻るだけです。呼び出しがないため、スタックの一番上は最後に置いたものであるため、OSが妥当であると思われる奇妙な場所にジャンプします。プログラムがダメージを与える前にセグフォールトします。

于 2012-11-25T13:31:30.433 に答える