www.pudn.com > dagl1.rar > dagl1.asm


data    segment 
menu     db  13,10 
         db  13,10 
         db  '******************************************************',13,10 
         db  'Please choose these following choices:',13,10 
         db  '(1)L:List records         (2)S:Search record',13,10 
         db  '(3)A:Add record           (4)D:Delete record',13,10 
         db  '(5)Q:Quit',13,10 
         db  '******************************************************',13,10 
         db  13,10 
         db  'Your choice is:','$' 
continue db  13,10,'Please press any key to continue.','$' 
L_TAB    db  13,10,'ID           NAME       SEX    AGE',13,10,'$' 
L_SUC    db  13,10,'List succeeding.','$' 
L_FAIL   db  13,10,'Fail:Nothing in this table.','$' 
S_TAB    db  13,10,'Searching by ID. ',13,10,'Please input the ID number:','$' 
S_SUC    db  13,10,'Search succeeding.','$' 
S_ERR_1  equ  L_FAIL 
S_ERR_2  db  13,10,'Fail:There is no such record in this table.','$' 
A_TAB    db  13,10,'Please input the new record:','$' 
A_ID     db  13,10,'ID number:','$' 
A_NAME   db  13,10,'Name:','$' 
A_SEX    db  13,10,'Sex:','$' 
A_AGE    db  13,10,'Age:','$' 
A_SUC    db  13,10,'Add succeeding.','$' 
A_EA     dw  0                                ;存放新记录的首地址,表满时为-1 
A_ERR_1  equ  L_FAIL 
A_ERR_2  db  13,10,'Fail:This ID is existing.','$' 
D_TAB    db  13,10,'Deleting record by ID.',13,10,'Please input the ID number:','$' 
D_ASK    db  13,10,'Do you really want to remove this record ?(Y/N)','$' 
D_SUC    db  13,10,'Delete succeeding.','$' 
D_ERR_1  equ  L_FAIL 
D_ERR_2  equ  S_ERR_2 
D_ERR_3  db  13,10,'Delete is rejecting.','$' 
QUIT     db  13,10 
         db  13,10,'Thanks for your using.' 
         db  13,10 
         db  13,10,'Press any key to exit.','$' 
;开辟10个记录的存储区 
num      equ  10                              ;记录数常数 
TAB      db  num dup(0,10 dup(?),3 dup(' '),8 dup(?),3 dup(' '),?,6 dup(' '),?,?,?,13,10,'$') 
LEN      db  0                                ;记录非空记录数 
TEM_ID   db  10 dup(?)                        ;暂存ID 
L_ID     equ  10                              ;ID长度 
L_NAM    equ  8                               ;姓名长度 
L_SEX    equ  1                               ;性别长度 
L_AGE    equ  3                               ;年龄长度 
L_REC    equ  38                              ;记录长度 
L_ERR    db  0                                ;列表错误返回码 
S_ERR    db  0                                ;查找错误返回码 
A_ERR    db  0                                ;插入错误返回码 
D_ERR    db  0                                ;删除错误返回码 
data     ends 
stack    segment  stack 
         db  100 dup(0) 
top      db  ? 
stack    ends 
code     segment 
         assume cs:code,ds:data,es:data,ss:stack 
; 
start:   mov  ax,data 
         mov  ds,ax 
         mov  es,ax 
         mov  ax,stack 
         mov  ss,ax 
         lea  sp,top 
; 
distit:  lea  dx,menu 
         mov  ah,9 
         int  21h 
; 
choose:  mov  ah,7 
         int  21h 
ch_l:    cmp  al,'L' 
         jnz  ch_s 
         jmp  op_l 
ch_s:    cmp  al,'S' 
         jnz  ch_a 
         jmp  op_s 
ch_a:    cmp  al,'A' 
         jnz  ch_d 
         jmp  op_a 
ch_d:    cmp  al,'D' 
         jnz  ch_q 
         jmp  op_d 
ch_q:    cmp  al,'Q' 
         jnz  choose 
         jmp  op_q 
;显示操作 
op_l:    mov  dl,al 
         mov  ah,2 
         int  21h 
