📄 operate.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 + -