⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gradesystem.asm

📁 汇编语言编写的成绩管理系统。使用RadASM开发环境建立的工程
💻 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 + -