📄 dianhuaxitong.asm
字号:
datarea segment
tel_tab db 50 dup( 28 dup(?)) ;人名和电话号码存储区
maxnlen db 20 ;人名最大长度
maxnumblen db 8 ;号码最大长度
namesav db 20 dup(?),13,10,'$' ;姓名缓冲区
numbersav db 8 dup(?),13,10,'$' ;电话号码缓冲区
peopleinfor db 28 dup(?),13,10,'$' ;姓名与电话号码缓冲区
endaddr dw 0 ;存储截止地址
count1 db 0 ;存入的号码个数
namelen dw ? ;计入名字的长度
numberlen dw ? ;计入号码的长度
count2 db ? ;冒泡排序循环次数
namesearch db 20 dup(?),'$' ;输入查找名字缓冲区
sisave dw 0 ;保存si寄存器
mess1 db 'input a name: $'
mess2 db 'input a phone number: $'
mess3 db 'name number$'
mess5 db 'Not this phone$'
mess6 db 'input you name: $'
mess7 db 'Not save$'
mess8 db 'selete error $'
mess10 db 'search again(y/n)? $'
mess9 db 'please select 0-3: $'
mess11 db ' 1.create your name_tab $'
mess12 db ' 2.sort your name_tab $'
mess13 db ' 3.search telephone number $'
mess14 db ' 0.exit $'
datarea ends
;-----------------------------------------------------------
program segment
main proc far
assume cs:program,ds:datarea,es:datarea
start:
push ds
sub ax,ax
push ax
mov ax,datarea
mov ds,ax
mov ax,datarea
mov es,ax
cld ;df=0
g11:
call crlf
lea dx,mess9
mov ah,09
int 21h ;显示信息'please select 0-3: '
;
call crlf
lea dx,mess11
mov ah,09
int 21h ;显示信息'1.create your name_tab '
;
call crlf
lea dx,mess12
mov ah,09
int 21h ;显示信息'2.sort your name_tab '
;
call crlf
lea dx,mess13
mov ah,09
int 21h ;显示信息'3.search telephone number '
;
call crlf
lea dx,mess14
mov ah,09
int 21h ;显示信息'0.exit '
call crlf
mov ah,1
int 21h
cmp al,31h
jne tt1
jmp call1 ;输入为1时调用input_name子程序
tt1:
cmp al,32h
jne tt2
cmp count1,0 ;判断tel_tal是否为空
je tt3
jmp call2 ;输入为2且tel_tal不为空时调用 name_sort 和 printline 子程序
tt2:
cmp al,33h
jne tt5
cmp count1,0
je tt3
call call3 ;输入为3且tel_tal不为空时调用 name_search 子程序
tt3: lea dx,mess7
mov ah,09
int 21h ;当tel_tal为空时显示信息 'You hava not create your name_tab '
jmp g11
tt5:
cmp al,30h
jne tt6
call exit0 ;输入为0时退出系统
tt6:
lea dx,mess8
mov ah,09
int 21h ;当输入不在0-3范围时,显示信息'your selection is error '
jmp g11
call1:
call input_name
jmp g11
call2:
call name_sort
call printline
jmp g11
call3:
call name_search
lea dx,mess10
mov ah,09
int 21h ;查找完后提示是否还要查找 'search again(y/n)? '
mov ah,1
int 21h
cmp al ,'y' ;输入为y继续查找,否则退出查找项,返回主菜单项
call crlf
je call3
jmp g11
exit0:
ret
main endp
input_name proc near ;子程序(输入名字)
mov si,endaddr ;si始终指向tel_tal中最后信息下一个地址
enter:
call crlf ;回车、换行
lea dx,mess1
mov ah,09
int 21h ;显示信息'input_name: '
mov namelen,0 ;名字长度初始化为0
loop1:
mov ah,1
int 21h ;输入名字字符
cmp al,0dh
je exit1 ;判断输入是否为回车,是的话退出输入名字,否则输入字符存入tel_tab中,
cmp al,' '
je next
cmp al,0dh
je exit1
mov tel_tab[si],al
inc si
inc namelen ;记录名字长度
jmp loop1 ;跳转继续输入该名字字符状态
next:
mov bx,namelen
mov cx,20
sub cx,bx
b20:
mov tel_tab[si],20h
inc si
loop b20 ;输入的名字为20字节,不足的用空格补足
call inphone ;输入名字后,回车进入输入电话号码子程序
mov namelen,0
inc count1 ;记录人数
jmp enter
exit1:
mov endaddr,si ;跳转输入另一个名字状态
ret
input_name endp
inphone proc near ;子程序(输入号码)
mov numberlen,0 ;初始化号码长度为0
call crlf ; 回车、换行
lea dx,mess2
mov ah,09
int 21h ;显示信息'input a telephone number: '
loop2:
mov ah,1
int 21h ;输入号码字符
cmp al,' '
je exit2 ;输入为空格返回input_name子程序;否则输入号码字符存入tel_tal中
mov tel_tab[si],al
inc numberlen ;记录号码长度
inc si
jmp loop2 ;跳转继续输入该号码字符状态
exit2:
mov bx,numberlen
mov cx,8
sub cx,bx
b8:
mov tel_tab[si],20h
inc si
loop b8 ;输入的号码为8字节,不足的用空格补足
ret
inphone endp
name_sort proc near ;子程序(按名字排序)
mov sisave,si ;si内容保存入sisave
mov count2,0 ;初始化循环排序次数
g20:
lea si,tel_tab
g30:
mov di,si
add di,28
mov cx,20
mov ax,di
mov bx,si ;比较名字
repe cmpsb
jbe g40 ;前一个名字大于后一个名字,则调用xchg1子程序交换两人信息
call xchg1
g40:
mov si,ax ;前一个名字小于后一个名字,si和di指向下一个人
cmp si,endaddr
jb g30 ;si<endaddr继续排序,
inc count2 ;记录排序次数
mov al,count2
cmp al,count1
jbe g20
mov si,sisave
ret
name_sort endp
xchg1 proc near ;子程序(交换tel_tab中di,si所指表项的内容,前项保存在bx )
mov cx,14
lea di,peopleinfor
mov si,bx
rep movsw
mov cx,14
mov di,bx
rep movsw
mov cx,14
lea si,peopleinfor
rep movsw
ret
xchg1 endp
name_search proc near ;子程序(在表中顺序查找输入的名字 )
mov endaddr,si ;截止地址存入endaddr
mov namelen,0 ;名字长度初始化为0
mov di,0
call crlf
mov ah,09
lea dx,mess6 ;显示信息'please enter name : '
int 21h
g50:
mov ah,1
int 21h ;输入要查找的名字字符
cmp al,0dh ;若输入的为回车,结束输入名字字符,否则继续输入名字字符
je next1
mov namesearch[di],al
inc di
inc namelen ;记录要查找名字长度
jmp g50
next1:
mov bx,namelen
mov cx,20
sub cx,bx
loop3:
mov namesearch[di],20h ;输入的要查找名字长度为20字节,不足的用空格补足
inc di
loop loop3
lea si,tel_tab ; si指向tel_tal第一个人的首地址
loop4:
mov cx,20
lea di,namesearch ;di指向要查找名字的首地址
repe cmpsb
cmp cx,0
jne next4 ;判断查到否
call crlf
mov ah,09
lea dx,mess3
int 21h ;显示信息'name telephone '
call crlf
mov ah,09
lea dx,namesearch
int 21h ;显示要查找的人名
lea di,numbersav
mov cx,4
rep movsw
mov ah,09
lea dx,numbersav
int 21h ;显示相应该人的电话号码
jmp exit3
next4:
cmp si,endaddr ;判断si是否大于endaddr内容
jge next2 ;大于就跳转next2
add si,8
jmp loop4
next2:
call crlf
mov ah,09
lea dx,mess5
int 21h ;显示信息'not find! '
exit3:
ret
name_search endp
printline proc near ;子程序(显示tel_tal中的信息)
call crlf
mov ah,09
lea dx,mess3
int 21h ;显示信息 'name telephone '
lea si,tel_tab
k33:
lea di,peopleinfor
mov cx,14
rep movsw ;一个人信息暂存在peopleinfor中
mov ah,09
lea dx,peopleinfor
int 21h
cmp si,endaddr
jg exit4
loop k33
mov si,sisave
exit4:
ret
printline endp
crlf proc near ;子程序(回车换行)
mov dl,0ah
mov ah,02h
int 21h
mov dl,0dh
mov ah,02h
int 21h
ret
crlf endp
program ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -