📄 dagl1.asm
字号:
;无匹配记录
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -