📄 chengjiguanli.asm
字号:
REPZ SCASB DEC DI PUSH DI POP DI PRINT BLANK1 PRINT BLANK1 MOV AH,9 MOV DX,DI INT 21H INC ROW FCUR ROW,1 CMP COUNT,10 JAE ESCINPUT JMP ECHOAGAINESCINPUT: CMP ENTRYPORT ,2;转移到调用者那里,下同。 JE RETURNMODIFY CMP ENTRYPORT ,3 JE RETURNDELETE CMP ENTRYPORT ,4 JAE RETURNSEARCH MOV AH,0 INT 16H CMP AL,ESCKEY JZ ENDDINAMEIT MOV COUNT,0 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 JMP ECHOAGAINTAIL: ;文件指针到尾。 MOV AH,0 INT 16HENDDINAMEIT: MOV COUNT,0;恢复初值,下同。 MOV ENTRYPORT ,0 FPMOVE 0,0,FILE;MOVE TO HEAD 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 MOV EAX,0;返回码。 RETDISPLAYALL ENDP INSERT PROC NEAR SCROLLUP 0,1FH,2,1,10,78; SETCURSOR 2,1 CMP FILETEMP,0FFH;空文件时,必须追加记录。 JNZ ACCINSERT;文件不为空时,累积追加 PUSH FILE POP FILETEMP;有记录内容时,恢复文件号。 MOV AX,1;空文件时追加的第一条记录,记录号为1。 MOV CURRECNO,AXCONAPP:;继续追加或者删除、修改的子程序的入口。 SCROLLUP 0,1FH,2,1,10,78; SETCURSOR 2,1 CLEARBUFFER BUFFER,RECORDERLEN CMP ENTRYPORT ,3;当删除调用这个子程序时,文件中的记录内容清全部0。 JE DEL CMP ENTRYPORT, 5;查询时选择删除时同上。 JE DEL CLD;以下是置BUFFER缓冲区的内容,这些内容要写到文件中去。 LEA BX,BTODBUFFER MOV AX,CURRECNO CALL BTOD MOV AL,'0' LEA DI,BTODBUFFER REPZ SCASB DEC DI PUSH DI ECHOSTRING 1,1DH,0,VRECNO,RECNOLEN POP DI MOV AH,9 MOV DX,DI INT 21H MOV AX,CURRECNO MOV BUFFER.RECNO,AX READCURSOR MOV ROW, DH INC ROW FCUR ROW,1 ECHOSTRING 1,1DH,0,VSTUID,IDLEN LEA DX,BSTUID MOV AH,0AH INT 21H XOR CX,CX MOV CL,[BSTUID+1] LEA DI,BUFFER.STUID LEA SI,BSTUID ADD SI,2 REP MOVSB READCURSOR MOV ROW, DH INC ROW FCUR ROW,1 ECHOSTRING 1,1DH,0,VNAME,NAMELEN LEA DX,BNAME MOV AH,0AH INT 21H XOR CX,CX MOV CL,[BNAME+1] LEA DI,BUFFER.NA LEA SI,BNAME ADD SI,2 REP MOVSB READCURSOR MOV ROW, DH INC ROW FCUR ROW,1 ECHOSTRING 1,1DH,0,VASM,ASMLEN LEA DX,BASM MOV AH,0AH INT 21H LEA SI, BASM+1 CALL ASC_BIN MOV BIN1,AX XOR CX,CX MOV CL,[BASM+1] LEA DI,BUFFER.ASM LEA SI,BASM ADD SI,2 REP MOVSB READCURSOR MOV ROW, DH INC ROW FCUR ROW,1 ECHOSTRING 1,1DH,0,VZUCHENG,ZUCHENGLEN LEA DX,BZUCHENG MOV AH,0AH INT 21H LEA SI, BZUCHENG+1 CALL ASC_BIN MOV BIN2,AX XOR CX,CX MOV CL,[BZUCHENG+1] LEA DI,BUFFER.ZUCHENG LEA SI,BZUCHENG ADD SI,2 REP MOVSB READCURSOR MOV ROW, DH INC ROW FCUR ROW,1 ECHOSTRING 1,1DH,0,VOS,OSLEN LEA DX,BOS MOV AH,0AH INT 21H LEA SI,BOS+1 CALL ASC_BIN MOV BIN3,AX XOR CX,CX MOV CL,[BOS+1] LEA DI,BUFFER.OS LEA SI,BOS ADD SI,2 REP MOVSB READCURSOR MOV ROW, DH INC ROW FCUR ROW,1 XOR AX,AX MOV AX,BIN1 ADD AX,BIN2 ADD AX,BIN3 MOV BUFFER.SUM,AX DEL: CMP ENTRYPORT,2 JB RETCURRENTPOT FPMOVE 1,-RECORDERLEN,FILE;如果是由修改、删除、查询子程序调用的话,恢复文件指针于当前记录上。RETCURRENTPOT: MOV BX,FILE MOV CX,RECORDERLEN LEA DX,BUFFER MOV AH,40H INT 21H CMP ENTRYPORT,2;返回到各调用点。 JZ MODIFY CMP ENTRYPORT,3 JZ DELETE CMP ENTRYPORT,4 JAE SEARCHAGAIN;转移到查询子程序中。 ECHOSTRING 1,1DH,0,APPQUEST,QUESTLEN READCURSOR MOV CURCURSOR,DXYNINPUT: SETCURSOR DH,DL MOV AH,1 INT 21H CMP AL,'Y' JZ ANOTHER;接着追加记录。 CMP AL,'Y' JZ ANOTHER CMP AL,'N' JZ ENDAPPEXIT CMP AL,'N' JZ ENDAPPEXIT MOV DL,7 MOV AH,6 INT 21H MOV DX,CURCURSOR JMP YNINPUTANOTHER: SCROLLUP 0,1FH,2,1,10,78; SETCURSOR 2,1 JAE SCROLL ENCRLF CRLF JMP ACCINSERTSCROLL: SCROLLUP 0,1FH,2,1,10,78; SETCURSOR 2,1ACCINSERT:;文件不为空时,累积追加的入口。 FPMOVE 2,-RECORDERLEN,FILE;文件指针指向最后一条记录。 FILEREAD RECORDERLEN,BUFFER,FILENOEFFECT: CMP BUFFER.RECNO,0 JNZ EFFECTRECNO FPMOVE 1,-RECORDERLEN,FILE FILEREAD RECORDERLEN,BUFFER,FILE CMP BUFFER.RECNO,0 JNZ EFFECTRECNO FPMOVE 1,-RECORDERLEN,FILE;最后一条记录如是逻辑删除,则必须要后退到正确的记录号上来。 JMP NOEFFECTEFFECTRECNO: MOV AX,BUFFER.RECNO INC AX MOV CURRECNO,AX JMP CONAPPENDAPPEXIT: MOV COUNT,0 MOV ENTRYPORT ,0 FPMOVE 0,0,FILE;MOVE TO HEAD SCROLLUP 0,1FH,2,1,10,78; SETCURSOR 2,1 MOV EAX,0 RETINSERT ENDPMODIFY PROC NEAR SCROLLUP 0,1FH,2,1,10,78; SETCURSOR 2,1 MOV ENTRYPORT, 2 MOV COUNT ,9 JMP NEAR PTR ECHOAGAINRETURNMODIFY: ECHOSTRING 1,0DH,0,MODIFYQUEST,MODIFYLEN ENCRLF CRLF MOV AH,0 INT 16H CMP AL,'Y' SETCURSOR 2,1; JZ CONAPP CMP AL,'Y' SETCURSOR 2,1; JZ CONAPP CMP AL,ESCKEY JZ ENDMODIFYEXIT MOV COUNT,9 SCROLLUP 0,1FH,2,1,10,78; SETCURSOR 2,1 JMP ECHOAGAINENDMODIFYEXIT: MOV COUNT,0 MOV ENTRYPORT ,0 FPMOVE 0,0,FILE;MOVE TO HEAD SCROLLUP 0,1FH,2,1,10,78; SETCURSOR 2,1 MOV EAX,0 RETMODIFY ENDPDELETE PROC NEAR;逻辑删除。 SCROLLUP 0,1FH,2,1,10,78; SETCURSOR 2,1 MOV ENTRYPORT, 3 MOV COUNT ,9 JMP NEAR PTR ECHOAGAINRETURNDELETE: ECHOSTRING 1,0DH,0,DELETEQUEST,DELETELEN ENCRLF CRLF MOV AH,0 INT 16H CMP AL,'Y' JZ CONAPP CMP AL,'Y' JZ CONAPP CMP AL,ESCKEY JZ ENDDELETEEXIT MOV COUNT,9 SCROLLUP 0,1FH,2,1,10,78; SETCURSOR 2,1 JMP ECHOAGAINENDDELETEEXIT: MOV COUNT,0 MOV ENTRYPORT ,0 FPMOVE 0,0,FILE;MOVE TO HEAD SCROLLUP 0,1FH,2,1,10,78; SETCURSOR 2,1 MOV EAX,0 RETDELETE ENDPCREATWIN PROC NEAR ;创建窗口子程序 WIN 0,3EH,1,0,24,79 ;定义窗口背景 WIN 0,2FH,0,0,0,79 WIN 0,2FH,24,0,24,79SHOW: ;显示菜单位置及内容 SETCURSOR 0,1 MOV AH,9 LEA DX,MENU INT 21H CREATWIN ENDP SEARCH PROC NEAR FPMOVE 0,0,FILE;MOVE TO HEAD SCROLLUP 0,1FH,2,1,10,78; SETCURSOR 2,1 MOV COUNT ,10 ;因为名字是10个字节 MOV ENTRYPORT, 4 ECHOSTRING 1,1DH,0,SEARCHOPERATEEA,OSEALEN;查询方式提示。 READCURSOR MOV ROW, DH INC ROW FCUR ROW,1 ECHOSTRING 1,1DH,0,VNAME,NAMELEN;查询内容。 LEA DX,SEARCHSTUNA MOV AH,0AH INT 21H XOR CX,CX MOV CL,[SEARCHSTUNA+1] MOV BX,CX MOV BYTE PTR [SEARCHSTUNA+2][BX],0;在输入的查询内容最后置0,以保证与BUFFER.STUID内容的绝对匹配。 INC CX MOV FINSTRLEN,CX;多比较一个0值。SEARCHAGAIN:;查询是否有相同的内容。 CLEARBUFFER BUFFER,RECORDERLEN SCROLLUP 0,1FH,5,1,10,78 SETCURSOR 5,1 MOV COUNT ,10 MOV ENTRYPORT, 4 FILEREAD RECORDERLEN,BUFFER,FILE CMP AX,0 JZ SEARCHTAIL MOV AX,BUFFER.RECNO MOV CURRECNO,AX LEA SI,SEARCHSTUNA+2 LEA DI,BUFFER.NA MOV CX,FINSTRLENCOMPARE: MOV AL,[SI] CMP AL,[DI] JNE SEARCHAGAIN;不匹配时,立即转移,读一下条记录。 INC SI INC DI LOOP COMPARE FPMOVE 1,-RECORDERLEN,FILE;文件指针返回到查询命中的记录上。 JMP ECHOAGAINRETURNSEARCH: ECHOSTRING 1,1DH,0,MODDELQUEST,MDLEN READCURSOR MOV ROW, DH INC ROW FCUR ROW,1 MOV AH,0 INT 16H CMP AL,'M' JZ CONAPP;转移到追加记录子程序的相应入口处。 CMP AL,'M' JZ CONAPP CMP AL,'D' JZ LOGICDEL CMP AL,'D' JZ LOGICDEL CMP AL,ESCKEY JZ ENDSEARCHEXIT MOV COUNT,10 SCROLLUP 0,1FH,5,1,10,78 SETCURSOR 5,1 JMP SEARCHAGAIN;查询记录中是否有相同内容。LOGICDEL: MOV ENTRYPORT,5;转移到追加记录子程序的相应入口处前,通知它逻辑删除当前记录。 JZ CONAPPSEARCHTAIL: READCURSOR MOV ROW, DH INC ROW FCUR ROW,1 ECHOSTRING 1,1AH,0,SEARCHTAILQUEST,SEARCHTAILLEN MOV AH,0 INT 16H CMP AL,'Y' JZ SEARCH;文件指针已到达尾部,是否接着重新查询? CMP AL,'Y' JZ SEARCHENDSEARCHEXIT: MOV COUNT,0 MOV ENTRYPORT ,0 FPMOVE 0,0,FILE;MOVE TO HEAD SCROLLUP 0,1FH,2,1,10,78; SETCURSOR 2,1 MOV EAX,0 RET SEARCH ENDPRANKALL1 PROC NEAR MOV FLAG,1 MOV FLAG1,1 MOV RECORDERLEN1,0 J1: CLEARBUFFER BUFFER1,RECORDERLEN FILEREAD RECORDERLEN,BUFFER1,FILE CMP AX,0 JZ RETT CMP BUFFER1.RECNO,0 JNZ J2 MOV EAX,RECORDERLEN MUL FLAG MOV RECORDERLEN1,EAX INC FLAG JMP J1 J2: FPMOVE 0,0,FILE MOV FLAG1,1 J3: FILEREAD RECORDERLEN,BUFFER2,FILE CMP AX,0 JZ J4 CMP BUFFER2.RECNO,0 JZ J3 MOV CX,BUFFER1.SUM MOV BX,BUFFER2.SUM CMP BX,CX JNA J3 INC FLAG1 JMP J3 J4: MOV AX,FLAG1 MOV BUFFER1.RANK,AX FPMOVE 0,RECORDERLEN1,FILE FILEWRITE RECORDERLEN,BUFFER1,FILE XOR EAX,EAX MOV EAX,RECORDERLEN MUL FLAG MOV RECORDERLEN1,EAX INC FLAG JMP J1 RETT: FPMOVE 0,0,FILE RET RANKALL1 ENDPBTOD PROC NEAR;二进制转换为十进制 MOV SI,5 MOV CX,10STORE: XOR DX,DX DIV CX ADD DL,30H DEC SI MOV [BX][SI],DL OR SI,SI JNZ STORE RETBTOD ENDPASC_BIN PROC XOR AX,AX MOV CL,[SI] XOR CH,CH INC SI JCXZ M2 M1: MOV BX,10 MUL BX MOV BL,[SI] INC SI AND BX,0FH ADD AX,BX LOOP M1 M2: RET ASC_BIN ENDP BINR_ASC PROC MOV BX,10 C0: MOV DX,0 MOV AX,RSLTHI CMP AX,0 JE C1 DIV BX MOV RSLTHI ,AX MOV AX,RSLTLO DIV BX MOV RSLTLO,AX OR DL,30H MOV [DI],DL DEC DI JMP SHORT C0 C1: MOV AX,RSLTLO C2: CMP AX,0 JZ C3 MOV DX,0 DIV BX OR DL,30H MOV [DI],DL DEC DI JMP SHORT C2 C3 : RET BINR_ASC ENDP CODE ENDS END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -