2016-05-10 6 views
1

Dieses Programm sollte die durchschnittlichen Noten von Studenten berechnen. Ich benutze eine Schleife für den Benutzer, um 5 Noten einzugeben. Ich habe versucht, den Div-Teil außerhalb der Schleife zu halten, aber es hat nicht funktioniert. Ich hatte es in der Schleife zu setzen, obwohl logisch nicht da macht und druckt es immer 1.Berechnung von Studenten avg mit Schleife

hier ist der Code:

include irvine32.inc 

; Write a MASM program that calculates the avg grade of a student(Five grades are inputted by the user). 

.data 

mesg byte "  *********This program calculates average grades of students *********", 0dh, 0ah, 0 
mesg1 byte "Enter 5 grades: ", 0dh, 0ah, 0 
mesg2 byte "The average grade is: ", 0dh, 0ah, 0 

grade1 dword ? 
grade2 dword ? 
grade3 dword ? 
grade4 dword ? 
grade5 dword ? 


.code 
main proc 

mov eax, 0 

mov edx, OFFSET mesg 
call writestring 

mov edx, OFFSET mesg1 
call writestring 

mov ecx, 5 

myLoop : 

call readint 
mov grade1, eax 
call readint 
mov grade2, eax 
call readint 
mov grade3, eax 
call readint 
mov grade4, eax 
call readint 
mov grade5, eax 

add eax, grade1 
add eax, grade2 
add eax, grade3 
add eax, grade4 
mov grade5, eax 

call writeint 

call dumpregs 

    LOOP myLoop 

mov edx, OFFSET mesg2 
call writestring 

mov eax, grade5 
mov cl, 5 
sub edx, edx 
div cl 

call writeint 
call dumpregs 


exit 
main endp 
end main 

Berechnung avg, mit dem div innerhalb der Schleife :

include irvine32.inc 

; Write a MASM program that calculates the avg grade of a student(Five grades are inputted by the user). 

.data 

mesg byte "  *********This program calculates average grades of students *********", 0dh, 0ah, 0 
mesg1 byte "Enter 5 grades: ", 0dh, 0ah, 0 
mesg2 byte "The average grade is: ", 0dh, 0ah, 0 

grade1 dword ? 
grade2 dword ? 
grade3 dword ? 
grade4 dword ? 
grade5 dword ? 


.code 
main proc 

    mov eax, 0 

    mov edx, OFFSET mesg 
    call writestring 

    mov edx, OFFSET mesg1 
    call writestring 

    mov ecx, 5 

myLoop: 
    call readint 
    mov grade1, eax 
    call readint 
    mov grade2, eax 
    call readint 
    mov grade3, eax 
    call readint 
    mov grade4, eax 
    call readint 
    mov grade5, eax 

    add eax, grade1 
    add eax, grade2 
    add eax, grade3 
    add eax, grade4 
    mov grade5, eax 

    call writeint 

    call dumpregs 


    mov edx, OFFSET mesg2 
    call writestring 

    mov eax, grade5 
    mov ebx, 5 
    sub edx, edx 
    div ebx 

    call writeint 
    call dumpregs 

    LOOP myLoop 


    exit 
main endp 
end main 
+1

So funktioniert es nicht * innerhalb * der Schleife, entweder. Warum brauchen Sie überhaupt eine Schleife, da Sie einen expliziten Code haben, um jede der 5 Klassen zu lesen? –

+0

Es ist mein Professor Anweisungen –

+0

Ich habe einen sehr starken Verdacht, Sie sollten [] verwenden, um aus dem Speicher für Note1 bis 5 zu lesen. Ich denke auch, dass Sie nur die Note1 Label verwenden und ein Register jedes Mal durch die Schleife zu lesen es als ein Array - was dein Lehrer wollte ... –

Antwort

2
add eax, grade1 
add eax, grade2 
add eax, grade3 
add eax, grade4 
mov grade5, eax 

Der obige Code hat zwei Probleme. Sie haben das EAX Register am Anfang nicht gelöscht und Sie haben vergessen, in der 5. Klasse hinzuzufügen. Korrigieren Sie es mögen:

mov eax, grade1 <-- MOV = start with a clean EAX 
add eax, grade2 
add eax, grade3 
add eax, grade4 
add eax, grade5 
mov grade5, eax 

mov eax, grade5 
mov cl, 5 
sub edx, edx 
div cl 

Zur Berechnung des durchschnittlichen Sie den DWORD-Wert in EAX von 5 teilen möchten, aber durch div cl Schreiben Sie nur das Wort in AX teilen. Beste Verwendung der folgende:

mov eax, grade5 
mov ecx, 5 
sub edx, edx ;Will divide EDX:EAX by ECX 
div ecx   ;Quotient in EAX 

Ich hatte es in der Schleife zu setzen, obwohl logisch keinen Sinn macht

Es macht Sinn, wenn die Eingabe 5 Stufen für jeweils 5 Studenten .
Was macht keinen Sinn ist die myLoop Schleife auf dem 1. Programm. Es gibt nur einen Durchschnitt für die letzten 5 Noten!

0

Der einzige offensichtliche Problem mit der zweiten Version ist, dass Sie nicht grade5 verwenden. Vielleicht versuchen Sie add grade5, eax statt mov grade5, eax, aber das wird nicht die Summe in eax für WriteInt verlassen.

Verwenden Sie einen Debugger und Einzelschritt durch Ihren Code. Wenn es etwas gibt, was Sie immer noch nicht herausfinden können, aktualisieren Sie Ihre Frage mit dem, was genau Ihr Code tun soll, und was genau es tatsächlich tut. Und welcher Befehl ist das Problem, wenn Sie es mit einem Debugger eingrenzen können.

Verwandte Themen