op_l_cr: mov  ah,7 
         int  21h 
         cmp  al,13 
         jnz  op_l_cr 
; 
         call list_records 
         cmp  L_ERR,1 
         jz   op_l_err 
         mov  ah,7 
         int  21h 
         jmp  distit 
; 
op_l_err:lea  dx,L_FAIL 
         mov  ah,9 
         int  21h 
         lea  dx,continue 
         mov  ah,9 
         int  21h 
         mov  ah,7 
         int  21h 
         jmp  distit 
;查找操作 
op_s:    mov  dl,al 
         mov  ah,2 
         int  21h 
op_s_cr: mov  ah,7 
         int  21h 
         cmp  al,13 
         jnz  op_s_cr 
; 
         call search_record 
         cmp  S_ERR,1 
         jz   op_s_e1 
         cmp  S_ERR,2 
         jz   op_s_e2 
         mov  ah,7 
         int  21h 
         jmp  distit 
; 
op_s_e1: lea  dx,S_ERR_1 
         mov  ah,9 
         int  21h 
         lea  dx,continue 
         mov  ah,9 
         int  21h 
         mov  ah,7 
         int  21h 
         jmp  distit 
op_s_e2: lea  dx,S_ERR_2 
         mov  ah,9 
         int  21h 
         lea  dx,continue 
         mov  ah,9 
         int  21h 
         mov  ah,7 
         int  21h 
         jmp  distit 
;插入操作 
op_a:    mov  dl,al 
         mov  ah,2 
         int  21h 
op_a_cr: mov  ah,7 
         int  21h 
         cmp  al,13 
         jnz  op_a_cr 
; 
         call add_record 
         cmp  A_ERR,1 
         jz   op_a_e1 
         cmp  A_ERR,2 
         jz   op_a_e2 
         mov  ah,7 
         int  21h 
         jmp  distit 
; 
op_a_e1: lea  dx,A_ERR_1 
         mov  ah,9 
         int  21h 
         lea  dx,continue 
         mov  ah,9 
         int  21h 
         mov  ah,7 
         int  21h 
         jmp  distit 
op_a_e2: lea  dx,A_ERR_2 
         mov  ah,9 
         int  21h 
         lea  dx,continue 
         mov  ah,9 
         int  21h 
         mov  ah,7 
         int  21h 
         jmp  distit 
;删除操作 
op_d:    mov  dl,al 
         mov  ah,2 
         int  21h 
op_d_cr: mov  ah,7 
         int  21h 
         cmp  al,13 
         jnz  op_d_cr 
; 
         call delete_record 
         cmp  D_ERR,1 
         jz   op_d_e1 
         cmp  D_ERR,2 
         jz   op_d_e2 
         cmp  D_ERR,3 
         jz   op_d_e3 
         mov  ah,7 
         int  21h 
         jmp  distit 
; 
op_d_e1: lea  dx,D_ERR_1 
         mov  ah,9 
         int  21h 
         lea  dx,continue 
         mov  ah,9 
         int  21h 
         mov  ah,7 
         int  21h 
         jmp  distit 
op_d_e2: lea  dx,D_ERR_2 
         mov  ah,9 
         int  21h 
         lea  dx,continue 
         mov  ah,9 
         int  21h 
         mov  ah,7 
         int  21h 
         jmp  distit 
op_d_e3: lea  dx,D_ERR_3 
         mov  ah,9 
         int  21h 
         lea  dx,continue 
         mov  ah,9 
         int  21h 
         mov  ah,7 
         int  21h 
         jmp  distit 
;退出操作 
op_q:    mov  dl,al 
         mov  ah,2 
         int  21h 
op_q_cr: mov  ah,7 
         int  21h 
         cmp  al,13 
         jnz  op_q_cr 
; 
         lea  dx,QUIT 
         mov  ah,9 
         int  21h 
         mov  ah,7 
         int  21h 
; 
         mov  ah,4ch 
         int  21h 
;************************************* 
;功能:输出全表记录 
;破坏寄存器:无 
;返回值:L_ERR(1)当表空时,L_ERR=1 
;************************************* 
; 
list_records  proc  near 
         push  ax 
         push  bx 
         push  cx 
         push  dx 
         push  di 
; 
         cmp  LEN,0 
         jnz  list1 
         mov  L_ERR,1                       ;表空 
         jmp  end_l 
;表非空 
list1:   lea  dx,L_TAB 
         mov  ah,9 
         int  21h 
; 
         mov  cl,0 
         mov  bx,0 
         mov  di,1 
         mov  ah,9 
list2:   cmp  byte ptr TAB[bx],0 
         jz  list3                          ;转移则为空记录 
         inc  cl                            ;非空记录 
         lea  dx,TAB[bx][di] 
         int  21h 
list3:   add  bx,L_REC                      ;下一记录首地址 
         cmp  cl,LEN 
         jnz  list2                         ;非空记录尚未显示完转移 
; 
         mov  L_ERR,0 
; 
         lea  dx,L_SUC 
         mov  ah,9 
         int  21h 
         lea  dx,continue 
         mov  ah,9 
         int  21h 
; 
end_l:   pop  di 
         pop  dx 
         pop  cx 
         pop  bx 
         pop  ax 
         ret 
list_records  endp 
; 
;********************************************** 
;功能:根据ID号查找表内记录 
;破坏寄存器:无 
;返回值:S_ERR(1)当表空时,S_ERR=1 
;             (2)当表内无匹配记录时,S_ERR=2 
;********************************************** 
; 
search_record  proc  near 
         push  ax 
         push  bx 
         push  cx 
         push  dx 
         push  si 
         push  di 
         push  bp 
; 
         cmp  LEN,0 
         jnz  search1 
         mov  S_ERR,1                           ;表空 
         jmp  end_s 
;表非空 
search1: lea  dx,S_TAB 
         mov  ah,9 
         int  21h 
;输入ID串并暂存 
         mov  si,0 
search2: mov  ah,7 
         int  21h 
         cmp  al,'0' 
         jb   search2 
         cmp  al,'9' 
         ja   search2 
         mov  dl,al 
         mov  ah,2 
         int  21h 
         mov  TEM_ID[si],al 
         inc  si 
         cmp  si,L_ID 
         jnz  search2 
; 
search3: mov  ah,7 
         int  21h 
         cmp  al,13 
         jnz  search3 
;与非空记录比对 
         mov  bl,0 
         cld 
         mov  si,(offset TAB)+1 
search4: mov  bp,si 
         cmp  byte ptr [si-1],1 
         jnz  search5                       ;转移则为空记录 
         inc  bl                            ;非空记录 
         lea  di,TEM_ID 
         mov  cx,L_ID 
         repz cmpsb 
         jz   search7                       ;转则有匹配记录 
         mov  si,bp 
search5: add  si,L_REC                      ;下一记录首地址 
         cmp  bl,LEN 
         jz   search6                       ;所有记录均已做比对无匹配则转 
         jmp  search4 
;无匹配记录 
search6: mov  S_ERR,2 
         jmp  end_s 
;有匹配记录 
search7: lea  dx,L_TAB 
         mov  ah,9 
         int  21h 
         lea  dx,[si-L_ID] 
         mov  ah,9 
         int  21h 
         lea  dx,S_SUC 
         mov  ah,9 
         int  21h 
         lea  dx,continue 
         mov  ah,9 
         int  21h 
         mov  S_ERR,0 
; 
end_s:   pop  bp 
         pop  di 
         pop  si 
         pop  dx 
         pop  cx 
         pop  bx 
         pop  ax 
         ret 
search_record endp 
; 
;************************************************************ 
;功能:向表中插入新记录 
;破坏寄存器:无 
;返回值:A_ERR(1)当表满时,A_ERR=1 
;             (2)当插入记录的ID与表内某记录重复时,A_ERR=2 
;************************************************************ 
; 
add_record  proc  near 
         push  ax 
         push  bx 
         push  cx 
         push  dx 
         push  si 
         push  di 
         push  bp 
; 
         cmp  LEN,num 
         jnz  add1 
         mov  A_ERR,1                           ;表满 
         jmp  end_a 
;表不满 
add1:    lea  dx,A_TAB 
         mov  ah,9 
         int  21h 
; 
         lea  dx,A_ID 
         mov  ah,9 
         int  21h 
