セグメンテーション違反の問題は解決されましたが、数値を正しくソートするが、ファイルの先頭に最大のものをいくつか配置する、アルゴリズム自体の誤りの問題が残っています。例:番号:
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