?? 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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -