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