【问题标题】:calculating students avg using loop使用循环计算学生平均值
【发布时间】:2016-05-10 18:56:42
【问题描述】:

这个程序应该计算学生的平均成绩。 我正在使用循环让用户输入 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

【问题讨论】:

  • 所以它在inside循环中也不起作用。为什么你需要一个循环,因为你有明确的代码来读取 5 个等级中的每一个?
  • 这是我教授的指示
  • 我非常怀疑您应该使用 [] 从内存中读取 1 到 5 年级。我还觉得您应该只使用第 1 级标签并在每次循环中增加一个寄存器将其作为数组读入 - 这是您的讲师想要的......
  • @MichaelDorgan 非常感谢,迈克尔!我实际上会按照你的指示使用数组,因为我正在考虑它,但我不知道为什么教授要求不要使用数组,但我会做逻辑并提交。感谢收获!
  • 如果您只需要计算平均值,则不需要数组:一旦您将输入的数字添加到总和中(您可以在阅读后立即执行),您不需要不再需要它了。

标签: assembly masm irvine32 masm32


【解决方案1】:
add eax, grade1
add eax, grade2
add eax, grade3
add eax, grade4
mov grade5, eax

上面的代码有两个问题。您一开始没有清除EAX 注册,并且您忘记在五年级添加。更正如下:

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 个成绩的平均值!

【讨论】:

    【解决方案2】:

    您的第二个版本唯一明显的问题是您不使用grade5。也许尝试add grade5, eax,而不是mov grade5, eax,但这不会在eax 中为WriteInt 留下总和。

    使用调试器并单步执行您的代码。如果还有什么您仍然无法弄清楚,请用您希望代码做什么以及它实际上在做什么确切来更新您的问题。问题是什么指令,如果您可以使用调试器缩小范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      相关资源
      最近更新 更多