1.题目:查找电话号码phone
2.实验要求:
(1)要求程序建立一个可存放50项的电话号码表,每项包括人名(20个字符)以及电话号码(8个字符)两部分。
(2)程序接收输入的电话号码和名字,并把他们存放在电话号码表。
(3)根据用户输入的名字查找对应的电话号码并显示出来。
程序运行结果
实验代码
assume cs:code, ds:data
data segment
displayNameTip db 'Input name:$' ;提示输入名字
displayTelephoneTip db 'Input a telephone number:$';提示输入电话号码
nameAndPhone db 33 dup(' '),'$' ;数据的数据
phoneTable db 1500 dup(' ') ;电话表
count db 0 ;当前电话表中存在数据的个数
result db 'name tel.$'
enter db 0ah, 0dh,'$' ;回车换行
IncreasePhone db 'Do you want to add a phone book?[y/n]$'
displayQueryTip db 'Do you need to query a phone number?[y/n]$'
displayNotFindTip db 'Not found this name!$'
data ends
code segment
main proc far
start:
push ds
sub ax, ax
push ax
mov ax, data
mov ds, ax
mov es, ax
mov cx, 2
mov ax, 0 ;电话计数
;循环建立电话簿
keep:
lea dx, IncreasePhone
call show
call memsetInputArray
call inputChar
cmp al, 'n'
je sortName
lea dx, enter
call show
;输入名字
lea dx, displayNameTip
call show
lea dx, nameAndPhone
call inputFunction
lea dx, enter
call show
;输入电话号码
lea dx, displayTelephoneTip
call show
lea dx, nameAndPhone+22
call inputFunction
lea dx, enter
call show
call clearThe_0D
call saveNameAndPhone
mov cx, 2
loop keep
;电话表排序
sortName:
call name_sort
;查询
lea dx, enter
call show
query:
mov cx, 2
lea dx, displayQueryTip
call show
call inputChar
cmp al, 'n'
je exit
lea dx, enter
call show
lea dx, displayNameTip
call show
lea dx, nameAndPhone
call inputFunction
lea dx, enter
call show
call clearThe_0D
call queryByName
cmp al, 1h
jne notFound
jmp Founded
Founded:
mov ax, dx
lea dx, result
call show
lea dx, enter
call show
mov dx, ax
call show
jmp nextQuery
notFound:
lea dx, displayNotFindTip
call show
nextQuery:
lea dx, enter
call show
loop query
exit:
ret
main endp
queryByName proc near ;通过名字查找电话号码,如果查到,将al值的是1,地址保存在dx中
push si
push di
push cx
push bx
mov al, count
cbw
mov bx, ax ;总的号码个数
lea si, nameAndPhone+1
mov al, [si]
cbw
mov ax, 20
lea si, nameAndPhone+2
lea di, phoneTable
f6:
push di
mov cx, ax ;名字的长度
cld
repe cmpsb
pop di
je hasFound
dec bx
add di, 30
lea si, nameAndPhone+2
cmp bx, 0
jne f6
pop bx
pop cx
pop di
pop si
mov al, 0
ret
hasFound:
mov dx, di
pop bx
pop cx
pop di
pop si
mov al, 1h
ret
queryByName endp
clearThe_0D proc near ;输入结束后末尾会加上0Dh,清理掉输入中的换行符
push si
push cx
push ax
mov cx, 34
lea si, nameAndPhone
f5:
mov al, [si]
cmp al,0dh
je replace
jmp next
replace:
mov byte ptr [si], ' '
next:
inc si
loop f5
pop ax
pop cx
pop si
ret
clearThe_0D endp
memsetInputArray proc near ;输入暂存数组清理
push si
push cx
lea si, nameAndPhone
mov cx, 32
f4:
mov [si], ' '
inc si
loop f4
pop cx
pop si
ret
memsetInputArray endp
name_sort proc near ;名字排序
push ax
push cx
push si
push di
push dx
mov al, count
mov ah, 0h
mov cx, ax
cmp cx, 1
je exit1
cmp cx, 0
je exit1
dec cx
lea si, phoneTable
f1:
mov dx, cx
mov di, si
f2:
add di, 30
push cx
push di
push si
cld
mov cx, 20
repe cmpsb
pop si
pop di
pop cx
jna f2end
call swapString
f2end:
loop f2
mov cx, dx
add si, 30
loop f1
exit1:
pop dx
pop di
pop si
pop cx
pop ax
ret
name_sort endp
swapString proc near ;冒泡排序交换30个字符
push ax
push bx
push cx
push si
push di
mov cx, 30
f3:
mov al, [si]
mov bl, [di]
mov byte ptr [si], bl
mov byte ptr [di], al
inc di
inc si
loop f3
pop di
pop si
pop cx
pop bx
pop ax
ret
swapString endp
show proc near ;显示提示符
push ax
cld
mov ah, 09h
int 21h
pop ax
ret
show endp
saveNameAndPhone proc near ;将输入数据保存在电话表中
push ax
push bx
push cx
push si
push di
mov ah, 0
mov al, count
mov bl, 30
mul bl
;名字
mov bx, ax
lea si, nameAndPhone+2
lea di, phoneTable[bx]
mov cx, 20
cld
rep movsb
;电话号码
lea si, nameAndPhone+24
lea di, phoneTable[bx+20]
mov cx, 8
cld
rep movsb
mov [di], '$'
;计数器+1
mov al, count
inc al
mov count, al
pop di
pop si
pop cx
pop bx
pop ax
ret
saveNameAndPhone endp
inputFunction proc near ;输入数据
push ax
mov ah, 0ah
int 21h
pop ax
ret
inputFunction endp
inputChar proc near ;单个字符
mov ah, 01h
int 21h
ret
inputChar endp
code ends
end start