?? infor.asm
字號:
DATA SEGMENT
MAX_RECORD_NUM=20
NUMFORCOMPARE DB ?;用于刪除記錄時
RECORD_NUM DB ?
FIRSTVALID DW ?
AINVALID DW ?
HEAD DB "IDCARD "," "
DB "NAME "," "
DB "SEX"," "
DB "AGE"," "
DB "OCCUPATION$"
ADDERROR DB "IDCARD MUST BE UNIQUE!$"
INFORMATION1 DB "SELECT A OPERATION(L,A,S,D,Q):$"
INFORMATION2 DB "THE TABLE IS EMPTY!$"
INFORMATION_D DB "THERE IS NO VALID RECORD IN THE TABLE!$"
INFORMATION3 DB "BACK(B) OR GO ON(G):$"
INFORMATION_D0 DB "SUCCESS IN DELETING RECORD(S).$"
INFORMATION_A1 DB "INPUT A RECORD:$"
INFORMATION_A2 DB "SORRY,THERE IS NO SPACE LEFT!$"
INFORMATION_A3 DB "SUCCESS IN ADDING RECORD(S)!$"
INFORMATION_S0 DB "SELECT BY 1(IDCARD),2(NAME),3(SEX),4(AGE)OR 5(OCCUPATION)?:$"
INFORMATION_S1 DB "IDCARD:$"
INFORMATION_S2 DB "NAME:$"
INFORMATION_S3 DB "SEX:$"
INFORMATION_S4 DB "AGE:$"
INFORMATION_S5 DB "OCCUPATION:$"
INFORMATION_OVER DB "PRESS ANY KEY TO CONTINUE:$"
IDCARD0 DB 18 DUP(" ")
NAME0 DB 10 DUP(" ")
SEX0 DB " "
AGE0 DB 3 DUP(" ")
OCCUPATION0 DB 20 DUP(" "),"$"
SEQNUM1 DB 1
SIGN1 DB 1
IDCARD1 DB "350423198711024010"," "
NAME1 DB "Tom "," "
SEX1 DB "M "
AGE1 DB "21 "," "
OCCUPATION1 DB "Buyer ","$"
SEQNUM2 DB 2
SIGN2 DB 1
IDCARD2 DB "350423198507244010"," "
NAME2 DB "Steven "," "
SEX2 DB "F "
AGE2 DB "34 "," "
OCCUPATION2 DB "Translator ","$"
IRP X,<3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20>
SEQNUM&X DB X
SIGN&X DB 0
IDCARD&X DB 18 DUP(" ")," "
NAME&X DB 10 DUP(" ")," "
SEX&X DB 4 DUP(" ")
AGE&X DB 4 DUP(" ")
OCCUPATION&X DB 20 DUP(" "),"$"
ENDM
DATA ENDS
STACK SEGMENT PARA STACK
DB 150 DUP(?)
TOP DB ?
STACK ENDS
;定義宏OUTAL
;功能:輸出AL中的內容
OUTAL MACRO
PUSH AX
PUSH DX
MOV AH,2
MOV DL,AL
INT 21H
POP DX
POP AX
ENDM
;定義宏OUTP
;功能:輸出AL中的字符并存儲到[DI]中
OUTP MACRO
PUSH AX
PUSH DX
MOV AH,2
MOV DL,AL
INT 21H
STOSB
POP DX
POP AX
ENDM
;定義用于輸出回車換行的宏
CRLF MACRO
PUSH AX
PUSH DX
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
POP DX
POP AX
ENDM
;定義用于信息輸出的宏
INFORMATION MACRO X
PUSH DX
PUSH AX
MOV AH,9
LEA DX,X
INT 21H
POP AX
POP DX
ENDM
;宏BANK
;功能:輸出三個空格
BANK MACRO
PUSH AX
PUSH DX
MOV AH,2
MOV DL," "
INT 21H
INT 21H
INT 21H
POP DX
POP AX
ENDM
;OUTRECORD宏
;功能:輸出一條記錄
;入口參數:DX指向記錄的序號字段
OUTRECORD MACRO
PUSH AX
PUSH DX
MOV AH,9
ADD DX,2
INT 21H
POP DX
POP AX
ENDM
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA
MAIN PROC FAR
START:MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
LEA SP,TOP
MOV BYTE PTR RECORD_NUM,2
MOV WORD PTR FIRSTVALID,OFFSET SEQNUM1
MOV WORD PTR AINVALID,OFFSET SEQNUM3
OPERATION:INFORMATION INFORMATION1
MOV AH,7
SELECTOPER:INT 21H
CMP AL,"Q"
JE QUIT
CMP AL,"L"
JE LISTTABLE
CMP AL,"A"
JE INCRECORD
CMP AL,"S"
JE SEARCHTABLE
CMP AL,"D"
JNE SELECTOPER
OUTAL
CRLF
MOV BX,0;入口參數設置
CALL SEARCH
JMP OPERATION
QUIT:OUTAL
CRLF
JMP INFOR_END
LISTTABLE:OUTAL
CRLF
CALL LIST
JMP OPERATION
INCRECORD:OUTAL
CRLF
CALL ADDRECORD
JMP OPERATION
SEARCHTABLE:
OUTAL
CRLF
MOV BX,1;入口參數設置
CALL SEARCH
JMP OPERATION
INFOR_END:INFORMATION INFORMATION_OVER
INT 21H;按任意鍵結束
MOV AH,4CH
INT 21H
RET
;定義子程序ADDRECORD
;功能:增加一條記錄
ADDRECORD PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
CMP BYTE PTR RECORD_NUM,MAX_RECORD_NUM
JNE IRECORD
INFORMATION INFORMATION_A2;提示表滿
CRLF
JMP TABLEFUL
IRECORD:
INFORMATION INFORMATION_A1
CRLF
MOV DI,WORD PTR AINVALID
CALL ADDR
CRLF
CMP BX,1
JNE NOTEXIST
JMP TABLEFUL
NOTEXIST:INC BYTE PTR RECORD_NUM
MOV BYTE PTR[DI+1],1;記錄輸入完成后再改變標志字段及記錄數,以便判斷輸入合法性
;設置FIRSTVALID
CMP DI,WORD PTR FIRSTVALID
JAE SETINVALID
MOV WORD PTR FIRSTVALID,DI
;設置AINVALID
SETINVALID:CMP BYTE PTR RECORD_NUM,MAX_RECORD_NUM
JAE FULL
MOV BX,DI
SELECTINVALID:CMP BYTE PTR[BX],MAX_RECORD_NUM
JAE FROMHEAD
ADD BX,61;一個記錄占61字節的空間
CMP BYTE PTR[BX+1],0
JNE SELECTINVALID
JMP GET
FROMHEAD:LEA BX,SEQNUM1
NEXT:CMP BYTE PTR[BX+1],0
JE GET
ADD BX,61
JMP NEXT
GET:MOV WORD PTR AINVALID,BX
;選擇繼續或是后退
INFORMATION INFORMATION3
MOV AH,7
BORG:INT 21H
CMP AL,"B"
JE ADDCOMPLETE
CMP AL,"G"
JNE BORG
OUTAL
CRLF
CALL ADDRECORD
JMP TABLEFUL
FULL:MOV WORD PTR AINVALID,0
INFORMATION INFORMATION_A3
CRLF
INFORMATION INFORMATION_A2
CRLF
JMP TABLEFUL
ADDCOMPLETE:OUTAL
CRLF
INFORMATION INFORMATION_A3
CRLF
TABLEFUL:POP DI
POP DX
POP CX
POP BX
POP AX
RET
ADDRECORD ENDP
;定義子程序ADDR
;入口:DI指向記錄的第一字節(包括序號和標志字節)
;根據輸入是否重復設置BX,有時為1,無為0
ADDR PROC
PUSH AX
PUSH CX
PUSH DX
PUSH DI
MOV BX,0
ADD DI,2
;身份證號輸入
MOV CX,18
CLD
MOV AH,7
IDCARD:INT 21H
CMP AL,30H
JB IDCARD
CMP AL,39H
JA IDCARD
OUTP
LOOP IDCARD
INC DI
BANK
PUSH DI
;判斷是否有重復的IDCARD
MOV DL,BYTE PTR RECORD_NUM
CMP DL,0
JE INNAME
SUB DI,19
MOV SI,WORD PTR FIRSTVALID
ADDJUDGE1:PUSH SI
PUSH DI
ADD SI,2
MOV CX,18
REPZ CMPSB
POP DI
POP SI
CMP CX,0
JE MATTER
DEC DL
CMP DL,0
JE INNAME
ADD SI,61
JMP ADDJUDGE1
MATTER:
INFORMATION ADDERROR
POP DI
MOV BX,1
JMP ADDOVER
;姓名
INNAME:POP DI
MOV CX,10;入口參數設置
CALL INPUTSTRING
INC DI
BANK
;性別
SEX:INT 21H
CMP AL,"F"
JE RIGHT
CMP AL,"M"
JNE SEX
RIGHT:OUTP
ADD DI,3
BANK
;年齡
MOV CX,3;入口參數
CALL AGE
INC DI
BANK
;職務
MOV CX,20;入口參數
CALL INPUTSTRING
ADDOVER:POP DI
POP DX
POP CX
POP AX
RET
ADDR ENDP
;INPUTSTRING子程序定義
;用于輸入一個用雙引號引起來的字符串
;入口地址:DI
;輸入參數CX表示分配的字節數
;程序結束時DI指向分配內存單元的下一字節
INPUTSTRING PROC
PUSH AX
PUSH DX
PUSHF
CLD
MOV AH,7
LEFTQUOTE:INT 21H
CMP AL,22H;雙引號
JNZ LEFTQUOTE
OUTAL
STRING:INT 21H
CMP AL,22H
JE OVER
CMP AL," "
JE LETTER
CMP AL,41H
JB STRING
CMP AL,7AH
JA STRING
CMP AL,5AH
JBE LETTER
CMP AL,61H
JB STRING
LETTER:OUTP
LOOP STRING
OVER:MOV AH,2
MOV DL,22H
INT 21H
CMP CX,0;判斷是否要補空格
JE NOTNEED
MOV AL," "
INBANK:OUTP
LOOP INBANK
NOTNEED:POPF
POP DX
POP AX
RET
INPUTSTRING ENDP
;字程序:AGE
;功能:輸入一個整數,未滿時以空格結束
;入口:CX存放數的最大長度
;出口:數存放于DI開始的內存單元中
;程序結束后DI指向為其分配的內存單元的下一單元
AGE PROC NEAR
PUSH AX
PUSH DX
MOV AH,7
FIRSTCH:INT 21H
CMP AL,31H
JB FIRSTCH
CMP AL,39H
JA FIRSTCH
OUTP
DEC CX
OTHER:INT 21H
CMP AL," "
JE NO
CMP AL,30H
JB OTHER
CMP AL,39H
JA OTHER
OUTP
LOOP OTHER
JMP YES
NO:OUTAL
FILL:OUTP;補空格
LOOP FILL
YES:POP DX
POP AX
RET
AGE ENDP
;LIST子程序
;列出表中記錄,包括表頭
;完成后光標指向行首
LIST PROC
PUSH CX
PUSH DX
PUSH BX
MOV CL,BYTE PTR RECORD_NUM
CMP CL,0
JNE NONEMPTY
INFORMATION INFORMATION2;表空
JMP LISTCOMPLETE
NONEMPTY:INFORMATION HEAD
MOV BX,WORD PTR FIRSTVALID
JUDGE:CMP BYTE PTR[BX+1],1
JNE LISTNEXT
CRLF
MOV DX,BX
OUTRECORD
DEC CL
CMP CL,0
JE LISTCOMPLETE
LISTNEXT:ADD BX,61
JMP JUDGE
LISTCOMPLETE:CRLF
POP BX
POP DX
POP CX
RET
LIST ENDP
;SEARCH子程序
;BX入口參數為1時查找,為0時刪除
;程序最后顯示是否有記錄被刪
SEARCH PROC
PUSH AX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSHF
MOV AL,BYTE PTR RECORD_NUM
MOV BYTE PTR NUMFORCOMPARE,AL
CLD
CMP BYTE PTR RECORD_NUM,0
JNE S_NONEMPTY
JMP S_EMPTY
S_NONEMPTY:INFORMATION INFORMATION_S0
MOV AH,7
ATTRIBUTE:INT 21H
CMP AL,"1"
JNE SHORT NA1
JMP A1
NA1:CMP AL,"2"
JNE SHORT NA2
JMP A2
NA2:CMP AL,"3"
JNE SHORT NA3
JMP A3
NA3:CMP AL,"4"
JNE SHORT NA4
JMP A4
NA4:CMP AL,"5"
JNE ATTRIBUTE
;根據OCCUPATION查找
OUTAL
CRLF
INFORMATION INFORMATION_S5
LEA DI,OCCUPATION0
PUSH DI
MOV CX,20
CALL INPUTSTRING
CRLF
POP DI
CMP BX,0
JE FORDELETE5_1
INFORMATION HEAD
CRLF
FORDELETE5_1:MOV AL,BYTE PTR RECORD_NUM
MOV SI,WORD PTR FIRSTVALID
S_NEXT5:
PUSH DI
PUSH SI
ADD SI,40
MOV CX,21
REPZ CMPSB
POP SI
POP DI
CMP CX,0
JNE UNCON5
CMP BX,0
JE FORDELETE5_2
MOV DX,SI
OUTRECORD
CRLF
JMP UNCON5
FORDELETE5_2:MOV BYTE PTR[SI+1],0;刪除記錄
DEC BYTE PTR RECORD_NUM;重設RECORD_NUM
MOV WORD PTR AINVALID,SI;重設AINVALID
CMP SI,WORD PTR FIRSTVALID;重設FIRSTVALID
JNE UNCON5
CMP BYTE PTR RECORD_NUM,0
JE UNCON5
PUSH SI
SVALIDNEXT5:
ADD SI,61
CMP BYTE PTR [SI+1],1
JNE SVALIDNEXT5
MOV WORD PTR FIRSTVALID,SI
POP SI
UNCON5:DEC AL
CMP AL,0
JNE S_NEXTVALID5
JMP S_COMPLETE
S_NEXTVALID5:ADD SI,61
CMP BYTE PTR [SI+1],1
JNE S_NEXTVALID5
JMP S_NEXT5
;根據IDCARD查找
A1:OUTAL
CRLF
INFORMATION INFORMATION_S1
LEA DI,IDCARD0
PUSH DI
MOV CX,18
CLD
MOV AH,7
S_IDCARD:INT 21H
CMP AL,30H
JB S_IDCARD
CMP AL,39H
JA S_IDCARD
OUTP
LOOP S_IDCARD
CRLF
POP DI
CMP BX,0
JE FORDELETE1_1
INFORMATION HEAD
CRLF
FORDELETE1_1:
MOV AL,BYTE PTR RECORD_NUM
MOV SI,WORD PTR FIRSTVALID
S_NEXT1:PUSH DI
PUSH SI
ADD SI,2
MOV CX,19
REPZ CMPSB
POP SI
POP DI
CMP CX,0
JNE UNCON1
CMP BX,0
JE FORDELETE1_2
MOV DX,SI
OUTRECORD
CRLF
JMP UNCON1
FORDELETE1_2:MOV BYTE PTR[SI+1],0;刪除記錄
DEC BYTE PTR RECORD_NUM;重設RECORD_NUM
MOV WORD PTR AINVALID,SI;重設AINVALID
CMP SI,WORD PTR FIRSTVALID;重設FIRSTVALID
JNE UNCON1
CMP BYTE PTR RECORD_NUM,0
JE UNCON1
PUSH SI
SVALIDNEXT1:
ADD SI,61
CMP BYTE PTR [SI+1],1
JNE SVALIDNEXT1
MOV WORD PTR FIRSTVALID,SI
POP SI
UNCON1:DEC AL
CMP AL,0
JNE S_NEXTVALID1
JMP S_COMPLETE
S_NEXTVALID1:ADD SI,61
CMP BYTE PTR [SI+1],1
JNE S_NEXTVALID1
JMP S_NEXT1
;根據NAME查找
A2:OUTAL
CRLF
INFORMATION INFORMATION_S2
LEA DI,NAME0
PUSH DI
MOV CX,10
CALL INPUTSTRING
CRLF
POP DI
CMP BX,0
JE FORDELETE2_1
INFORMATION HEAD
CRLF
FORDELETE2_1:
MOV AL,BYTE PTR RECORD_NUM
MOV SI,WORD PTR FIRSTVALID
S_NEXT2:
PUSH DI
PUSH SI
ADD SI,21
MOV CX,11
REPZ CMPSB
POP SI
POP DI
CMP CX,0
JNE UNCON2
CMP BX,0
JE FORDELETE2_2
MOV DX,SI
OUTRECORD
CRLF
JMP UNCON2
FORDELETE2_2:MOV BYTE PTR[SI+1],0;刪除記錄
DEC BYTE PTR RECORD_NUM;重設RECORD_NUM
MOV WORD PTR AINVALID,SI;重設AINVALID
CMP SI,WORD PTR FIRSTVALID;重設FIRSTVALID
JNE UNCON2
CMP BYTE PTR RECORD_NUM,0
JE UNCON2
PUSH SI
SVALIDNEXT2:
ADD SI,61
CMP BYTE PTR [SI+1],1
JNE SVALIDNEXT2
MOV WORD PTR FIRSTVALID,SI
POP SI
UNCON2:DEC AL
CMP AL,0
JNE S_NEXTVALID2
JMP S_COMPLETE
S_NEXTVALID2:ADD SI,61
CMP BYTE PTR [SI+1],1
JNE S_NEXTVALID2
JMP S_NEXT2
;根據SEX進行查找
A3:OUTAL
CRLF
INFORMATION INFORMATION_S3
LEA DI,SEX0
PUSH DI
MOV AH,7
SEX_ERROR:
INT 21H
CMP AL,"F"
JE SEX_RIGHT
CMP AL,"M"
JNE SEX_ERROR
SEX_RIGHT:
OUTP
CRLF
POP DI
CMP BX,0
JE FORDELETE3_1
INFORMATION HEAD
CRLF
FORDELETE3_1:
MOV AL,BYTE PTR RECORD_NUM
MOV SI,WORD PTR FIRSTVALID
S_NEXT3:
PUSH DI
PUSH SI
ADD SI,32
MOV CX,2
REPZ CMPSB
POP SI
POP DI
CMP CX,0
JNE UNCON3
CMP BX,0
JE FORDELETE3_2
MOV DX,SI
OUTRECORD
CRLF
JMP UNCON3
FORDELETE3_2:MOV BYTE PTR[SI+1],0;刪除記錄
DEC BYTE PTR RECORD_NUM;重設RECORD_NUM
MOV WORD PTR AINVALID,SI;重設AINVALID
CMP SI,WORD PTR FIRSTVALID;重設FIRSTVALID
JNE UNCON3
CMP BYTE PTR RECORD_NUM,0
JE UNCON3
PUSH SI
SVALIDNEXT3:
ADD SI,61
CMP BYTE PTR [SI+1],1
JNE SVALIDNEXT3
MOV WORD PTR FIRSTVALID,SI
POP SI
UNCON3:DEC AL
CMP AL,0
JNE S_NEXTVALID3
JMP S_COMPLETE
S_NEXTVALID3:ADD SI,61
CMP BYTE PTR [SI+1],1
JNE S_NEXTVALID3
JMP S_NEXT3
;根據AGE查找
A4:OUTAL
CRLF
INFORMATION INFORMATION_S4
LEA DI,AGE0
PUSH DI
MOV CX,3
CALL AGE
CRLF
POP DI
CMP BX,0
JE FORDELETE4_1
INFORMATION HEAD
CRLF
FORDELETE4_1:
MOV AL,BYTE PTR RECORD_NUM
MOV SI,WORD PTR FIRSTVALID
S_NEXT4:
PUSH DI
PUSH SI
ADD SI,36
MOV CX,4
REPZ CMPSB
POP SI
POP DI
CMP CX,0
JNE UNCON4
CMP BX,0
JE FORDELETE4_2
MOV DX,SI
OUTRECORD
CRLF
JMP UNCON4
FORDELETE4_2:MOV BYTE PTR[SI+1],0;刪除記錄
DEC BYTE PTR RECORD_NUM;重設RECORD_NUM
MOV WORD PTR AINVALID,SI;重設AINVALID
CMP SI,WORD PTR FIRSTVALID;重設FIRSTVALID
JNE UNCON4
CMP BYTE PTR RECORD_NUM,0
JE UNCON4
PUSH SI
SVALIDNEXT4:
ADD SI,61
CMP BYTE PTR [SI+1],1
JNE SVALIDNEXT4
MOV WORD PTR FIRSTVALID,SI
POP SI
UNCON4:DEC AL
CMP AL,0
JNE S_NEXTVALID4
JMP S_COMPLETE
S_NEXTVALID4:ADD SI,61
CMP BYTE PTR [SI+1],1
JNE S_NEXTVALID4
JMP S_NEXT4
S_EMPTY:INFORMATION INFORMATION2
CRLF
JMP FORSEARCH
S_COMPLETE:CMP BX,0
JNE FORSEARCH
MOV DH,BYTE PTR NUMFORCOMPARE
CMP DH,BYTE PTR RECORD_NUM
JNE DELETESOME
INFORMATION INFORMATION_D
CRLF
JMP FORSEARCH
DELETESOME:
INFORMATION INFORMATION_D0
CRLF
FORSEARCH:
POPF
POP DI
POP SI
POP DX
POP CX
POP AX
RET
SEARCH ENDP
MAIN ENDP
CODE ENDS
END START
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -