该计划应计算学生的平均成绩。 我使用循环为用户输入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
计算avg:
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
答案 0 :(得分:2)
add eax, grade1 add eax, grade2 add eax, grade3 add eax, grade4 mov grade5, eax
上面的代码有两个问题。您在开始时没有清除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 循环。它只给出了最后一组5个等级的平均值!
答案 1 :(得分:0)
第二个版本唯一明显的问题是您不使用add grade5, eax
。也许尝试mov grade5, eax
,而不是eax
,但这不会在pre-commit
中为WriteInt留下总和。
使用调试器并单步执行代码。如果还有任何问题仍然无法解决,请更新您的问题,确切地说您希望代码执行什么,以及完全它实际正在做什么。如果您可以使用调试器缩小范围,那么问题是什么指令。