datarea segment
mess1 db 'input name:','$'
mess2 db 'input phone number:','$'
mess3 db 'Do you want to search a telephone number?(y/n)','$'
mess4 db 0dh,0ah,'search name?','$'
mess5 db 'NOT FOUND',0dh,0ah,'$'
mess6 db 'how many:','$'
mess7 db 'name phone',0dh,0ah,'$'
endaddr dw ?
swapped dw ?
totalnum dw ?
searchaddr dw ?
flag db ?
flagb db ?
name_count dw 0
savenp db 28 dup(?),0dh,0ah,'$'
crlf db 0dh,0ah,'$'
numtable db 50 dup(28 dup(?))
stokin1 label byte
max1 db 21
act1 db ?
stokn1 db 21 dup(?)
stokin2 label word
max2 db 9
act2 db ?
stokn2 db 9 dup(?)
datarea ends
;-----------------------------------------------------------------------
codesg segment
assume ds:datarea,cs:codesg,es:datarea
main proc far
mov ax,datarea
mov ds,ax
mov es,ax
lea di,numtable
lea dx,mess6
mov ah,09
int 21h
mov bx,0
inputmsg:
mov ah,1 ;1:输入一个字符并回显 al=输入 7/8:输入不回显 10:输入并回显,存在ds dx中
int 21h
sub al,30h
jl next
cmp al,9
jg next
cbw
xchg ax,bx
mov cx,10
mul cx
xchg ax,bx
add bx,ax
jmp inputmsg
next:
mov totalnum,bx
lea dx,crlf
mov ah,09
int 21h
inputname:
lea dx,mess1
mov ah,09
int 21h
call input_name
inc name_count
call stor_name
lea dx,mess2
mov ah,09
int 21h
call asksearch
call stor_phone
cmp name_count,0
je exit
mov bx,totalnum
cmp name_count,bx
jnz inputname
call name_sort
asksearch:
lea dx,mess3
mov ah,09
int 21h
mov ah,08
int 21h
cmp al,'y'
jz askname
cmp al,'n'
jz exit
jmp asksearch
askname:
mov ah,09
lea dx,mess4
int 21h
call input_name
a40:
call name_search
jmp inputname
exit:
mov ax,4c00h
main endp
input_name proc near
mov ah,0ah
lea dx,stokin1
int 21h
mov ah,09
lea dx,crlf
int 21h
sub bh,bh
mov bl,act1
mov cx,21
sub cx,bx
blank:
mov stokn1[bx],' '
inc bx
loop blank
ret
input_name endp
stor_name proc near
lea si,stokn1
mov cx,20
rep movsb;rep:字符串重复操作至cx==0 ;movsb指令用于把字节从ds:si 搬到es:di
ret
stor_name endp
asksearch proc near
mov ah,0ah
lea dx,stokin2
int 21h
mov ah,09
lea dx,crlf
int 21h
sub bh,bh
mov bl,act2
mov cx,9
sub cx,bx
c10:
mov stokn2[bx],' '
inc bx
loop c10
ret
asksearch endp
stor_phone proc near
lea si,stokn2
mov cx,8
rep movsb
ret
stor_phone endp
name_sort proc near
sub di,28
mov endaddr,di
c1:
mov swapped,0
lea si,numtable
c2:
mov cx,20
mov di,si
add di,28
mov ax,di
mov bx,si
repz cmpsb
jbe c3
mov si,bx
lea di,savenp
mov cx,28
rep movsb
mov cx,28
mov di,bx
rep movsb
mov cx,28
lea si,savenp
rep movsb
mov swapped,1
c3:
mov si,ax
cmp si,endaddr
jb c2
cmp swapped,0
jnz c1
ret
name_sort endp
;--------------------------------------------------------------------
name_search proc near
lea bx,numtable
mov flag,0
d:
mov cx,20
lea si,stokn1
mov di,bx
repz cmpsb
jz d2
add bx,28 ;next line
cmp bx,endaddr
jbe d ;keep looking
sub flag,0 ;not found
jz nof
jmp dexit
nof: lea dx,mess5
mov ah,09
int 21h
d2:
mov searchaddr,bx
inc flag
call print
add bx,28 ;next line
cmp bx,endaddr
jbe d ;keep looking
jmp dexit
jnz d
dexit:
ret
name_search endp
print proc near
sub flag,0
jz no
p10:
mov ah,09
lea dx,mess7
int 21h
mov cx,28
mov si,searchaddr
lea di,savenp
rep movsb
lea dx,savenp
mov ah,09
int 21h
jmp fexit
no: lea dx,mess5
mov ah,09
int 21h
fexit:
ret
print endp
codesg ends
end main
汇编实验 电话本
猜你喜欢
转载自blog.csdn.net/dsfsdfrtjj/article/details/114649265
今日推荐
周排行