TITLE P181_6_9_ProgramAuthor_ChenXiaoTian_54
;*****************DataSegment****************
DATA_SEG SEGMENT
SCORE DW 10 DUP (?)
CRLF DB 13,10,'$' ; For CRLF_SUB
TEN DB 10 ; /10
MSG0 DB 'Please input ten score: $'
MSG1 DB '60-69: $'
MSG2 DB '70-79: $'
MSG3 DB '80-89: $'
MSG4 DB '90-99: $'
MSG5 DB '100: $'
S6 DB 0
S7 DB 0
S8 DB 0
S9 DB 0
S10 DB 0
DATA_SEG ENDS
;*****************CodeSegment****************
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE, DS:DATA_SEG
START:
MOV AX, DATA_SEG ; initialization DS segment
MOV DS, AX
MOV SI, 0 ; initialization array pointer
MOV CX, 10 ; initialization count
LEA DX, MSG0 ; Print MSG0
MOV AH, 09
INT 21H
CALL CRLF_SUB
PUSH CX ; Save CX and SI
PUSH SI
INPUT_LOOP:
CALL INPUT_SUB
MOV SCORE[SI], BX
INC SI
INC SI
LOOP INPUT_LOOP
POP SI
POP CX
START_L:
MOV AX, SCORE[SI]
CALL COUNT_SUB
INC SI
INC SI
LOOP START_L
CALL PRINT_SUB ;Print S6--S10
MOV AX, 4C00H ;Return DOS
INT 21H
MAIN ENDP
;*****************SubProgram****************
INPUT_SUB PROC
MOV BX, 0 ;For input number
NEWCHAR:
MOV AH, 01 ; Keyboard input
INT 21H
SUB AL, 30H ; If not input number then EXIT
JL EXIT
CMP AL, 9D
JG EXIT
CBW
XCHG AX, BX
IMUL TEN
XCHG AX, BX
ADD BX, AX
JMP NEWCHAR
EXIT: RET
INPUT_SUB ENDP
COUNT_SUB PROC
IDIV TEN
CMP AL, 6
JZ L1 ;60-69
CMP AL, 7
JZ L2 ;70-79
CMP AL, 8
JZ L3 ;80-89
CMP AL, 9
JZ L4 ;90-99
CMP AL, 10
JZ L5 ;100
OVER: RET
L1: INC S6
JMP OVER
L2: INC S7
JMP OVER
L3: INC S8
JMP OVER
L4: INC S9
JMP OVER
L5: INC S10
JMP OVER
COUNT_SUB ENDP
CRLF_SUB PROC ; Print CR and LF
LEA DX, CRLF
MOV AH, 09
INT 21H
RET
CRLF_SUB ENDP
PRINT_SUB PROC ;Print result
LEA DX, MSG1
MOV AH, 09
INT 21H
MOV DL, S6
ADD DL, 30H
MOV AH, 02
INT 21H
CALL CRLF_SUB ; Print CR and LF