【正确答案】DATA SEGMENT PARA PUBLIC'CODE'
DBUF DB 5 ;定义OAH功能的起始地址
DB ?
DB 5DUP(?)
COUNT DB 0 ;统计学生人数
SCORE DB 30DUP(?) ;学生成绩存储区
ORDER DB 30DUP(?) ;学生成绩排序区
HUN DB '100$' ;成绩为100分
EROR DB 0DH,0AH,'THIS IS A ILLIGAL NUMBER!$' ;错误信息
INDM DB 0DH,0AH,'PLEASE INPUT: ' ;输入提示信息
DB 0DH,0AH,'$'
DDS DB '前三名学生计算机考试成绩和学号分别是$'
DATA ENDS
CODE SEGMENT PUBLIC 'CODE'
ASSUME CS: CODE,DS: DATA,ES: DATA
MAIN: MOV AX,DATA
MOV DS,AX
LEA DX,INDM ;显示提示信息
MOV AH,09H
INT 21H
CALL INPT
MOV AH,4CH
INT 21H
INPT PROC
BEG: LEA DX,DBUF ;输入一名学生成绩到存储区
MOV AH,0AH
INT 21H
;判断输入成绩是否合法
LEA SI,DBUF+2 ;置成绩输入首地址
MOV CX,DBUF+1 ;取输入成绩位数
CMP Cx,3 ;学生成绩多于3位则视为无效
JA ERR
CMP CX,3
JC BB ;输入2位数成绩
MOV BL,[SI] ;输入3位数,只有满分100一种情况
CMP BL,'1'
JNZ ERR
INC S1 ;调整指针
MOV BL,[SI]
CMP BL,'0' ;判断输入成绩是否有效
JA ERR
INC SI
CMP BL,'0'
JA ERR
LEA D1,SCORE
MOV [D1],100
INC SCORE
INC COUNT
CMP COUNT,30
JC BEG ;不足30人,继续输入
JMP ORDER ;30人成绩输入完毕,进行排序
;非0~99间的数为非法数
BB: MOV BL,[SI] ;输入2位数成绩,在0~99之间
CMP BL,'9' ;如输入数据大于数字9则视为无效
JA ERR
MOV AL,10
AND BL,0FH
MUL BL
INC SI ;调整指针
MOV BL,[SI]
CMP BL,'9'
JA ERR
AND BL,0FH
ADD AL,BL ;2位数的成绩
MOV SCORE,AL ;将有效输入成绩存入SCORE区
INC SCORE
INC COUNT
CMP COUNT,30
JC BEG ;不足30人,继续输入
JMP ORDER ;30人成绩输入完毕,进行排序
ERR: LEA DX,EROR ;显示提示输入错误信息
MOV AH,09H
INT 21H
JMP BEG ;重新输入有效成绩
RET
ENDP
ORDER: CALLORD
CALL DISP
;将输入30名学生的有效成绩进行排序
ORD PROC ;排序
MOV CX,29
LEA SI,SCORE
LEA DI,ORDER
LOP1: MOV DX,CX
MOV AL, [SI] ;查找第一个最大数
LOP2: CMP AL,[SI+1]
JA NEXT
MOV BL,[SI] ;保存交换的学生序号
XCHG AL,[SI+1]
NEXT: INC SI
DEC DX
JNZ LOP2
MOV [DI],BL+1 ;保存成绩的学号
INC DI ;修改排序指针
MOV SI,DI ;将指针恢复到查找下一个最大数
LOOP LOP1 ;判断排序是否结束
RET
ENDP
;显示前3名学生的成绩和学号
DISP PROC
LEA DX,DDS;显示标题
MOV AH,09H
INT 21H
LEA SI,ORDER
MOV CX,3
AG: LEA DI,SCORE
MOV AL,[SI]
ADD [DI],AL ;求学生成绩位次对应的学号
MOV AL,[DI] ;由学号取成绩
CMP AL,100
JNZ DIS2
MOV DX,OFFSET HUN ;显示成绩为100分
MOV AH,09H
INT 21H
JMP SNUB
DIS2: MOV BL,10
MOV AH,0
DIV BL
MOV DH,AH ;显示成绩的高位数
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
MOV AL,DH ;显示成绩的低位数
ADD AL,30H
MOV DL,AL
INT 21H
MOV DL,'' ;显示一个空格
INT 21H
SNUB: MOV AH,00H
MOV AL,[SI] ;求学号
MOV BL,10
DIV BL
MOV DH,AH ;保存学号低位数
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
MOV DL,DH
ADD DL,30H
INT 21H
MOV DL,0DH ;回车换行
INT 21H
MOV DL,0AH
INT 21H
INC SI
LOOP AG
RET
ENDP
CODE ENDS
END MAIN
【答案解析】本题为输入学生计算机考试成绩和学号的二维关系表,进行人机交互对话。每个学生的成绩占用一个字节,为无符号二进制整数。输入一门成绩需要用INT 21H的OA号子功能,以回车键作为结束条件。并判断输入成绩是否有效:成绩在0~100之间,且第一位数不允许为零。无效则重新输入,直到输入30个有效成绩为止。由于成绩是按学号排列,因此在成绩排序时,只要将学号放入对应位置就得到成绩排序表。如第15号学生的成绩为第一名,则将15号存入排序的第一位置,依此类推。