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

📄 operate.asm

📁 Student学生成绩管理系统是一个使用MASM宏汇编语言开发的试验性项目。它实现了学生学号、姓名、三门课程成绩的录入、修改、删除以及总成绩计算、按成绩排序等功能
💻 ASM
字号:
; --------------------------------------------------------------------
; 汇编语言课程设计
; 北京理工大学
; 计算机科学技术学院12110505班
; 作者:薛源海
; 学号:20053569
; 邮箱:maomivan@bit.edu.cn
; --------------------------------------------------------------------
; 主模块 - OPERATE.ASM
; --------------------------------------------------------------------


; 宏引用 -------------------------------------------------------------
INCLUDE	CONST.MAC
INCLUDE	CONTROL.MAC
INCLUDE	SCREEN.MAC
INCLUDE	FILEIO.MAC
INCLUDE	STRING.MAC
; --------------------------------------------------------------------


; 模块外部引用 -------------------------------------------------------
EXTRN	NOTICE:NEAR
PUBLIC	C_LOAD, C_SAVE, C_QUIT, C_FIND, C_INS, C_EDIT
PUBLIC	C_DEL, C_RANK, C_PREV, C_NEXT, STATE_BAR
; --------------------------------------------------------------------


; 数据段 -------------------------------------------------------------
DATA	SEGMENT	PUBLIC	'D'

; 学生资料存储
INFO	STUDENT	100 DUP(<>)
INFOTMP	STUDENT	<>

; 位置记录信息
NPAGE	DW	0
TOTAL	DW	0
STUID	DW	0
LF_UP	DW	0
RI_DO	DW	0

; 数字显示缓冲区
NUMSTR	DB	5 DUP(?), '$'

; 文件句柄
FILEHD	DW	-1

; 提示语
M_SFILE	DB	'Save file > ', '$'
M_LFILE	DB	'Load file > ', '$'
M_ID	DB	'Student ID > ', '$'
M_NAME	DB	'Name > ', '$'
M_SCA	DB	'Score A > ', '$'
M_SCB	DB	'Score B > ', '$'
M_SCC	DB	'Score C > ', '$'
M_STATE	DB	'File:                            Total Records: #####       Current Page: #####', '$'
M_FULL	DB	'The space is full. Insert info failed.', '$'
M_NOSTU	DB	'No such student.', '$'
M_LOADOK	DB	'Load file successful.', '$'
M_LOADERR	DB	'Load file failed.', '$'
M_SAVEOK	DB	'Save file successful.', '$'
M_SAVEERR	DB	'Save file failed.', '$'

; 用户输入的命令行
M_FILE	DB	72, ?, 72 DUP(?), '$'
M_CURF	DB	72 DUP('$')
M_NUM	DB	5, ?, 5 DUP(?), '$'
M_STR	DB	72 DUP('$')

; 行号
M_LINE0	DB	'01', CR, LF, '02', CR, LF, '03', CR, LF, '04', CR, LF, '05', CR, LF
		DB	'06', CR, LF, '07', CR, LF, '08', CR, LF, '09', CR, LF, '10', CR, LF
		DB	'11', CR, LF, '12', CR, LF, '13', CR, LF, '14', CR, LF, '15', CR, LF
		DB	'16', CR, LF, '17', CR, LF, '18', CR, LF, '19', CR, LF, '20', '$'
M_LINE1	DB	'21', CR, LF, '22', CR, LF, '23', CR, LF, '24', CR, LF, '25', CR, LF
		DB	'26', CR, LF, '27', CR, LF, '28', CR, LF, '29', CR, LF, '30', CR, LF
		DB	'31', CR, LF, '32', CR, LF, '33', CR, LF, '34', CR, LF, '35', CR, LF
		DB	'36', CR, LF, '37', CR, LF, '38', CR, LF, '39', CR, LF, '40', '$'
