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

📄 infor.asm

📁 用汇编语言建立一个表格
💻 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 + -