查找电话号码

;查找电话号码
;建立一个可存放50项的电话号码表,每项包括人名(20个字符)及电话号码(8个字符)两部分
;程序可接收输入人名及相应的电话号码,并把它们加入电话号码表中
;凡有新的输入后,程序应按人名对电话号码表重新排序
;程序可接收需要查找电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上以如下格式显示出来。
;name tel.
;XXXX XXXXX
;编写程序如下
D_SEG SEGMENT
tel_tab DB 50 DUP (20 DUP(?),8 DUP(?)) ;电话号码,人名记录
tel_tabtemp DB 50 DUP (20 DUP(?),8 DUP(?)) ;转移实现电话号码,人名记录排序
STRINTRU DB 'Welcome to use!'
db 'you can continue to input your tel. NO. by input character I.',0dh,0ah
DB 'IF you want to find a NO. you can input character Y to do.',0dh,0ah
DB 'IF you want to exit ,please input character N.','$'
STRINPUT DB 0dh,0ah,'Input name:',0dh,0ah,'$'
STRINPHONE DB 'Input a telephone number:',0dh,0ah,'$'
STRYN DB 'Do you want a telephone number?(Y/N/I)','$'
STRNAME DB 0dh,0ah,'name?',0dh,0ah,'$'
STRPRINT DB 'name tel.',0dh,0ah,'$'
ACPNAME DB 21,?,21 DUP(?) ;接收人名
nth1 db 3 dup(?)
ACPTEL DB 9,?,9 DUP(?) ;接收电话号码
nth2 db 3 dup(?)
TEMP_TEL DB 0 ;临时存储TEL_TAB当前的偏移地址
TEMP_TELTEMP DB 0 ;临时存储TEL_TABTEMP当前的偏移地址
FINDNAME DB 20 DUP(?) ;要查找的人名
FINDTEL DB 8 DUP(?) ,0dh,0ah,'$' ;查找到的电话号码
D_SEG ENDS
;
PROG SEGMENT
ASSUME CS:PROG ,DS:D_SEG,ES:D_SEG
START:
MAIN PROC FAR
;
PUSH DS
XOR AX,AX
PUSH AX
;
MOV AX,D_SEG
MOV DS,AX
mov es,ax
;
;显示初始信息
LEA DX,STRINTRU
MOV Ah,09H
INT 21H
CALL input_name ;调用子程序INPUT_NAME接收人名
RET
MAIN ENDP
;***********************************
;接收人名子程序
input_name PROC NEAR
AGAIN:
;显示输入人名的提示信息
LEA DX,STRINPUT
MOV Ah,09H
INT 21H
;
;接收人名
LEA DX,ACPNAME
MOV Ah,0AH
INT 21H
;
SUB CH,CH ;清零
MOV CL,ACPNAME+1 ;实际字符数
LEA SI,ACPNAME+2 ;赋给人名字符首地址
;
SUB BH,BH
MOV Bx,OFFSET TEL_TAB
ADD Bx,word ptr TEMP_TEL
;
MOV DI,BX ;当前TEL_TAB中的人名首地址
REP MOVSB
;每输入一个名字,偏移地址往后移20
MOV AX,WORD PTR TEMP_TEL
ADD AX,20
MOV WORD PTR TEMP_TEL, AX
;显示输入电话号码的提示信息
LEA DX,STRINPHONE
MOV AH,09H
INT 21H
;接收电话号码
LEA DX,ACPTEL
MOV AH,0AH
INT 21H
;
SUB CH,CH
MOV CL,ACPTEL+1 ;实际字符数
lea SI,ACPTEL+2 ;接收的电话号码的首地址
;
SUB BH,BH
MOV BX,OFFSET TEL_TAB ;TEL_TAB的首地质
ADD BX,WORD PTR TEMP_TEL ;当前的偏移地址
;
MOV DI,BX ;目标串的首地址
REP MOVSB
;每输入一个电话号码,偏移地址往后移8
MOV AX,WORD PTR TEMP_TEL
ADD AX,8
MOV WORD PTR TEMP_TEL, AX
;
;调用NAME_SORT子程序对电话号码表按人名排序
;CALL STOR_NAME
FIND_AGAIN:
;显示提示是否查找信息
LEA DX,STRYN
MOV AH,09H
INT 21H
;
GET_KEY:
MOV AH,01H
INT 21H
CMP AL,'Y'
JE YES ;如果输入的是'Y',就跳转到YES
CMP AL,'N'
JE NO ;如果输入的是'N',就跳转到NO
CMP AL,'I' ;如果输入的是'I',就继续输入电话号码
JE AGAIN
JNE GET_KEY ;如果输入的都不是,等到输入了Y或者N为止
YES:
;调用查找程序
CALL NAME_SEARCH
JMP FIND_AGAIN ;继续查找下一个号码
;输出输入NAME信息
;LEA DX,STRNAME
;MOV AH,09H
;INT 21H
;调用INPUT_NAME子程序接收人名
;JMP AGAIN ;继续输入
NO:
RET
input_name ENDP
;************************************
;保存人名子程序
stor_name PROC NEAR

STOR_NAME ENDP
;************************************
;接收电话号码并保存电话号码子程序
INPHONE PROC NEAR
INPHONE ENDP
;***********************************
;电话号码表按人名排序子程序
NAME_SORT PROC NEAR
NAME_SORT ENDP
;***********************************
;电话号码查找子程序
NAME_SEARCH PROC NEAR
;输出输入NAME信息
MOV BX,0
LEA DX,STRNAME
MOV AH,09H
INT 21H
;接收人名
LEA DX,ACPNAME
MOV AH,0AH
INT 21H
;
SUB CH,CH ;清零
MOV CL,ACPNAME+1 ;实际字符数
LEA SI,ACPNAME+2 ;赋给人名字符首地址
;
LEA DI,FINDNAME
REP MOVSB
NEXT:
MOV CX,19
;---------------------------------
SUB AH,AH
MOV AX,OFFSET TEL_TAB
ADD AX,BX
;---------------------------------
LEA SI,FINDNAME
MOV dI,AX
CLD
REPZ CMPSB
JE a10
ADD BX,28
CMP BX,1400
JGE EXIT
JMP NEXT
a10:
MOV CX,8
ADD BX,20 ;当前找到人的电话号码的首地址
;--------------------------------
SUB AH,AH
MOV AX,OFFSET TEL_TAB
ADD AX,BX
;--------------------------------
LEA DI,FINDTEL
MOV SI,AX
REP MOVSB
;调用格式打印查找到的
CALL PRINTLINE
EXIT:
RET
NAME_SEARCH ENDP
;******************************
;显示人名及电话号码子程序
PRINTLINE PROC NEAR
;显示打印格式
LEA DX,STRPRINT
MOV AH,09H
INT 21H
;输出人名, 输出电话号码
LEA DX,FINDNAME
MOV AH,09H
INT 21H
ret
PRINTLINE ENDP
;******************************
PROG ENDS
END START
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值