POP CX
LOOP III ;外循环 PUSH DS
MOV AX,DATA
MOV DS,AX ;重置DS使其指向DATA段 MOV AH,09H
MOV DX,OFFSET MESS
INT 21H ;显示SORT OK 信息 POP DS
MOV CX,SORTNUM VVV: MOV AL,[SI] CALL DISP1 PUSH AX PUSH DX
MOV DL,20H MOV AH,02H INT 21H POP DX POP AX INC SI
LOOP VVV ;并排序后数显示出来 MOV AX,4C00H
INT 21H ;返回DOS
DISP1 PROC NEAR ;显示子程序,显示AL寄存器的内容 PUSH CX MOV BL,AL MOV DL,BL MOV CL,04 ROL DL,CL AND DL,0FH CALL DISPL MOV DL,BL AND DL,0FH CALL DISPL POP CX RET DISP1 ENDP
DISPL PROC NEAR ADD DL,30H CMP DL,3AH JB DDD ADD DL,27H DDD: MOV AH,02H INT 21H RET
DISPL ENDP ;参见数值显示实验程序清单 CODE ENDS
END START
25
实验五 学生成绩名次表实验
一、实验要求:
根据提示将0~100之间的10个成绩存入首址为1000H的单元,1000H+ⅰ表示学号为ⅰ的学生成绩,编写程序能在2000H开始的区域排出名次表,2000H+ⅰ为学生号ⅰ的学生的名次,并将其显示在屏幕上。
二、实验目的:进一步熟悉排序方法。 三、实验程序框图:
入口 CX入栈保存 学生数送CS AL送0分
BX和SI发向成绩表首址
Y
AL>=[SI] N [SI]送AL,DX记录对应学号
SI+1 N
CX-1=0 Y 将本次扫描的最高成绩清0
CX出栈
返回 四、实验程序: CRLF MACRO
MOV AH,02H MOV DL,0DH INT 21H
MOV AH,02H MOV DL,0AH
开始 初始化 显示提示信息 SI指向成绩表首址 学生送数CX 调GETNUN,该成绩送[SI] N SI+1 Y CX-1=0 学生送数CX DI指向名次表首址 调SCAN子程序,扫描成绩表 计算名次,填入DX举号对应的名次单元 N CX-1=0 Y 显示学生名次 返回DOS 26
INT 21H ENDM
DATA SEGMENT STUNUM EQU 10
MESS1 DB '请依次输入1-10号学生的成绩',0DH,0AH,'$' ERROR DB '输入错误,请重新输入!',0DH,0AH,'$' MESS2 DB '1-10号学生名次依次为:',0DH,0AH,'$' EMARK DB ? ORG 1000H SCORE DB 30 DUP(?) ORG 2000H SEQU DB 30 DUP(?) DATA ENDS
STACK SEGMENT STA DW 32 DUP(?) TOP DW ? STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV SP,TOP ;初始化 MOV AH,09H MOV DX,OFFSET MESS1 INT 21H ;显示提示信息 MOV SI,OFFSET SCORE ;成绩表首址 MOV CX,STUNUM ;学生数送CX MOV EMARK,0
UUU: CALL GETNUM ;读取键入数值送DX CMP EMARK,01H JE START MOV [SI],DL ;存入成绩表缓冲区中 INC SI ;指向下一单元 LOOP UUU MOV CX,STUNUM ;学生数 MOV DI,OFFSET SEQU ;名次表首址 VVV: CALL SCAN ;扫描子程序 MOV AL,STUNUM ;学生数 SUB AL,CL INC AL ;计算名次 MOV BX,DX MOV [DI+BX],AL ;记DX学号对应名次 LOOP VVV MOV AH,09H
27
LEA DX,MESS2 INT 21H MOV CX,STUNUM ;学生数 MOV SI,OFFSET SEQU ;名次表首址 WWW: MOV AL,[SI] CALL DISPI PUSH DX PUSH AX MOV AH,02 MOV DL,20H INT 21H POP AX POP DX INC SI LOOP WWW ;显示排定的学生名次 MOV AX,4C00H INT 21H
SCAN PROC NEAR ;子程序,每扫描一遍成绩表缓冲区, 找出其成绩最高者 ;(由DX指针指示对应学生),之后将该成绩清除以便下一次扫描 PUSH CX
MOV CX,STUNUM ;学生数 MOV AL,00H ;最低成绩 MOV BX,OFFSET SCORE
MOV SI,BX ;指向成绩表首址 CCC: CMP AL,[SI]
JAE JJJ ;AL中的成绩不低于成绩表指针SI所指单元的成绩则转JJJ MOV AL,[SI] ;AL存放较高的成绩 MOV DX,SI
SUB DX,BX ;DX为对应学号 JJJ: INC SI ;指向下一单元 LOOP CCC ADD BX,DX
MOV BYTE PTR [BX],00H ;本次扫描成绩最高者清0 POP CX RET SCAN ENDP
DISPI PROC NEAR ;显示子程序 PUSH CX MOV BL,AL MOV DL,BL MOV CL,04 ROL DL,CL AND DL,0FH CALL DISPL MOV DL,BL
28
AND DL,0FH CALL DISPL POP CX RET DISPI ENDP
DISPL PROC NEAR ADD DL,30H CMP DL,3AH JB DDD ADD DL,27H DDD: MOV AH,02H INT 21H RET
DISPL ENDP
GETNUM PROC NEAR PUSH CX XOR DX,DX GGG: MOV AH,01H INT 21H
CMP AL,0DH JZ PPP
SUB AL,30H JB KKK CMP AL,09H JBE GETS JMP KKK GETS: MOV CL,04 SHL DX,CL XOR AH,AH ADD DX,AX JMP GGG
KKK: MOV AH,09H
MOV DX,OFFSET ERROR INT 21H
MOV EMARK,01H PPP: PUSH DX CRLF
POP DX POP CX RET
GETNUM ENDP CODE ENDS END START
;键读入子程序
29