计算8086程序集中的平均值 - 结束循环

时间:2017-02-02 02:34:48

标签: assembly masm x86-16 dos

我正在尝试计算平均值,我可以在程序中输入但是我无法停止循环并看到(平均值)

这是我的示例代码。

.MODEL SMALL
.DATA
        VAL1         DB      ?
        DISPLAY1     DB      0AH,0DH,'HOW MANY NUMBER OF STUDENT SCORES DO YOU WANT TO INPUT? :','$'
        DISPLAY2         DB      0AH,0DH,'ENTER NO:','$'
        DISPLAY3         DB      0AH,0DH,'AVEARGE:','$'
    BUFFER       DB      3,4 DUP(?)
.CODE
MAIN    PROC

.STARTUP

        LEA DX,DISPLAY1 ; loads the message in the variable display 1
        MOV AH,09H  ; interrupt function to display the message
        INT 21H

        MOV AH,0AH  ; Read into buffer
    INT 21H
    SUB AL,30H

    MOV CL,AL
    MOV BL,AL   ; moves the content of al to bl register
        MOV AL,00   ; sets the value of al to zero, the value of al is now in bl register
        MOV VAL1,AL ; stores al in val1 NB: al is still zero.

        LBL1:
        LEA DX,DISPLAY2 ; displays message in display 2
        MOV AH,09H
        INT 21H

        MOV AH,0AH  ;Read into buffer
    LEA DX,BUFFER
    INT 21H
    SUB AL,30H

        ADD AL,VAL1 ; add val1 to al i.e, it now adds the previous value to the new one.
        MOV VAL1,AL ; saves the added value to val 1.
        LOOP LBL1   ; continues too add.   

        LBL2:
        LEA DX,DISPLAY3 ; displays character in display 3
        MOV AH,09H
        INT 21H

        MOV AX,00   ; sets ax value back to 00
        MOV AL,VAL1 ; moves the total value back to al
        DIV BL      ; divides the total value with the inputed number of values tht was stored in bl
        ADD AX,3030H    ;  convert to ASCII
        MOV DX,AX   ; now moves the content of ax register to data register
        MOV AH,09H  ; this displays the result
        INT 21H

.EXIT

MAIN    ENDP
        END     MAIN

1 个答案:

答案 0 :(得分:2)

您没有使用正确的输入功能!

MOV AH,0AH  ; Read into buffer
INT 21H
SUB AL,30H

使用DOS功能0Ah时,之后在AL寄存器中找不到任何有用的内容 你还在学习如何做到这一点,所以让你的生活更轻松,从最简单的输入功能开始。

MOV  AH, 01h  ;Wait for a key
INT  21h
SUB  AL, 30h
xor  cx, cx
mov  cl, al

请参阅如何将字数放入字大小CX寄存器而不是字节大小的CL寄存器中?在程序的后面,您使用的loop指令取决于这个事实。

当输入所有学生的分数时,使用相同的小数字并使用相同的输入功能。 只有当此程序有效时,您才应尝试输入更大(多位)的数字。

在计算平均值时,您只需要除法的商。把它变成一个字符并用正确的输出功能02h显示它。

xor  ax, ax   ; sets ax value back to 00
MOV  AL, VAL1 ; moves the total value back to al
DIV  BL       ; number of values was stored in bl
ADD  AL, 30h  ; convert to ASCII
mov  dl, al
MOV  AH, 02h  ; this displays the result
INT  21h