M_LINE2	DB	'41', CR, LF, '42', CR, LF, '43', CR, LF, '44', CR, LF, '45', CR, LF
		DB	'46', CR, LF, '47', CR, LF, '48', CR, LF, '49', CR, LF, '50', CR, LF
		DB	'51', CR, LF, '52', CR, LF, '53', CR, LF, '54', CR, LF, '55', CR, LF
		DB	'56', CR, LF, '57', CR, LF, '58', CR, LF, '59', CR, LF, '60', '$'
M_LINE3	DB	'61', CR, LF, '62', CR, LF, '63', CR, LF, '64', CR, LF, '65', CR, LF
		DB	'66', CR, LF, '67', CR, LF, '68', CR, LF, '69', CR, LF, '70', CR, LF
		DB	'71', CR, LF, '72', CR, LF, '73', CR, LF, '74', CR, LF, '75', CR, LF
		DB	'76', CR, LF, '77', CR, LF, '78', CR, LF, '79', CR, LF, '80', '$'
M_LINE4	DB	'81', CR, LF, '82', CR, LF, '83', CR, LF, '84', CR, LF, '85', CR, LF
		DB	'86', CR, LF, '87', CR, LF, '88', CR, LF, '89', CR, LF, '90', CR, LF
		DB	'91', CR, LF, '92', CR, LF, '93', CR, LF, '94', CR, LF, '95', CR, LF
		DB	'96', CR, LF, '97', CR, LF, '98', CR, LF, '99', CR, LF, '00', '$'

DATA    ENDS
; --------------------------------------------------------------------


; 代码段 -------------------------------------------------------------
CODE	SEGMENT	PUBLIC	'C'
		ASSUME	CS:CODE, DS:DATA

; 显示一屏记录
DISPLAY	PROC
		PUSH	DX
		PUSH	CX
		PUSH	BX
		PUSH	AX
		PUSH	SI
		PUSH	DI

		WINDOW	0302H, 164FH, 1FH
		LEA		SI, INFO
		MOV		BX, NPAGE
		MOV		AX, LINES
		MUL		BL
		CMP		AX, TOTAL
		JNC		DIS_OK
		; 超过总数

		MOV		DI, AX
		MOV		BL, STU_SZ
		MUL		BL			
		ADD		SI, AX

		XOR		CX, CX
DIS:	CMP		CX, LINES
		JE		DIS_OK
		; 一屏满

		MOV		AX, DI
		ADD		AX, CX
		CMP		AX, TOTAL
		JE		DIS_OK
		; 最后一条记录

		; 显示一条记录
		MOV		DH, CL
		ADD		DH, 3
		MOV		DL, 03H
		CALL	DPONE
		INC     CX
		JMP     DIS

DIS_OK: CALL    STATE_BAR
		POP		DI
		POP		SI
		POP		AX
		POP		BX
		POP		CX
		POP		DX
		RET
DISPLAY	ENDP

; 显示一条记录
; [SI] - 记录信息, DX - 显示位置
DPONE	PROC

		DXPOST
		PUTS    0FFFFH, [SI]
		ADD     SI, 14
		MOV     DL, 18
		DXPOST
		PUTS    0FFFFH, [SI]
		ADD     SI, 14
		MOV     DL, 37
		DXPOST
		MOV		AX, [SI]
		BIN_ASC	NUMSTR
		PUTS    0FFFFH, NUMSTR
		ADD     SI, 2
		MOV     DL, 47
		DXPOST
		MOV		AX, [SI]
		BIN_ASC	NUMSTR
		PUTS    0FFFFH, NUMSTR
		ADD     SI, 2
		MOV     DL, 57
		DXPOST
		MOV		AX, [SI]
		BIN_ASC	NUMSTR
		PUTS    0FFFFH, NUMSTR
		ADD     SI, 2
		MOV     DL, 67
		DXPOST
		MOV		AX, [SI]
		BIN_ASC	NUMSTR
		PUTS    0FFFFH, NUMSTR
		ADD     SI, 2

		RET
DPONE	ENDP

