📄 student.asm
字号:
;****************************************************************************************
;附加段定义
EXTRA SEGMENT ;define extra segment
SCORE1 DW 10 DUP(?)
EXTRA ENDS
;数据段定义
DATA SEGMENT ;define data segment
NAMETAB DB 10 DUP(5 DUP(?)) ;name table
SCORE DW 10 DUP(?) ;score table
RANK DW 10 DUP(?) ;rank table
NAMELEN DW ?
COUNT DW ?
MESS1 DB 'Please input student name and score',13,10,'$'
MESS2 DB 'Sorry!you input false data,please input true data',13,10,'$'
MESS3 DB ' Name:','$'
MESS4 DB ' Score:','$'
MESS5 DB 'The rank of score',13,10,'$'
MESS6 DB 'Display the student name $'
MESS7 DB 'Display the student score $'
MESS8 DB 'Display the student rank $'
MESSAGE1 DB '**************** MENU *******************',13,10,'$'
MESSAGE2 DB 'choice 1:INPUT NAME AND SCORE!',13,10,'$'
MESSAGE3 DB 'choice 2:caculate the rank!',13,10,'$'
MESSAGE4 DB 'choice 3:SHOW THE NAME SCORE AND RANK!',13,10,'$'
MESSAGE5 DB 'choice 4:quit!',13,10,'$'
MESSAGE6 DB '*****************************************',13,10,'$'
DATA ENDS
; ******************************************************************************
CODE SEGMENT
;****************************主程序*************************************
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA,ES:EXTRA
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AX,EXTRA
MOV ES,AX
CALL MENU
OPERATOR: MOV AH,1
INT 21H
CMP AL,31H ;当输入1,执行输入名字分数
JE READDATA
CMP AL,32H ;当输入2,执行排序计算名次
JE RANK1
CMP AL,33H ;当输入3,执行显示名字,分数,名次
JE DISPLAY11
CMP AL,34H ;当输入4,执行退出
JE EXIT
JMP EXIT
READDATA: CALL INPUTDATA
CALL CRLF
CALL MENU
JMP OPERATOR
RANK1: CALL CHANGEMEM
CALL FAR PTR SCOREARRANGE
CALL RANK2
CALL CRLF
CALL MENU
JMP OPERATOR
DISPLAY11:
CALL FAR PTR DISPLAY2
CALL CRLF
CALL MENU
JMP OPERATOR
EXIT: RET
MAIN ENDP
;**********************主程序结束********************************
;**********************子程序************************************
MENU PROC NEAR ;菜单显示
MOV DX,OFFSET MESSAGE1
MOV AH,9H
INT 21H
CALL CRLF
MOV DX,OFFSET MESSAGE2
MOV AH,9H
INT 21H
CALL CRLF
MOV DX,OFFSET MESSAGE3
MOV AH,9H
INT 21H
CALL CRLF
MOV DX,OFFSET MESSAGE4
MOV AH,9H
INT 21H
CALL CRLF
MOV DX,OFFSET MESSAGE5
MOV AH,9H
INT 21H
CALL CRLF
MOV DX,OFFSET MESSAGE6
MOV AH,9H
INT 21H
RET
MENU ENDP
;---------------------------------------------------------------------------
INPUTDATA PROC NEAR ;输入名字 ,分数
CALL CRLF
MOV DX,OFFSET MESS1
MOV AH,9
INT 21H
CALL CRLF
MOV NAMELEN,0
MOV CX,10
BEG: CALL CRLF
MOV AH,9
MOV DX,OFFSET MESS3
INT 21H
CALL NEAR PTR INPUTNAME ; 调用输入名字的子程序
ADD NAMELEN,5
CALL CRLF
MOV AH,9
MOV DX,OFFSET MESS4
INT 21H
CALL NEAR PTR INPUTSCORE ; 调用输入成绩的子程序
ADD SI,2
CALL CRLF
LOOP BEG
RET
INPUTDATA ENDP
; --------------------------------------------------------------------------------
;输入字符 (5个字节)
INPUTNAME PROC NEAR
PUSH CX
MOV DI,NAMELEN
MOV CX,5
BEG1: MOV AH,1
INT 21H
MOV NAMETAB[DI],AL
INC DI
LOOP BEG1
POP CX
RET
INPUTNAME ENDP
;-----------------------------------------------------------------------------------------------
;输入数字 (2个字节)
INPUTSCORE PROC NEAR
MOV BX,0
PUSH CX
MOV CX,2
BEG2: PUSH CX
MOV AH,1
INT 21H
CMP AL,30H
JB FALSE
CMP AL,39H
JA FALSE
SUB AL,30H
CBW
XCHG AX,BX
MOV CX,10D
MUL CX
XCHG AX,BX
ADD BX,AX
POP CX
LOOP BEG2
MOV SCORE[SI], BX
POP CX
JMP EXIT1
FALSE: CALL CRLF
MOV DX,OFFSET MESS2
MOV AH,9
INT 21H
POP CX
MOV SI,0
MOV DI,0
MOV CX,10
MAG: MOV RANK[BX],0
INC BX
LOOP MAG
CALL CRLF
CALL MENU
JMP OPERATOR
EXIT1: RET
INPUTSCORE ENDP
;-------------------------------------------------------------------------------
;把分数放到临时存储区
CHANGEMEM PROC NEAR
MOV SI,0
MOV DI,0
LEA DI,SCORE1
LEA SI, SCORE
CLD
MOV CX,10
REP MOVSW
RET
CHANGEMEM ENDP
;---------------------------------------------------------------------------------------------------
;把成绩排序
SCOREARRANGE PROC FAR
MOV CX,10
DEC CX
LP1: MOV DI,CX
MOV BX,0
LP2: MOV AX,SCORE1[BX]
CMP AX, SCORE1[BX+2]
JAE AGAIN
XCHG AX, SCORE1[BX+2]
MOV SCORE1[BX],AX
AGAIN: ADD BX,2
LOOP LP2
MOV CX,DI
LOOP LP1
CALL CRLF
RET
SCOREARRANGE ENDP
;----------------------------------------------------------------------------------
; 排名次
RANK2 PROC NEAR
CALL CRLF
MOV BX,0
MOV AX,1
MOV COUNT,AX
MOV CX,10
MOV DI,-2
BEG33: ADD DI,2
MOV AX,SCORE[DI]
PUSH CX
MOV CX,10
MOV SI,0
BEG44: CMP AX,SCORE1[SI]
JE AGAIN1
ADD COUNT,1
ADD SI,2
LOOP BEG44
JMP EXIT3
AGAIN1: POP CX
MOV AX,COUNT
MOV RANK[BX], AX
ADD BX,2
MOV COUNT,1
EXIT3: LOOP BEG33
CALL CRLF
LEA DX,MESS8
MOV AH,9H
INT 21H
CALL CRLF
CALL DISPLAY4
RET
RANK2 ENDP
;***************************rank end****************************************
;-----------------------------------------------------------------------------------------
;显示结果
DISPLAY2 PROC FAR
CALL CRLF
MOV AH,9
LEA DX, MESS6
INT 21H
CALL CRLF
CALL DISPLAY33
CALL CRLF
MOV AH,9
LEA DX,MESS7
INT 21H
CALL CRLF
CALL DISPLAY3
CALL CRLF
MOV AH,9
LEA DX, MESS8
INT 21H
CALL CRLF
CALL DISPLAY4
RET
DISPLAY2 ENDP
;***************************************************************************************
;显示名字
DISPLAY33 PROC NEAR
MOV DI,0
MOV CX,10
LOP3: PUSH CX
MOV CX,5
LOP4: MOV DL,NAMETAB[DI]
MOV AH,2H
INT 21H
INC DI
LOOP LOP4
MOV DL,20H
MOV AH,2H
INT 21H
POP CX
LOOP LOP3
CALL CRLF
CALL CRLF
RET
DISPLAY33 ENDP
;-----------------------------------------------------------------------------------
;显示分数
DISPLAY3 PROC NEAR
MOV SI,0
MOV CX,10
BEG3:
MOV BX,SCORE[SI]
CALL BINIDEC
MOV DL,20H
MOV AH,2H
INT 21H
ADD SI,2
LOOP BEG3
RET
DISPLAY3 ENDP
;---------------------------------------------------------------------------------------------
;显示名次
DISPLAY4 PROC NEAR
MOV SI,0
MOV CX,10
BEG4:
MOV BX,RANK[SI]
CALL BINIDEC
MOV DL,20H
MOV AH,2H
INT 21H
; CALL CRLF
ADD SI,2
;CALL CRLF
LOOP BEG4
RET
DISPLAY4 ENDP
;--------------------------------------------------------------------------------------------
;把一个数从二进制转换为十进制
BINIDEC PROC NEAR
PUSH BX
PUSH CX
PUSH SI
PUSH DI
MOV CX,10D
CALL DEC_DIV
MOV CX,1D
CALL DEC_DIV
POP DI
POP SI
POP CX
POP BX
RET
BINIDEC ENDP
;----------------------------------------------------------------------------------------------
;把转化结果显示出来
DEC_DIV PROC NEAR
MOV AX,BX
MOV DX,0
DIV CX
MOV BX,DX
MOV DL,AL
ADD DL,30H
MOV AH,02H
INT 21H
RET
DEC_DIV ENDP
;-------------------------------------------------------------------------------------------
;回车换行
CRLF PROC NEAR
MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
RET
CRLF ENDP
;************************************************************************
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -