📄 gradesystem.asm
字号:
INCLUDE FileMacro.asm ;包含宏指令库
;PURGE OPENFILE,WRITEFILE,READFILE ;从内存删除已装入的本程序不适用的宏指令
;--------------------------------------------------------------------------------------------
;定义学生成绩结构
STUDENT STRUC ;学生成绩结构
ID DB 10 DUP(' ') ;学号
NAMES DB 6 DUP(' ') ;姓名
CLASS1 DW ? ;课程1分数
CLASS2 DW ? ;课程2分数
CLASS3 DW ? ;课程3分数
TOTAL DW ? ;总分
STUDENT ENDS
;--------------------------------------------------------------------------------------------
DATA SEGMENT
MESS1 DB ' STUDENT GRADE MANAGEMENT SYSTEM',0AH,0DH,'$'
MESSS DB '-------------------------------------------------------------------',0AH,0DH,'$'
MESS2 DB 'The data is in the C:\SCORE.TXT By Ken ',0AH,0DH,'$'
MESS3 DB '-----MENU-----------------------INPUT------------------------------',0AH,0DH,'$'
MESS4 DB ' INSERT (i) | ID :',0AH,0DH,'$'
MESS5 DB ' MODIFY (m) | NAME :',0AH,0DH,'$'
MESS6 DB ' DELETE (d) | CLASS1 :',0AH,0DH,'$'
MESS7 DB ' FIND (f) | CLASS2 :',0AH,0DH,'$'
MESS8 DB ' DISPLAY (l) | CLASS3 :',0AH,0DH,'$'
MESS9 DB ' EXIT (e) | TOTAL :',0AH,0DH,'$'
MESS10 DB '--------------------------------------------------------------------$'
MESS11 DB 'ID NAME C1 C2 C3 TOTAL',0AH,0DH,'$'
MESS_FIND DB 'Input ID:','$'
ERR1 DB ' THERE IS NOT THIS STUDENT$'
C_OK DB 'Create File OK!$'
W_OK DB 'Write File OK!$'
R_OK DB 'Read File OK!$'
O_ERR DB ' ','$'
N_ERR DB 'Create File Error!','$'
W_ERR DB 'Write File Error!','$'
R_ERR DB 'Read File Error!','$'
C_ERR DB 'Close File Error!','$'
BUFFER_R DB 13 DUP('R')
DB '$'
CT_R EQU $-BUFFER_R
FILENAME DB 'C:\SCORE.TXT',0 ;以0结尾的需创建的文件说明
BUFFER DB 32 DUP(?)
BUFFER_ALL DB 32 DUP(?)
HANDLE DW ?
DEL DB 16 DUP('0')
SUM DW 0
SUM_CH DB 3 DUP(' ')
DB '$'
DATA ENDS
;--------------------------------------------------------------------------------------------
SHOW MACRO ADDRS
LEA DX,ADDRS
MOV AH,9
INT 21H
ENDM
SET_PLINE MACRO A ;在指定行设置光标位置
MOV AH,2
MOV DH,A
MOV DL,36
MOV BH,0
INT 10H
ENDM
SET_PDIS MACRO ;指定到显示处的光标位置
MOV AH,2
MOV DH,12
MOV DL,0
MOV BH,0
INT 10H
ENDM
SET_PWAIT MACRO ;无操作状态下的光标位置,等待状态
MOV AH,2
MOV DH,9
MOV DL,0
MOV BH,0
INT 10H
ENDM
OUT_TOTAL MACRO ;在指定的光标位置输出和
LOCAL OT3
LOCAL OT2
LOCAL OUT_EXIT1
PUSHREG
SET_PLINE 9
MOV AX,SUM
LEA BX,SUM_CH
CMP SUM,100
JNB OT3
CMP SUM,10
JNB OT2
ADD AL,30H
MOV BYTE PTR [BX],AL
INC BX
JMP OUT_EXIT1
OT3: XOR DX,DX
MOV CX,100
DIV CX
ADD AL,30H
MOV BYTE PTR [BX],AL
INC BX
MOV AX,DX
OT2: MOV DL,10
DIV DL
ADD AX,3030H
MOV BYTE PTR [BX],AL
INC BX
MOV BYTE PTR [BX],AH
INC BX
OUT_EXIT1:
MOV BYTE PTR [BX],'$'
MOV AH,9
LEA DX,SUM_CH
INT 21H
POPREG
ENDM
CLEAR_ALL MACRO ;清除全屏
MOV AL,0
MOV CL,0
MOV CH,0
MOV DH,24
MOV DL,79
MOV BH,7
MOV AH,6
INT 21H
ENDM
CLEAR_R MACRO ;清除定义的靠右边的部分屏幕
MOV AL,0
MOV BH,7
MOV CH,4
MOV CL,36
MOV DH,10
MOV DL,79
MOV AH,6
INT 10H
ENDM
CLEAR_D MACRO ;清除定义的靠下边的部分屏幕
MOV AL,0
MOV BH,7
MOV CH,12
MOV CL,0
MOV DH,24
MOV DL,79
INT 10H
ENDM
NEWLINE MACRO ;回车换行
PUSH AX
PUSH DX
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
POP DX
POP AX
ENDM
DISPLAY_ITEM MACRO ADDRS ;显示信息
LOCAL ILOOP,W10
PUSH BX
PUSH CX
MOV BX,0
S_1:
MOV DL,ADDRS[BX] ;显示学号和姓名
MOV AH,2
INT 21H
INC BX
CMP BX,16
JL S_1
;S_2:
; MOV DL,ADDRS[BX] ;显示姓名
; MOV AH,2
; INT 21H
; INC BX
; CMP BX,6
; JL S_2
MOV CX,4
S_3:
MOV DL,' '
MOV AH,2
INT 21H
MOV DL,' '
MOV AH,2
INT 21H
MOV DL,' '
MOV AH,2
INT 21H
MOV DL,ADDRS[BX]
MOV AH,2
INT 21H
INC BX
MOV DL,ADDRS[BX]
MOV AH,2
INT 21H
INC BX
MOV DL,ADDRS[BX]
MOV AH,2
INT 21H
INC BX
LOOP S_3
NEWLINE
POP CX
POP BX
ENDM
GETIN MACRO ADDRS,COUNT2
LOCAL ZEROIT,LP,INPUT_END,GETIN_EXIT
PUSH BX
PUSH AX
MOV BX,0
ZEROIT: MOV ADDRS[BX],' '
INC BX
CMP BX,10
JL ZEROIT
MOV BX,0
LP: MOV AH,1
INT 21H
CMP AL,0AH
JZ INPUT_END
CMP AL,0DH
JZ INPUT_END
MOV ADDRS[BX],AL
INC BX
CMP BX,COUNT2
JL LP
INPUT_END: CMP AL,0DH
JZ GETIN_EXIT
CMP AL,0AH
JZ GETIN_EXIT
MOV AH,7
INT 21H
JMP INPUT_END
GETIN_EXIT:
POP AX
POP BX
ENDM
GETSUM MACRO OPRE1 ;将字符串转换为数值
LOCAL GETLP1,GETOVER
PUSHREG
LEA BX,OPRE1
MOV DL,0
MOV CX,3
GETLP1: CMP BYTE PTR [BX],' '
JZ GETOVER
MOV DH,10
MOV AL,DL
MUL DH
MOV Dl,Al
MOV BYTE PTR AL,[BX]
SUB AL,30H
ADD DL,AL
INC BX
LOOP GETLP1
GETOVER:XOR DH,DH
ADD SUM,DX
POPREG
ENDM
;--------------------------------------------------------------------------------------------
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA,ES:DATA
LOADDS DATA ;给DS赋值
;--------------------------------------------------------------------------------------------
MOV AH,0 ;置显示器为80X25彩色文本模式
MOV AL,3
INT 10H
;--------------------------------------------------------------------------------------------
CLRSCR ;清屏
;--------------------------------------------------------------------------------------------
SHOW MESS1 ;显示标题菜单信息
SHOW MESSS
SHOW MESS2
SHOW MESS3
SHOW MESS4
SHOW MESS5
SHOW MESS6
SHOW MESS7
SHOW MESS8
SHOW MESS9
NEWLINE ;换行
SHOW MESS10
SET_PWAIT ;设置光标位置
OPENFILE FILENAME,HANDLE,O_ERR ;打开文件
CMP AL,0
JZ NEWF
CLOSEFILE HANDLE,C_ERR ;关闭文件
JMP W
NEWF:
NEWFILE FILENAME,HANDLE,N_ERR ;创建文件
CMP AL,0
JZ EXIT0 ;失败转
;--------------------------------------------------------------------------------------------
W:
WAIT_CH ;等待输入一个[无回显]字符
CMP AL,'i' ;插入
JNZ N1
CALL INSERT
JMP W
N1:
CMP AL,'m' ;修改
JNZ N2
CALL MODIFY
CALL DISPLAY
JMP W
N2:
CMP AL,'d' ;删除
JNZ N3
CALL DELETE_M
CALL DISPLAY
JMP W
N3:
CMP AL,'f' ;查找
JNZ N4
CALL FIND
JMP W
N4:
CMP AL,'l' ;全部显示
JNZ N5
CALL DISPLAY
JMP W
N5:
CMP AL,'e'
JZ EXIT0
JMP W
;--------------------------------------------------------------------------------------------
;
; NEWFILE FILENAME,FILEHANDLE,N_ERR ;创建文件
; CMP AL,0
; JZ EXIT0 ;失败转
; PUTS 0,0,C_OK ;在指定位置显示信息
;
; WRITEFILE CT,BUFFER,FILEHANDLE,W_ERR ;写文件
; CMP AL,0
; JZ EXIT0
; PUTS 2,0,W_OK
;
; CLOSEFILE FILEHANDLE,C_ERR ;关闭文件
;
; OPENFILE FILENAME,FILEHANDLE,O_ERR ;打开文件
; CMP AL,0
; JZ EXIT0
; PUTS 10,0,BUFFER_R
; READFILE CT_R,BUFFER_R,FILEHANDLE,R_ERR ;读文件
; CMP AL,0
; JZ EXIT0
; PUTS 12,0,BUFFER_R ;显示从文件中读出的信息
; PUTS 14,0,R_OK
; CLOSEFILE FILEHANDLE,C_ERR
EXIT0:
NOP
;WAIT_ANY ;等待按任意键退出
RETURN ;返回DOS
MAIN ENDP
INSERT PROC NEAR
PUSHREG
MOV DX,OFFSET FILENAME
MOV AL,2
MOV AH,3DH
INT 21H
MOV BX,AX
CLEAR_R
SET_PLINE 4 ;光标指定到输入ID学号的位置
CALL INPUT
MOV CX,0 ;移动文件指针
MOV DX,0
MOV AL,2
MOV AH,42H
INT 21H
MOV CX,32 ;写文件
MOV DX,OFFSET BUFFER_ALL
MOV AH,40H
INT 21H
MOV AH,3EH
INT 21H
SET_PWAIT
POPREG
RET
INSERT ENDP
INPUT PROC NEAR ;输入信息
PUSH AX
PUSH BX
GETIN BUFFER,10
MOV BX,0
MOV CX,10
C_1:
MOV AL,BUFFER[BX]
MOV BUFFER_ALL[BX],AL
INC BX
LOOP C_1
;--------------------------------------------------------------------------------------------------
SET_PLINE 5 ;光标指定到输入姓名的位置
GETIN BUFFER,6
; INPUT BUFFER
; MOV CL,BUFFER+1
XOR CH,CH
LEA SI,BUFFER
MOV CX,6
C_2:
MOV AL,[SI]
MOV BUFFER_ALL[BX],AL
INC BX
INC SI
LOOP C_2
;--------------------------------------------------------------------------------------------------
SET_PLINE 6 ;光标指定到输入成绩1的位置
GETIN BUFFER,3
MOV SUM,0 ;初始化值
MOV SUM_CH,' '
MOV SUM_CH+1,' '
MOV SUM_CH+2,' '
MOV SUM_CH+3,'$'
XOR CH,CH
LEA SI,BUFFER
MOV CX,3
C_3:
MOV AL,[SI]
MOV BUFFER_ALL[BX],AL
INC BX
INC SI
LOOP C_3
MOV BUFFER+3,'$'
GETSUM BUFFER
; OUT_TOTAL
;--------------------------------------------------------------------------------------------------
SET_PLINE 7 ;输入成绩2的位置
GETIN BUFFER,3
XOR CH,CH
LEA SI,BUFFER
MOV CX,3
C_4:
MOV AL,[SI]
MOV BUFFER_ALL[BX],AL
INC BX
INC SI
LOOP C_4
MOV BUFFER+3,'$'
GETSUM BUFFER
; OUT_TOTAL
;--------------------------------------------------------------------------------------------------
SET_PLINE 8 ;输入成绩3的位置
GETIN BUFFER,3
XOR CH,CH
LEA SI,BUFFER
MOV CX,3
C_5:
MOV AL,[SI]
MOV BUFFER_ALL[BX],AL
INC BX
INC SI
LOOP C_5
MOV BUFFER+3,'$'
GETSUM BUFFER
OUT_TOTAL
;--------------------------------------------------------------------------------------------------
; SET_PLINE 9 ;显示总成绩的光标位置
; GETIN BUFFER,3
XOR CH,CH
LEA SI,SUM_CH
MOV CX,3
C_6:
CMP BYTE PTR [SI],'$'
JE C_EXIT
MOV AL,[SI]
MOV BUFFER_ALL[BX],AL
INC BX
INC SI
LOOP C_6
C_EXIT:
POP BX
POP AX
RET
INPUT ENDP
MODIFY PROC NEAR
PUSHREG
CLEAR_R
SET_PLINE 4
MOV DX,OFFSET FILENAME
MOV AL,2
MOV AH,3DH
INT 21H
MOV BX,AX
MOV HANDLE,AX
CALL INPUT ;与BUFFER_ALL联系
READ:
MOV DX,OFFSET BUFFER
MOV CX,32
MOV AH,3FH
INT 21H
LEA SI,BUFFER
LEA DI,BUFFER_ALL
MOV CX,10
C5:
MOV DL,BYTE PTR[SI]
CMP DL,BYTE PTR[DI]
JNZ READ
INC SI
INC DI
LOOP C5
MOV BX,HANDLE
MOV AH,42H
MOV AL,1
MOV CX,0FFFFH
MOV DX,-32
INT 21H
MOV CX,32
MOV DX,OFFSET BUFFER_ALL
MOV AH,40H
INT 21H
MOV AH,3EH
INT 21H
JMP EXIT2
EXIT1:
SET_PDIS
SHOW ERR1
EXIT2:
SET_PWAIT
POPREG
RET
MODIFY ENDP
DELETE_M PROC NEAR
PUSHREG
CLEAR_R
SET_PLINE 4
MOV DX,OFFSET FILENAME
MOV AL,2
MOV AH,3DH
INT 21H
MOV BX,AX
MOV HANDLE,AX
GETIN BUFFER_ALL,10 ;与BUFFER_ALL联系
D_READ:
MOV DX,OFFSET BUFFER
MOV CX,32
MOV AH,3FH
INT 21H
LEA SI,BUFFER
LEA DI,BUFFER_ALL
MOV CX,10
D_1:
MOV DL,BYTE PTR[SI]
CMP DL,BYTE PTR[DI]
JNZ D_READ
INC SI
INC DI
LOOP D_1
MOV BX,HANDLE
MOV AH,42H
MOV AL,1
MOV CX,0FFFFH
MOV DX,-16
INT 21H
MOV CX,16
MOV DX,OFFSET DEL
MOV AH,40H
INT 21H
MOV AH,3EH
INT 21H
JMP D_EXIT1
;EXIT5:
; SET_PDIS
; SHOW ERR1
D_EXIT1:
SET_PWAIT
POPREG
RET
DELETE_M ENDP
FIND PROC NEAR
PUSHREG
CLEAR_R
CLEAR_D
MOV DX,OFFSET FILENAME
MOV AL,2
MOV AH,3DH
INT 21H
MOV BX,AX
SET_PDIS
LEA DX,MESS_FIND
MOV AH,9
INT 21H
GETIN BUFFER_ALL,10
LEA DX,MESS11
MOV AH,9
INT 21H
B:
MOV AH,3FH
MOV CX,32
MOV DX,OFFSET BUFFER
INT 21H
LEA SI,BUFFER
LEA DI,BUFFER_ALL
MOV CX,10
T:
MOV AL,BYTE PTR[SI]
CMP AL,BYTE PTR[DI]
JNZ B
INC SI
INC DI
LOOP T
MOV [BUFFER+32],'$'
DISPLAY_ITEM BUFFER
MOV AH,3EH
INT 21H
POPREG
RET
FIND ENDP
DISPLAY PROC NEAR
PUSHREG
CLEAR_R
CLEAR_D
SET_PDIS
SHOW MESS11
MOV DX,OFFSET FILENAME
MOV AL,2
MOV AH,3DH
INT 21H
MOV BX,AX
AGAIN:
MOV DX,OFFSET BUFFER_ALL
MOV CX,32
MOV AH,3FH
INT 21H
CMP AX,0
JZ P
DISPLAY_ITEM BUFFER_ALL
; MOV AH,9
; LEA DX,BUFFER_ALL
; INT 21H
JMP AGAIN
P:
MOV AH,3EH
INT 21H
SET_PWAIT
POPREG
RET
DISPLAY ENDP
CODE ENDS
END MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -