【正确答案】DATA SEGMENT PARA PUBLIC'CODE'
DBUF DB 5 ;定义0AH功能的起始地址
DB ?
DB 5DUP(?)
SCORE DB 100DUP(?) ;记录新生分数
COUNT DB 0 ;统计新生总人数
CNT180DB 0 ;统计180以上分数段新生人数
CNT160DB 0 ;统计160以上分数段新生人数
CNT140DB 0 ;统计140以上分数段新生人数
CNT120DB 0 ;统计120以上分数段新生人数
CNT119DB 0 ;统计120以下分数段新生人数
AVG1 DB 0 ;平均分数
HUN DB1 00
TEN DB 10
EROR DB 0DH,0AH,'THIS IS A ILLIGAL NUMBER!$' ;错误信息
INDM DB 0DH,0AH,'PLEASE INPUT: ' ;输入提示信息
DB 0DH,0AH,'$'
DATA ENDS
CODE SEGMENT PUBLIC'CODE'
ASSUME CS: CODE,DS: DATA
MAIN: MOV AX,DATA
MOV DS,AX
LEA DX,1NDM ;显示提示信息
MOV AH,09H
INT 21H
CALL INPT ;输入新生成绩
CALL DDS1 ;对成绩进行分类
CALL AVG ;求平均分数
MOV AH,4CH ;返回DOS
INT 21H
CODE ENDS
;新生成绩输入子程序
INPT PROC
BEG: LEA DX,DBUF ;输入一名新生成绩到存储区
MOV AH,0AH
INT 21H
;判断输入数据是否有效
LEA SI,DBUF+2 ;置新生成绩存储区首地址
MOV CX,DBUF+1 ;取成绩位数
CMP CX,3 ;新生成绩高于200视为无效
JA ERR
MOV BL,[SI] ;输入3位数,最高位不能大于2
CMP BL,'2'
JA ERR
MOV AL,100
AND BL,0FH ;取低4位
MUL BL
MOV DH,AL ;暂存百位数
INC SI ;调整指针
MOV BL,[SI] ;输入2位数成绩,在O~199之间
CMP BL,'9' ;如输入数据大于数字9视为无效
JA ERR
MOV AL,10
AND BL,0FH
MUL BL
ADD DL,AL ;求百位和十位数之和
INC SI ;调整指针
MOV BL,[SI]
CMP BL,'9'
JA ERR
AND BL,0FH
ADD AL,DL ;学生的成绩
MOV SCORE,AL ;将输入有效成绩存入SCORE区
INC SCORE
INC COUNT
CMP COUNT,100
JC BEG ;不足100人,继续输入
ERR: LEA DX,EROR ;显示提示输入错误信息
MOV AH,09H
INT 21H
JMP BEG ;重新输入有效分数
RET
ENDP
;新生成绩分类子程序
DDS1 PROC
LEA SI,SCORE ;置新生成绩存储区首地址
MOV CX,COUNT ;新生数量
LP: MOV AL,[SI] ;取学生成绩
CMP AL,180
JB 179
INC CNT180 ;统计180~200分数段新生人数
179: CMP AL,160
JB 159
INC CNT160 ;统计160~179分数段新生人数
159: CMP AL,140
JB 139
INC CNT140 ;统计140~159分数段新生人数
CMP AL,120
JB 119
INC CNT120 ;统计120~139分数段新生人数
119: INC CNT119 ;统计120分以下新生人数
INC SI
LOOP LP
RET
ENDP
;求新生平均分数
AVG PROC
LEA SI,SCORE
MOV CX,100—1
MOV AL,[SI] ;求成绩总和
MOV AH,0
LP2: ADD AL,[SI+1]
ADC AH,0
INC SI
LOOP LP2
MOV BL,100 ;求平均成绩
MOV AVG1,AL ;将平均分数送AVGl
【答案解析】本题要求从键盘输入学生成绩,并对成绩进行分类统计和显示。需要进行人机交互对话。每名学生的成绩占用1个字节,为无符号二进制整数。需要调用INT 21H的OA号子功能,以回车键作为结束条件。并判断输入数据是否有效:数据在0~200之间,且第一位数不允许为零。否则视为无效,重新输入,直到输入完100名学生成绩数据为止。显示部分请参考教材显示部分。