;输入ID串并暂存 
         mov  si,0 
add2:    mov  ah,7 
         int  21h 
         cmp  al,'0' 
         jb  add2 
         cmp  al,'9' 
         ja  add2 
         mov  dl,al 
         mov  ah,2 
         int  21h 
         mov  TEM_ID[si],al 
         inc  si 
         cmp  si,L_ID 
         jnz  add2 
; 
add3:    mov  ah,7 
         int  21h 
         cmp  al,13 
         jnz  add3 
; 
         cmp  LEN,0 
         jnz  compare 
         inc  LEN                                   ;表空 
         mov  bx,offset TAB 
         mov  A_EA,bx 
         add  A_EA,L_REC                             ;A_EA指向第2个记录位置的首地址 
         jmp  add10 
;表不空,与非空记录比对 
compare: mov  bl,0 
         cld 
         mov  si,(offset TAB)+1 
add4:    mov  bp,si 
         cmp  byte ptr [si-1],1 
         jnz  add5                                   ;转移则为空记录 
         inc  bl                                     ;非空记录 
         lea  di,TEM_ID 
         mov  cx,L_ID 
         repz  cmpsb 
         jz   add6                                   ;匹配则转 
         mov  si,bp 
add5:    add  si,L_REC 
         cmp  bl,LEN 
         jz   add7                                   ;所有记录均已做比对无匹配则转 
         jmp  add4 
;有匹配记录 
add6:    mov  A_ERR,2 
         jmp  end_a 
;无匹配记录 
add7:    mov  bx,A_EA 
         inc  LEN 
         cmp  LEN,num 
         jnz  add8 
         mov  A_EA,-1                                ;表满时A_EA为-1 
         jmp  add10 
;表不满时,计算A_EA 
add8:    add  A_EA,L_REC 
         cmp  A_EA,offset LEN 
         jnz  add9 
         mov  A_EA,offset TAB 
add9:    mov  bp,A_EA 
         cmp  byte ptr ds:[bp],1 
         jz   add8 
;将暂存的ID串转存记录中 
add10:   mov  byte ptr [bx],1 
         inc  bx 
         mov  di,bx 
         lea  si,TEM_ID 
         cld 
         mov  cx,L_ID 
         rep  movsb 
         add  bx,L_ID 
         add  bx,3 
;输入姓名串 
         lea  dx,A_NAME 
         mov  ah,9 
         int  21h 
         mov  cl,L_NAM 
add11:   mov  ah,7 
         int  21h 
         cmp  al,'A' 
         jb  add11 
         cmp  al,'Z' 
         ja  add11 
         jmp  add13 
; 
add12:   cmp  al,'A' 
         jb  add14 
         cmp  al,'Z' 
         ja  add14 
add13:   mov  dl,al 
         mov  ah,2 
         int  21h 
         mov  [bx],al 
         inc  bx 
         dec  cl 
         jz   add16 
; 
add14:   mov  ah,7 
         int  21h 
         cmp  al,13 
         jnz  add12 
;姓名不足8位则补空格 
add15:   mov  byte ptr [bx],20h 
         inc  bx 
         dec  cl 
         jnz  add15 
;输入性别 
add16:   lea  dx,A_SEX 
         mov  ah,9 
         int  21h 
         add  bx,3 
add17:   mov  ah,7 
         int  21h 
         cmp  al,'F' 
         jZ  add18 
         cmp  al,'M' 
         jnz add17 
add18:   mov  dl,al 
         mov  ah,2 
         int  21h 
         mov  [bx],al 
add19:   mov  ah,7 
         int  21h 
         cmp  al,13 
         jnz  add19 
;输入年龄 
         lea  dx,A_AGE 
         mov  ah,9 
         int  21h 
; 
         inc  bx 
         add  bx,6 
         mov  cl,L_AGE 
add20:   mov  ah,7 
         int  21h 
         cmp  al,'1' 
         jb  add20 
         cmp  al,'9' 
         ja  add20 
         jmp  add22 
; 
add21:   cmp  al,'0' 
         jb  add23 
         cmp  al,'9' 
         ja  add23 