; 显示统计信息条
STATE_BAR	PROC
			PUSH	AX
			
			WINDOW	1700H, 174FH, 3FH
			PUTS	1700H, M_STATE
			PUTS	1706H, M_CURF
			MOV		AX, TOTAL
			BIN_ASC	NUMSTR
			PUTS	1730H, NUMSTR
			MOV		AX, NPAGE
			BIN_ASC	NUMSTR
			PUTS	174AH, NUMSTR
			
			POP		AX
			RET
STATE_BAR	ENDP

; 加载文件
C_LOAD	PROC
		PUSH	DX
		PUSH	CX
		PUSH	BX
		PUSH	AX

		CMDINP	M_LFILE, M_FILE
		S_A2C	M_FILE, M_CURF
		OPENFILE	M_CURF, FILEHD
		S_C2D	M_CURF, M_CURF
		CMP		AL, 0
		JZ		LOA_ER
		; 加载出错

		MOV		NPAGE, 0
		MOV		TOTAL, 0
		LEA		DX, INFO
LOA_LOP:READFILE	STU_SZ, FILEHD
		CMP		AL, 0
		JZ		LOA_ER
		CMP		AL, 2
		JZ		LOA_OVR
		INC		TOTAL
		ADD		DX, STU_SZ
		JMP		LOA_LOP
		; 逐条读入数据并统计总数

LOA_OVR:CLOSEFILE	FILEHD
		CMP		AL, 0
		JZ		LOA_ER
		CALL	DISPLAY
		LEA		BX, M_LOADOK
		CALL	NOTICE
		JMP		LOA_OK

LOA_ER:	LEA		BX, M_LOADERR
		CALL	NOTICE

LOA_OK:	POP		AX
		POP		BX
		POP		CX
		POP		DX
		RET
C_LOAD	ENDP

; 保存文件
C_SAVE	PROC
		PUSH	DX
		PUSH	CX
		PUSH	BX
		PUSH	AX
		PUSH	SI
		PUSH	DI

		CMDINP	M_SFILE, M_FILE
		S_A2C	M_FILE, M_CURF
		NEWFILE	M_CURF, FILEHD
		S_C2D	M_CURF, M_CURF
		CMP		AL, 0
		JZ		SAV_ER
		; 存储出错

		MOV		AX, TOTAL
		MOV		BL, STU_SZ
		MUL		BL
		MOV		DI, AX
		LEA		DX, INFO
		WRITEFILE	DI,	FILEHD
		CMP		AL, 0
		JZ		SAV_ER
		CLOSEFILE	FILEHD
		CMP		AL, 0
		JZ		SAV_ER
		CALL	DISPLAY
		LEA		BX, M_SAVEOK
		CALL	NOTICE
		JMP		SAV_OK

SAV_ER:	LEA		BX, M_SAVEERR
		CALL	NOTICE

SAV_OK:	POP		DI
		POP		SI
		POP		AX
		POP		BX
		POP		CX
		POP		DX
		RET
C_SAVE	ENDP

; 退出
C_QUIT	PROC
		CLRSCR	07H
		RET
C_QUIT	ENDP

; 查找记录
C_FIND	PROC
		PUSH	DX
		PUSH	CX
		PUSH	BX
		PUSH	AX
		PUSH	SI
		PUSH	DI

		CALL	C_SEARCH
		MOV		AX, STUID
		CMP		AX, TOTAL
		JE		FIN_OK
		; 该学生记录不存在

		MOV		BL, LINES
		DIV		BL

		MOV		BL, AL
		XOR		BH, BH
FIN_NP:	CMP		BX, NPAGE
		JE		FIN_E
		JC		FIN_C
		CALL	C_NEXT
		JMP		FIN_NP
FIN_C:	CALL	C_PREV
		JMP		FIN_NP
FIN_E:	CALL	DISPLAY
		; 翻到记录所在页

		MOV		AL, 02H
		ADD		AH, 3
		MOV		LF_UP, AX
		MOV		AL, 4FH
		MOV		RI_DO, AX
		WINDOW	LF_UP, RI_DO, 5FH

		MOV		DH, AH
		MOV		DL, 03H
		LEA		SI, INFO
		MOV		AX, STUID
		MOV		BL, STU_SZ
		MUL		BL
		ADD		SI, AX
		CALL	DPONE
		; 显示所查找的记录

