问答题 编程:
   (1)键入某班学生(30人)的计算机考试成绩。成绩按学号(1~30)排放在SCORE数据区中。
   (2)按考分排序(降序),列出相应学号到ORDER数据区中。
   (3)在屏幕上显示前三名学生的学号和他们的成绩。
   请编写主程序及三个子程序,实现调用关系。
【正确答案】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号存入排序的第一位置,依此类推。