вычисление среднего студента с помощью цикла

Эта программа должна рассчитывать средние оценки студентов. Я использую цикл для ввода 5 баллов. Я пытался оставить часть div вне цикла, но это не сработало. Мне пришлось поместить его в цикл, хотя по логике этого не происходит, и он всегда печатает 1.

вот код:

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

вычисление среднего, с div внутри цикла:

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

person Ahmed Hadi    schedule 10.05.2016    source источник
comment
Так что это тоже не работает внутри цикла. Зачем вообще нужен цикл, если у вас есть явный код для чтения каждой из 5 оценок?   -  person Scott Hunter    schedule 10.05.2016
comment
Это инструкции моего профессора   -  person Ahmed Hadi    schedule 10.05.2016
comment
У меня есть очень сильное подозрение, что вы должны использовать [] для чтения из памяти для классов от 1 до 5. Я также считаю, что вы должны использовать только метку grade1 и увеличивать регистр каждый раз в цикле, чтобы читать его как массив - это то, что хотел ваш инструктор ...   -  person Michael Dorgan    schedule 11.05.2016
comment
@MichaelDorgan большое спасибо, Майкл! На самом деле я сделаю это, используя массив, как указано в u, так как я думал об этом, но я не знаю, почему профессор просит не использовать массив, но я сделаю то, что логично, и представлю. Спасибо еще раз!   -  person Ahmed Hadi    schedule 11.05.2016
comment
Если вам нужно только вычислить среднее значение, вам не нужен массив: как только вы добавите введенное число в сумму (что вы можете сделать сразу после его чтения), он вам больше не понадобится.   -  person Scott Hunter    schedule 11.05.2016
comment
@ScottHunter, это то, что я пытался сделать, но у меня не получилось! Ставлю расчет средн. инструкции вне цикла, и я не работал. Когда я помещаю его в цикл, это дает мне пять шансов добавить пять оценок, я имею в виду добавление пяти оценок в общей сложности пять раз, в данном случае 25 раз среднее. вычисляется, но НЕ, когда я держу его вне цикла, что очень странно. Почему не вычисляется среднее значение, когда я оставляю инструкции вычисления среднего значения вне цикла? вот что меня смущает. Спасибо!   -  person Ahmed Hadi    schedule 11.05.2016
comment
Если вы прочитали 5 значений (оценка 1… оценка 5) и повторили это 5 раз, почему вы удивлены, увидев в общей сложности 25 значений? И если вам нужна помощь с другой версией кода, вы должны опубликовать эту версию.   -  person Scott Hunter    schedule 11.05.2016
comment
@ScottHunter bcoz, как я уже сказал, когда я продолжаю вычислять инструкции вне цикла, он не считает среднее ни разу! Как это может работать внутри цикла, но не снаружи ?!   -  person Ahmed Hadi    schedule 11.05.2016
comment
Пожалуйста, покажите код с div внутри цикла.   -  person Scott Hunter    schedule 11.05.2016
comment
@ScottHunter Я только что сделал.   -  person Ahmed Hadi    schedule 12.05.2016


Ответы (2)


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

В приведенном выше коде есть 2 проблемы. Вы не очистили регистр EAX в начале и забыли добавить в 5-й класс. Исправьте это так:

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

Чтобы вычислить среднее значение, вам нужно разделить двойное слово в EAX на 5, но, написав div cl, вы разделите слово только на AX. Лучше всего использовать следующее:

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

Мне пришлось поместить его в цикл, хотя логически это не имеет смысла

Имеет смысл вводить по 5 оценок для 5 учащихся.
Что не имеет смысла, так это цикл myLoop в 1-й программе. Это даст только среднее значение за последний набор из 5 оценок!

person Sep Roland    schedule 15.05.2016

Единственная очевидная проблема с вашей второй версией заключается в том, что вы не используете grade5. Можно попробовать add grade5, eax вместо mov grade5, eax, но это не оставит сумму в eax для WriteInt.

Используйте отладчик и выполняйте пошаговое выполнение кода. Если есть что-то, что вы все еще не можете понять, обновите свой вопрос, указав, что именно вы хотите, чтобы ваш код делал и что именно он делает на самом деле. А в какой инструкции проблема, если можно сузить отладчиком.

person Peter Cordes    schedule 12.05.2016