FIN_OK:	POP		DI
		POP		SI
		POP		AX
		POP		BX
		POP		CX
		POP		DX
		RET
C_FIND	ENDP

; 插入记录
C_INS	PROC
		PUSH	DX
		PUSH	BX
		PUSH	AX
		PUSH	SI

		CMP		TOTAL, 100
		JNE		INS
		LEA		BX, M_FULL
		CALL	NOTICE
		JMP		INS_OK
		; 记录表已存满

INS:	CALL	C_INPUT
		MOV		AX, TOTAL
		MOV		BL, STU_SZ
		MUL		BL
		LEA		SI, INFO
		ADD		SI, AX
		LEA		DI, INFOTMP
		SWPINFO
		; 存入记录表中

		INC		TOTAL
		; 记录数加1
		MOV		AX, TOTAL
		DEC		AX
		MOV		BL, LINES
		DIV		BL

		MOV		BL, AL
		XOR		BH, BH
INS_NP:	CMP		BX, NPAGE
		JE		INS_OK
		JC		INS_C
		CALL	C_NEXT
		JMP		INS_NP
INS_C:	CALL	C_PREV
		JMP		INS_NP
		; 翻到新插入的记录所在页
INS_OK:	CALL	DISPLAY

		POP		SI
		POP		AX
		POP		BX
		POP		DX
		RET
C_INS	ENDP

; 删除记录
C_DEL   PROC
		PUSH	DX
		PUSH	CX
		PUSH	BX
		PUSH	AX
		PUSH	SI
		PUSH	DI

		CALL	C_SEARCH
		MOV		AX, STUID
		CMP		AX, TOTAL
		JE		DEL_OK
		; 该学生记录不存在

		DEC		TOTAL
		MOV		CX, TOTAL
		SUB		CX, AX
		JCXZ	DEL_OK
		; 删除的刚好为最后一条记录

		MOV		BL, STU_SZ
		MUL		BL
		LEA		SI, INFO
		ADD		SI, AX
		MOV		DI, SI
		ADD		DI, STU_SZ

DEL_LOP:SWPINFO
		ADD		SI, STU_SZ
		ADD		DI, STU_SZ
		LOOP	DEL_LOP

DEL_OK:	CALL	DISPLAY
		POP		DI
		POP		SI
		POP		AX
		POP		BX
		POP		CX
		POP		DX
		RET
C_DEL   ENDP

; 编辑记录
C_EDIT  PROC
		PUSH	BX
		PUSH	AX
		PUSH	SI
		PUSH	DI

		CALL	C_FIND
		MOV		AX, STUID
		CMP		AX, TOTAL
		JE		EDI_OK
		; 该学生记录不存在

		CALL	C_INPUT
		MOV		AX, STUID
		MOV		BL, STU_SZ
		MUL		BL
		LEA		SI, INFO
		ADD		SI, AX
		LEA		DI, INFOTMP
		SWPINFO
		; 更新该学生信息

EDI_OK:	CALL	DISPLAY
		POP		DI
		POP		SI
		POP		AX
		POP		BX
		RET
C_EDIT	ENDP

; 记录排序
C_RANK	PROC
		PUSH	DX
		PUSH	CX
		PUSH	BX
		PUSH	AX
		PUSH	SI
		PUSH	DI

		CMP		TOTAL, 2
		JC		RAN_OK
		; 0个或1个记录不用排序

		MOV		CX, TOTAL
		DEC		CX
RAN_L1:	LEA		SI, INFO
		MOV		DI, SI
		ADD		DI, STU_SZ
		MOV		AX, TOTAL
		DEC		AX
RAN_L2:	MOV		BX, 34[SI]
		CMP		BX, 34[DI]
		JNC		RAN_NC
		SWPINFO
RAN_NC:	ADD		SI, STU_SZ
		ADD		DI, STU_SZ
		DEC		AX
		CMP		AX, 0
		JNZ		RAN_L2
		LOOP	RAN_L1