add22:   mov  dl,al 
         mov  ah,2 
         int  21h 
         mov  [bx],al 
         inc  bx 
         dec  cl 
         jz   add25 
; 
add23:   mov  ah,7 
         int  21h 
         cmp  al,13 
         jnz  add21 
;年龄不足3位则补空格 
add24:    mov  byte ptr [bx],20h 
         inc  bx 
         dec  cl 
         jnz  add24 
; 
add25:   mov  A_ERR,0 
; 
         lea  dx,A_SUC 
         mov  ah,9 
         int  21h 
         lea  dx,continue 
         mov  ah,9 
         int  21h 
; 
end_a:   pop  bp 
         pop  di 
         pop  si 
         pop  dx 
         pop  cx 
         pop  bx 
         pop  ax 
         ret 
add_record endp 
; 
;************************************************************ 
;功能:根据ID号查找表中记录,然后删除 
;破坏寄存器:无 
;返回值:D_ERR(1)当表空时,D_ERR=1 
;             (2)当表内无匹配记录时,D_ERR=2 
;             (3)当查找成功,但取消删除操作时,D_ERR=3 
;************************************************************ 
; 
delete_record  proc  near 
         push  ax 
         push  bx 
         push  cx 
         push  dx 
         push  si 
         push  di 
         push  bp 
; 
         cmp  LEN,0 
         jnz  delete1 
         mov  D_ERR,1                                ;表空 
         jmp  end_d 
;表不空 
delete1: lea  dx,D_TAB 
         mov  ah,9 
         int  21h 
;输入ID串并暂存 
         mov  si,0 
delete2: mov  ah,7 
         int  21h 
         cmp  al,'0' 
         jb   delete2 
         cmp  al,'9' 
         ja   delete2 
         mov  dl,al 
         mov  ah,2 
         int  21h 
         mov  TEM_ID[si],al 
         inc  si 
         cmp  si,L_ID 
         jnz  delete2 
; 
delete3: mov  ah,7 
         int  21h 
         cmp  al,13 
         jnz  delete3 
;与非空记录比对 
         mov  bl,0 
         cld 
         mov  si,(offset TAB)+1 
delete4: mov  bp,si 
         cmp  byte ptr [si-1],1 
         jnz  delete5                                   ;转移则为空记录 
         inc  bl                                        ;非空记录 
         lea  di,TEM_ID 
         mov  cx,L_ID 
         repz cmpsb 
         jz   delete7                                   ;匹配则转 
         mov  si,bp 
delete5: add  si,L_REC 
         cmp  bl,LEN 
         jz   delete6                                   ;所有记录均已做比对无匹配则转 
         jmp  delete4 
;无匹配记录 
delete6: mov  D_ERR,2 
         jmp  end_d 
;有匹配记录 
delete7: lea  dx,D_ASK 
         mov  ah,9 
         int  21h 
; 
delete8: mov  ah,7 
         int  21h 
         cmp  al,'N' 
         jZ   cancel 
         cmp  al,'Y' 
         jnz delete8 
         mov  dl,al 
         mov  ah,2 
         int  21h 
delete9: mov  ah,7 
         int  21h 
         cmp  al,13 
         jnz  delete9 
;执行删除操作 
         mov  byte ptr ds:[bp-1],0                           ;将标志清0 
         cmp  LEN,num 
         jnz  delete11 
         mov  A_EA,bp 
         dec  A_EA                                           ;表满时计算A_EA 
         jmp  delete11 
;取消删除操作 
cancel:  mov  dl,al 
         mov  ah,2 
         int  21h 
delete10:mov  ah,7 
         int  21h 
         cmp  al,13 
         jnz  delete10 
         mov  D_ERR,3 
         jmp  end_d 
;删除成功 
delete11:dec  LEN                                            ;非空记录数减1 
         lea  dx,D_SUC 
         mov  ah,9 
         int  21h 
         lea  dx,continue 
         mov  ah,9 
         int  21h 
         mov  D_ERR,0 
; 
end_d:   pop  bp 
         pop  di 
         pop  si 
         pop  dx 
         pop  cx 
         pop  bx 
         pop  ax 
         ret 
delete_record endp 
code     ends 
         end start