0

NASM Ubuntu でバブル ソート プログラムを作成するように依頼されました。コードは次のとおりです。

section .data
i           db 0                    ; Value to be incremented
question    db  'Enter a number: '  ; Prompt
questionLen equ $-question
newLine     db 10, 10, 0            ; New blank line
newLineLen  equ $-newLine

section .bss
num resb 5          ; Array of size 5
counter resb 1      ; Value to be incremented
counter2 resb 1     ; Value to be incremented
temp resb 1
temp2 resb 1

section .text
global _start

_start:
mov esi, 0

getInput:
mov eax, 4
mov ebx, 1
mov ecx, question           ; Prints the question
mov edx, questionLen
int 80h

add byte[i], 30h            ; I'll retain this expression, since the program experienced an error
                                ; when this expression is deleted
sub byte[i], 30h            ; Converts the increment value to integer

mov eax, 3
mov ebx, 0
lea ecx, [num + esi]        ; Element of the array
mov edx, 2
int 80h

inc esi
inc byte[i]
cmp byte[i], 5              ; As long as the array hasn't reached the size of 5,
jl getInput                 ; the program continues to ask input from the user

mov esi, 0
mov byte[i], 0
mov edi, 0                  ; Index of the array

bubble_sort:
mov byte[counter], 0
mov byte[counter2], 0

begin_for_1:
    mov al, 0
    mov al, [counter]       ; Acts as the outer for loop
    cmp al, 5
    jg printArray           ; Prints the sorted list when the array size has reached 5
begin_for_2:
    mov edi, [counter2] ; Acts as the inner for loop
    cmp edi, 4
    jg end_for_2
    mov bl, 0               ; Acts as the if statement
    mov cl, 0
    mov bl, [num + edi]
    mov cl, [num + edi + 1]
    mov byte[temp], cl  ; This is the same as if(a[j] > a[j + 1]){...}
    cmp bl, [temp]
    jg bubbleSortSwap
return:
    inc edi                 ; Same as j++
    jmp begin_for_2     ; Goes out of the inner for loop
end_for_2:
    inc byte[counter]       ; Same as i++
    jmp begin_for_1     ; Goes out of the outer for loop

bubbleSortSwap:
mov [num + edi + 1], bl
mov [num + edi], cl     ; The set of statements is the same as swap(&a[j], &a[j + 1]);
jmp return

printArray:
mov eax, 4
mov ebx, 1
mov ecx, [num + esi]        ; Prints one element at a time
mov edx, 1
int 80h

inc esi
inc byte[i]
cmp byte[i], 5
jl printArray               ; As long as the array size hasn't reached 5, printing continues

mov eax, 4
mov ebx, 1
mov ecx, newLine            ; Displays a new blank line after the array
mov edx, newLineLen
int 80h

mov eax, 1                  ; Exits the program
mov ebx, 0
int 80h

ただし、唯一の問題は、次のように最初の反復のみを印刷するため、残りの反復を印刷できないことです。

Enter a number: 7
Enter a number: 1
Enter a number: 4
Enter a number: 3
Enter a number: 5
17435

出力したいのは、最初の反復から最後の反復までの配列入力と最終出力です。

4

1 に答える 1

0

いや...彼はいくつかのものを整理する必要があるだけです!:)

投稿されているように、出力はまったく印刷されません。問題は、「[contents]」をecxに入れていることです-アドレスが必要です-入力ルーチンで正しく行います。

より少ない変数でうまくいくことができます - 「カウント」と「インデックス」の両方としてesiおよび/またはediを使用してください。変数を使用する場合は、変数のサイズが移動先のレジスタのサイズと一致していることを確認してください。("mov edi, [counter2]" はあなたが望むことをしていません) 勇気! それが簡単なら、みんなやっているだろう。

ベスト、フランク

于 2012-09-05T20:07:51.793 に答える