RAN_OK:	CALL	DISPLAY
		POP		DI
		POP		SI
		POP		AX
		POP		BX
		POP		CX
		POP		DX
		RET
C_RANK	ENDP

; 前翻一页
C_PREV		PROC
			PUSH	BX
			PUSH	AX

			PUTS	0300H, M_LINE0
			CMP		NPAGE, 4
			JE		PP3
			CMP		NPAGE, 3
			JE		PP2
			CMP		NPAGE, 2
			JE		PP1
			CMP		NPAGE, 1
			JE		PREV_OUT
			INC		NPAGE
			JMP		PREV_OUT

PP1:		PUTS	0300H, M_LINE1
			JMP		PREV_OUT
PP2:		PUTS	0300H, M_LINE2
			JMP		PREV_OUT
PP3:		PUTS	0300H, M_LINE3
			JMP		PREV_OUT

PREV_OUT:	DEC		NPAGE
			CALL	DISPLAY
			POP		AX
			POP		BX
			RET
C_PREV		ENDP

; 后翻一页
C_NEXT		PROC
			PUSH	BX
			PUSH	AX

			PUTS	0300H, M_LINE4
			CMP		NPAGE, 0
			JE		NP1
			CMP		NPAGE, 1
			JE		NP2
			CMP		NPAGE, 2
			JE		NP3
			CMP		NPAGE, 3
			JE		NEXT_OUT
			DEC		NPAGE
			JMP		NEXT_OUT

NP1:		PUTS	0300H, M_LINE1
			JMP		NEXT_OUT
NP2:		PUTS	0300H, M_LINE2
			JMP		NEXT_OUT
NP3:		PUTS	0300H, M_LINE3
			JMP		NEXT_OUT

NEXT_OUT:	INC		NPAGE
			CALL	DISPLAY
			POP		AX
			POP		BX
			RET
C_NEXT		ENDP

; 查寻学生记录位置
; 返回: STUID
C_SEARCH	PROC
			PUSH	DX
			PUSH	CX
			PUSH	BX
			PUSH	AX
			PUSH	SI
			PUSH	DI

			CMDINP	M_NAME, M_STR
			S_A2D	M_STR
			XOR		CX, CX
			MOV		SI, 14
			LEA		BX, INFO

SEAR_AGN:	CMP		CX, TOTAL
			JC		SEAR
			LEA		BX, M_NOSTU
			CALL	NOTICE
			JMP		SEAR_OK
			; 该学生记录不存在

SEAR:		LEA		DI, M_STR
SEAR_LOP:	MOV		AL, [BX][SI]
			CMP		AL, [DI]
			JE		SEAR_NC
			ADD		BX, STU_SZ
			MOV		SI, 14
			INC		CX
			JMP		SEAR_AGN
			; 查下一个记录

SEAR_NC:	CMP		BYTE PTR [DI], '$'
			JE		SEAR_OK
			INC		SI
			INC		DI
			JMP		SEAR_LOP
			; 查下一个字符

SEAR_OK:	MOV		STUID, CX
			POP		DI
			POP		SI
			POP		AX
			POP		BX
			POP		CX
			POP		DX
			RET
C_SEARCH	ENDP

; 输入信息并统计总成绩
C_INPUT	PROC

		CMDINP	M_ID, INFOTMP.S_ID
		S_A2D	INFOTMP.S_ID
		CMDINP	M_NAME, INFOTMP.S_NAME
		S_A2D	INFOTMP.S_NAME
		CMDINP	M_SCA, M_NUM
		ASC_BIN	M_NUM, INFOTMP.S_SA
		CMDINP	M_SCB, M_NUM
		ASC_BIN	M_NUM, INFOTMP.S_SB
		CMDINP	M_SCC, M_NUM
		ASC_BIN	M_NUM, INFOTMP.S_SC
		MOV		AX, INFOTMP.S_SA
		ADD		AX, INFOTMP.S_SB
		ADD		AX, INFOTMP.S_SC
		MOV		INFOTMP.S_TOTAL, AX

		RET
C_INPUT	ENDP

CODE	ENDS
		END
; --------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -