📄 chengjiguanli.asm
字号:
.386PF1 EQU 3B00H;定义常量,下同F2 EQU 3C00HF3 EQU 3D00HF4 EQU 3E00HF5 EQU 3F00HALTX EQU 2D00HESCKEY EQU 1BHTRUE EQU 0FFHFALSE EQU 0STUDENT STRUC;学生结构定义 RECNO DW 0 STUID DB 9 DUP (0) LENID EQU $-STUID;STUID字段长度的修改不影响程序,下同。 NA DB 10 DUP (0) LENNAME EQU $-NAME ASM DB 4 DUP (0) LENDAY EQU $-ASM ZUCHENG DB 4 DUP (0) LENZUCHENG EQU $-ZUCHENG OS DB 4 DUP (0) LENOS EQU $-OS SUM DW 0 LENSUM EQU $-SUM RANK DW 0 RECORDERLEN EQU $-RECNO STUDENT ENDS WINDOW MACRO A,B,C,D;宏定义,下同(本程序中有大量宏定义,一为增加可读性,二为减少代码量);A.B.C.D分别代表屏幕四个角的坐标 HENGXIAN B,D,A,0C4H HENGXIAN B,D,C,0C4H SHUXIAN A,C,B,0B3H SHUXIAN A,C,D,0B3H FCUR A,B WCH 0BAH,7 FCUR A,D WCH 0BFH,7 FCUR C,B WCH 0C0H,7 FCUR C,D WCH 0D9H,7 ENDM SCROLLUP MACRO NUM,ATTR,TOP,LEFT,BOTTOM,RIGHT;BIOS INT 10H的6号功能调用清屏或上卷宏。 MOV AH,6 MOV AL,NUM ;0 清屏,1 上卷 MOV CH,TOP MOV CL,LEFT MOV DH,BOTTOM MOV DL,RIGHT MOV BH,ATTR INT 10H ENDMSETCURSOR MACRO Y,X;设置当前页的光标定位宏,当前为0页。 MOV AH,2 MOV BH,0 MOV DH,Y MOV DL,X INT 10H ENDM FCUR MACRO X,Y MOV AH,2 MOV BH,0 MOV DH,X MOV DL,Y INT 10H ENDM FIX MACRO A,B,C,D,E,F,G MOV A,B MOV BH,C MOV D,E MOV F,G INT 10H ENDM READCURSOR MACRO; 读取当前页的光标位置宏,当?拔?页。 MOV AH,3 MOV BH,0 INT 10H ENDM PRINT MACRO ADDRESS ;打? LEA DX,ADDRESS MOV AH,09H INT 21H ENDM MOVSS MACRO BUFFER1,BUFFER2 XOR CX,CX MOV CL,[BUFFER2+1] LEA DI,BUFFER1 LEA SI BUFFER2 ADD SI,2 REP MOVSB ENDM WCH MACRO X,Y MOV AL,X MOV BX,Y MOV CX,1 MOV AH,9 INT 10H ENDM HENGXIAN MACRO A,B,C,D LOCAL HHL MOV ROW,C MOV COL,AHHL: FCUR ROW,COL WCH D,7 INC COL CMP COL,B JLE HHL ENDM SHUXIAN MACRO A,B,C,D LOCAL VVL MOV ROW,A MOV COL,CVVL: FCUR ROW,COL WCH D,7 INC ROW CMP ROW,B JLE VVL ENDM ECHOSTRING MACRO NUM,ATTR,PAGE,VARID,COUNT;ECHO AT CURRENT CURSOR;BIOS INT 10H的13号功能调用显示字符串宏。 READCURSOR;设置DX。 LEA BP,VARID MOV AX,SEG VARID MOV ES,AX;ES:BP为串首地址。 MOV AL,NUM;,NUM为1时,光标移动。 MOV BL,ATTR;属性 MOV BH,PAGE;页号 MOV CX,COUNT;串长 MOV AH,13H MOV AL,NUM INT 10H ENDMFILEOPEN MACRO RW,FILE_ID;DOS INT 21H的3DH号功能调用打开文件宏。 MOV AX,SEG FILE_ID;FILE_ID为ASCIZ串。 MOV DS,AX LEA DX,FILE_ID MOV AL,RW;读写方式 MOV AH,3DH INT 21HENDMFILEREAD MACRO COUNT,VAR,FILE;DOS INT 21H的3FH号功能调用读文件宏。 MOV AX,SEG VAR MOV DS,AX LEA DX,VAR;DS:DX为读出来的数据送往的首地址。 MOV CX,COUNT MOV BX,FILE MOV AH,3FH INT 21H ENDMFILEWRITE MACRO COUNT,VAR,FILE;DOS INT 21H的40H号功能调用写文件宏。 MOV AX,SEG VAR MOV DS,AX LEA DX,VAR;把DS:DX为首地址的数据写入文件中。 MOV CX,COUNT MOV BX,FILE MOV AH,40H INT 21H ENDMFPMOVE MACRO DIRECT,DWEA,FILE;DOS INT 21H的42H号功能调用移动文件指针宏。 MOV EAX,DWEA;偏移量。 MOV DX,AX SAR EAX,16 MOV CX,AX MOV AL,DIRECT;偏移方式。 MOV BX,FILE MOV AH,42H INT 21H ENDMFILECLOSE MACRO FILE;DOS INT 21H的3EH号功能调用关闭文件宏。 MOV BX,FILE MOV AH,3EH INT 21H ENDMENCRLF MACRO CRLF;换行 MOV AX,SEG CRLF MOV DS,AX LEA DX,CRLF MOV AH,9 INT 21H ENDM WIN MACRO OPR1,OPR2,OPR3,OPR4,OPR5,OPR6 ;建立窗口 MOV AH,06H MOV AL,OPR1 MOV BH,OPR2 MOV CH,OPR3 MOV CL,OPR4 MOV DH,OPR5 MOV DL,OPR6 INT 10H ENDM CLEARBUFFER MACRO VARID,COUNT;清缓冲区内容 MOV AX,SEG VARID MOV ES,AX LEA DI,VARID MOV CX,COUNT MOV AL,0 REP STOSBENDMDATA SEGMENT USE16 ROW DB 0 COL DB 0 MENU DB 'LIST(F1) INSERT(F2) MODIFY(F3) DELETE(F4) SEARCH(F5) EXIT(ALT+X)$' FILE DW ?;文件代号 FILE1 DW ? ;文件的排序代号 FILETEMP DW ?;临时文件代号 CURRECNO DW ?;当前记录号 ENTRYPORT DW 0;调用者的标识 CURCURSOR DW ?;当前光标号 FILEID DB ".\zhangbo.txt",0;ASCIZ NOEXISTFILE DB "FILE IS NOT EXIST!",7,"SYSTEM AUTOMATICALLY CREATE A FILE FOR YOU ,PLEASE INSERT(F2) RECORDER!$" NULLFILE DB "FILE IS NULL!",7,"PLEASE INSERT(F2) RECORDER!$" APPQUEST DB "DO YOU WANT TO INSERT ANOTHER (Y/N?)" QUESTLEN EQU $-APPQUEST ANYKEY DB "PRESS ANY KEY TO CONTINUE,ESC TO EXIT" ANYKEYLEN EQU $-ANYKEY TAILQUEST DB "ALREADY REACH FILE`S END,PRESS ANY KEY TO EXIT!" FILETAILLEN EQU $-TAILQUEST MODIFYQUEST DB "DO YOU WANT TO MODIFY CURRENT RECORDER(Y),ESC TO EXIT,OTHER TO CONTINUE!" MODIFYLEN EQU $-MODIFYQUEST DELETEQUEST DB "DO YOU WANT TO DELETE CURRENT RECORDER(Y),ESC TO EXIT,OTHER TO CONTINUE!" DELETELEN EQU $-DELETEQUEST SEARCHOPERATEEA DB "+++++++++++SEARCH BY STUNAME+++++++++++++" OSEALEN EQU $-SEARCHOPERATEEA MODDELQUEST DB "PRESS M TO MODIFY,D TO DELETE ,ESC TO EXIT,OTHER TO CONTINUE!" MDLEN EQU $-MODDELQUEST SEARCHTAILQUEST DB "ALREADY REACH FILE`S END, DO YOU SEARCH AGAIN(Y),ESC TO EXIT!" SEARCHTAILLEN EQU $-SEARCHTAILQUEST F2SELECT DB "FILE IS NULL!",7,"YOU MUST SELECT F2!" F2LEN EQU $-F2SELECT HEAD DB "======================STUDENT`S ARCHIVE MANAGE SYSTEM " DB "====================" HEADLEN EQU $-HEAD VRECNO DB "RECNO:" RECNOLEN EQU $-VRECNO VSTUID DB "STUID:" IDLEN EQU $-VSTUID BSTUID DB 9,?,9 DUP(?);控制输入的长度,为DOS 21H的9号功能调用,下同。 VNAME DB "NAME:" NAMELEN EQU $-VNAME BNAME DB 12,?,12 DUP(?) VASM DB "ASM:" ASMLEN EQU $-VASM BASM DB 4,?,4 DUP(?) VZUCHENG DB "ZUCHENG:" ZUCHENGLEN EQU $-VZUCHENG BZUCHENG DB 4,?,4 DUP(?) VOS DB "OS:" OSLEN EQU $-VOS BOS DB 4,?,4 DUP(?) VSUM DB "SUM:" SUMLEN EQU $-VSUM BSUM DB 4,?,4 DUP(?) BRANK DB 4,?,4 DUP (?) F1KEY DB " F1--DISPLAY" F1KEYLEN EQU $-F1KEY F2KEY DB "F2--INSERT" F2KEYLEN EQU $-F2KEY F3KEY DB "F3--MODIFY" F3KEYLEN EQU $-F3KEY F4KEY DB "F4--DELETE" F4KEYLEN EQU $-F4KEY F5KEY DB "F5--SEARCH" F5KEYLEN EQU $-F5KEY ALTXKEY DB "ALT X--EXIT",0DH,0AH ALTXKEYLEN EQU $-ALTXKEY BLANK DB ' $' CRLF DB 0DH,0AH,'$' BUFFER1 STUDENT <> ; BUFFER2 STUDENT <> ; BUFFER STUDENT <> ;自定义的变量,作为缓冲数据之用。 BTODBUFFER DB 5 DUP(?),'$';转换记录号为十进制数 SEARCHSTUNA DB 10,?,10 DUP(?);查询方式 FINSTRLEN DW ?;保存要查询的内容 COUNT DW 0;作为显示次数之用 FLAG DW ? FLAG1 DW ? MENU1 DB ' RECNO ID NAME ASM ZUCHENG OS SCORE RANK','$' MENU1LEN EQU $-MENU BLANK1 DB ' $' BIN1 DW ? BLANK2 DB '1','$' BIN2 DW ? BIN3 DW ? RSLTHI DW 0 RSLTLO DW 0 RECORDERLEN1 DD 0 ASC_OUT DB 5 DUP(0)DATA ENDSSTACK SEGMENT USE16 DW 512 DUP (?) TOP LABEL WORDSTACK ENDSCODE SEGMENT USE16MAIN PROC FAR ASSUME CS:CODE , DS:DATA , SS:STACK START: MOV AX , STACK MOV SS , AX MOV SP , OFFSET TOP MOV AX , DATA MOV DS , AX MOV ES , AX;========================================= FILEOPEN 2,FILEID JC ERRORNO;文件不存在。 MOV FILE,AX MOV FILE1,AX MOV FILETEMP,AX MOV BX,AX FILEREAD RECORDERLEN,BUFFER,FILE CMP AX,0 JZ ERRORNU;文件存在,但内容为空。 FPMOVE 0,0,FILE;MOVE TO HEAD;文件指针回到头。 JMP ENTRYERRORNO: LEA DX,NOEXISTFILE MOV AH,9 INT 21H LEA DX,FILEID MOV CX,0 MOV AH,3CH;建立新文件。 INT 21H MOV FILE,AX MOV FILETEMP,0FFH JMP ENTRYERRORNU: MOV FILETEMP,0FFH;标识文件存在,但内容为空。ENTRY: MOV AH,0 MOV AL,3 INT 10H;80*25的文本方式 SCROLLUP 0,3FH,0,0,0,79; FCUR 0,3 PRINT MENU WINDOW 1,0,24,79 SCROLLUP 0,1FH,2,1,23,78; SCROLLUP 0,1FH,11,1,23,78 HENGXIAN 1,78,11,0C4H SETCURSOR 12,1 PRINT MENU1 SHUXIAN 12,23,8,0B3H SHUXIAN 12,23,19,0B3H SHUXIAN 12,23,31,0B3H SHUXIAN 12,23,37,0B3H SHUXIAN 12,23,49,0B3H SHUXIAN 12,23,62,0B3H SHUXIAN 12,23,70,0B3H SELECT:;只能按下F1~F5、ALT X键,否则发出警声 MOV AH,0 INT 16H CMP AX,F1 JZ F1DISPLAY CMP AX,F2 JZ F2INSERT CMP AX,F3 JZ F3MODIFY CMP AX,F4 JZ F4DELETE CMP AX,F5 JZ F5SEARCH CMP AX,ALTX JZ EXIT MOV DL,7 MOV AH,6 INT 21H JMP SELECT F1DISPLAY: CMP FILETEMP ,0FFH;文件为空时,必须追加记录后才能执行,下同。 JNZ EXECALL1 FCUR 4,1 ECHOSTRING 1,1CH,0,F2SELECT,F2LEN JMP SELECTEXECALL1: CALL DISPLAYALL;调用显示记录子程序。 CMP EAX,0;返回码,非常重要,复杂的程序往往需要返回码值,下同。 JZ SELECTF2INSERT: CALL INSERT;调用追加记录子程序。 CMP EAX,0 JZ SELECTF3MODIFY: CMP FILETEMP ,0FFH JNZ EXECALL3 FCUR 4,1 ECHOSTRING 1,1CH,0,F2SELECT,F2LEN JMP SELECTEXECALL3: CALL MODIFY;调用修改记录子程序。 CMP EAX,0 JZ SELECTF4DELETE: CMP FILETEMP ,0FFH JNZ EXECALL4 FCUR 4,1 ECHOSTRING 1,1CH,0,F2SELECT,F2LEN JMP SELECTEXECALL4: CALL DELETE;调用删除记录子程序。 CMP EAX,0 JZ SELECTF5SEARCH: CMP FILETEMP ,0FFH JNZ EXECALL5 FCUR 4,1 ECHOSTRING 1,1CH,0,F2SELECT,F2LEN JMP SELECTEXECALL5: CALL SEARCH;调用查询记录子程序。 CMP EAX,0 JZ SELECT;=========================================EXIT: MOV BX,FILE MOV AH,3EH INT 21H;关闭打开的文件,以清文件缓冲区。 SCROLLUP 0,0FH,1,1,23,78;清屏。 SETCURSOR 0,0 MOV AX,4C00H INT 21HMAIN ENDPDISPLAYALL PROC NEAR SCROLLUP 0,1FH,11,1,23,78 HENGXIAN 1,78,11,0C4H SETCURSOR 12,1 PRINT MENU1 SHUXIAN 12,23,8,0B3H SHUXIAN 12,23,19,0B3H SHUXIAN 12,23,31,0B3H SHUXIAN 12,23,37,0B3H SHUXIAN 12,23,49,0B3H SHUXIAN 12,23,62,0B3H SHUXIAN 12,23,70,0B3H SETCURSOR 14,1 CALL RANKALL1 ECHOAGAIN: ;显示、修改、删除、查询子程序时显示记录的入口。 FILEREAD RECORDERLEN,BUFFER,FILE;把文件的当前记录读到缓冲区。 CMP AX,0;文件指针到达尾部? JZ TAIL CMP BUFFER.RECNO,0 JZ ECHOAGAIN;逻辑删除者不显示出来。 INC COUNT ; LEA BX,BTODBUFFER MOV AX,BUFFER.RECNO MOV CURRECNO,AX CALL BTOD;把WORD型的记录号转化为字符型。 CLD MOV AL,'0' LEA DI,BTODBUFFER REPZ SCASB DEC DI PUSH DI POP DI PRINT BLANK1 PRINT BLANK1 MOV AH,9 MOV DX,DI INT 21H READCURSOR MOV ROW, DH FCUR ROW, 10 ECHOSTRING 1,1FH,0,BUFFER.STUID,LENID;:内容显示,下同。 FCUR ROW,20 ECHOSTRING 1,1FH,0,BUFFER.NA,10 FCUR ROW,32 ECHOSTRING 1,1FH,0,BUFFER.ASM,4 FCUR ROW,42 ECHOSTRING 1,1FH,0,BUFFER.ZUCHENG,4 FCUR ROW,56 ECHOSTRING 1,1FH,0,BUFFER.OS,4 FCUR ROW,65 MOV AX,BUFFER.SUM LEA BX,BTODBUFFER CALL BTOD CLD MOV AL,'0' LEA DI,BTODBUFFER REPZ SCASB DEC DI MOV AH,09H MOV DX,DI INT 21H FCUR ROW,71 LEA BX,BTODBUFFER MOV AX,BUFFER.RANK CALL BTOD CLD MOV AL,'0' LEA DI,BTODBUFFER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -