📄 1.asm
字号:
extrn decibin:far,binidec:far
kongge macro ;宏定义,空格,换行
push dx
push ax
mov ah,2
mov dl,13
int 21h
mov ah,2
mov dl,10
int 21h
pop ax
pop dx
endm
string macro xp ;输出提示字符串
push dx
push ax
mov ah,9
lea dx,str&xp
int 21h
pop ax
pop dx
endm
tab macro x ;输出TAB键,用于空格
local cycle
push cx
push dx
mov cx,x
mov dl,' '
cycle:
mov ah,2
int 21h
loop cycle
pop dx
pop cx
endm
tishi macro ;输出主函数显示界面
kongge
string 0
kongge
kongge
string 1
string 2
string 3
string 4
string 5
kongge
endm
data segment common ;定义公共数据段
data2 db 5 dup(?) ;用于二进制转十进制
sd1 label byte ;开辟nam缓冲区,保存每次输入的名字
max1 db 21
act1 db ?
nam db 21 dup(0)
sd2 label byte ;开辟num缓冲区,保存每次输入的号码
max2 db 9
act2 db ?
num db 9 dup(0)
geshu dw 2 ;记录电话个数
case dw 30 ;每个人的空间为30B,相当于比例因子
xp dw ? ;在ChaZhao函数里,用于中间变量,存储cx的值
biaozhi dw 0 ;在ChaZhao函数里,可用于查找同名电话的标志位。0表示没有同名,1表示有同名
array db 'zhou','$',' ','82312446','$','wang','$',' ','82312446','$',1440 dup(0) ;开辟50个电话存储空间
str0 db 'Pleaes choose(1-4):','$'
str1 db '1:ChaRu ','$'
str2 db '2:ShanChu ','$'
str3 db '3:PaiXu ','$'
str4 db '4:ChaZhao ','$'
str5 db '0:Exit','$'
str6 db 'Error choose,please choose again:','$'
str11 db 'Please input the name(0 to exit):','$'
str12 db 'Please input the number:','$'
str21 db 'Please input the index number(0 to exit):','$'
str22 db 'Error.chaochu','$'
str31 db '***********************************************','$'
str32 db 'No','$'
str33 db ' ','$'
str34 db '.','$'
str41 db 'Please input the name you want to search(0 to exit):','$'
str42 db 9,'Name',9,9,9,'Num','$'
str43 db 'No,match','$'
data ends
zhm segment ;堆栈段
dw 100 dup(0)
zhm ends
extra segment ;附加段
mess db 21 dup(?)
extra ends
;****************************
code segment
assume cs:code,ds:data,ss:zhm,es:extra
main proc
start:
mov ax,data
mov ds,ax
mov ax,zhm
mov ss,ax
mov ax,extra
mov es,ax
lop:
kongge
tishi ;输出主函数显示界面
mov ah,1
int 21h
kongge
cmp al,30h
jl Wrong ;输入非0-4的字符,跳转到Wrong,提示输出错误
cmp al,34h
jg Wrong
cmp al,31h
jz ChaRu ;选择1,跳转到ChaRu子函数
cmp al,32h
jz ShanChu ;选择2,跳转到ShanChu子函数
cmp al,33h
jz PaiXu ;选择3,跳转到PaiXu子函数
cmp al,34h
jz ChaZhao ;选择4,跳转到ChaZhao子函数
cmp al,30h
jz Exit ;选择0,退出主函数
Wrong: ;提示输出错误
kongge
string 6
kongge
jmp lop
;-------------------------------------------------------------------------------------------------------------------------
ChaRu: ;插入电话程序
kongge
string 11
lea dx,sd1 ;输入人名到缓冲区nam
mov ah,0ah
int 21h
cmp act1,1 ;判断是否只是0,是0跳转到lop主选择区
jnz next11
cmp nam,30h
jz lop
next11:
mov bl,act1
sub bh,bh
mov nam[bx],'$' ;将输入nam缓冲区的实际字符串末尾加$
mov cx,bx ;字符传送次数
inc cx
mov ax,geshu
mul case ;乘比例因子case,定位到第geshu个人的存储地址
mov si,ax
sub bx,bx
next12: ;将缓冲区的字符传送到指定的第geshu个人的存储空间
mov dl,nam[bx]
mov array[si+bx],dl
inc bx
loop next12
kongge
string 12
lea dx,sd2 ;输入电话号码到缓冲区num
mov ah,0ah
int 21h
mov bl,act2
sub bh,bh
mov num[bx],'$' ;将输入num缓冲区的实际字符串末尾加$
mov cx,bx ;字符传送次数
inc cx
sub bx,bx
mov ax,geshu
mul case ;乘比例因子case,定位到第geshu个人的存储地址
mov si,ax
add si,21
next13: ;将缓冲区的字符传送到指定的第geshu个人的存储空间
mov dl,num[bx]
mov array[si+bx],dl
inc bx
loop next13
inc geshu
kongge
jmp ChaRu
;-------------------------------------------------------------------------------------------------------------------------------------
ShanChu:
call pai_xu
kongge
kongge
next21:
string 21
call far ptr decibin
kongge
cmp bx,0
jz lop
cmp bx,geshu
jle next22
kongge
string 22
kongge
kongge
jmp next21
next22:
cmp bx,geshu
jz next26
mov cx,geshu
sub cx,bx
mov xp,cx ;循环次数
mov di,bx
next23:
mov ax,di
mul case ;乘比例因子case,定位到第geshu个人的存储地址
mov si,ax
sub bx,bx
mov cx,30
next24:
mov dl,array[si+bx]
mov ax,si
sub si,30
mov array[si+bx],dl
mov si,ax
inc bx
loop next24
inc di
dec xp
cmp xp,0
jnz next23
next26:
dec geshu
jmp ShanChu
;----------------------------------------------------------------------------------------------------------------
PaiXu:
call pai_xu
jmp lop
ChaZhao:
cmp geshu,0
jnz next40
kongge
string 32
jmp lop
next40:
kongge
string 41
lea dx,sd1 ;输入人名到缓冲区nam
mov ah,0ah
int 21h
cmp act1,1 ;判断是否只是0,是0跳转到lop主选择区
jnz next41
cmp nam,30h
jz lop
next41:
mov bl,act1
sub bh,bh
mov nam[bx],'$' ;将输入nam缓冲区的实际字符串末尾加$
mov cx,bx
inc cx ;字符串比较次数
mov xp,cx
sub di,di ;从第一个人开始比较,di用于记录到第几人
next42:
mov cx,xp
mov ax,di
mul case ;乘比例因子case,定位到第ax个人的存储地址
mov si,ax
sub bx,bx
next43:
mov dl,nam[bx] ;将缓冲区的字符与指定的第ax个人的字符比较
cmp array[si+bx],dl
jnz next45 ;不匹配,跳转到下个人比较
inc bx
loop next43 ;执行到下面,查找匹配,打印出来
cmp biaozhi,1 ;标志,是否有同名的电话记录。1表示有同名
jz next44
kongge
kongge
string 42
kongge
string 31
next44:
kongge
tab 1 ;TAB键,使人名与电话号码隔开
lea dx,array[si]
mov ah,9
int 21h
tab 3 ;TAB键,使人名与电话号码隔开
add si,21 ;输出对应的的电话号码
lea dx,array[si]
mov ah,9
int 21h
mov biaozhi,1 ;使标志置1,以便判断是否有同名
next45:
inc di
cmp di,geshu
jnz next42
cmp biaozhi,1 ;标志,是否有同名的电话记录
jz next46
kongge
kongge
mov xp,1 ;充当标志,用于美观,没什么其他作用
string 43 ;输出No,match,没有可匹配的名字
next46:
cmp xp,1
jz next47
kongge
string 31
next47:
and biaozhi,0 ;使标志清零
kongge
jmp ChaZhao
Exit:
mov ah,4ch
int 21h
main endp
;*********************************************************************************************
pai_xu proc
cmp geshu,1 ;当geshu为1时,不需要排序,直接输出就行
jz next36
cmp geshu,0 ;当geshu为0时,即电话本里没有数据,转到主界面
jnz next30
kongge
string 32
jmp lop
next30:
mov cx,geshu
dec cx ;外循环,外层比较趟数
mov xp,cx
sub di,di ;是di为0,从第一个人开始比较
next31:
mov ax,di
mul case ;乘比例因子case,定位到第di个人的存储地址
mov si,ax
sub bx,bx
mov cx,20 ;比较名字字符的次数
next32:
mov dl,array[si+bx]
cmp dl,array[si+bx][30] ;小于,不需改变位置,进行下一轮比较
jl next35
cmp dl,array[si+bx][30] ;相等,继续比较
je next34
mov cx,30
sub bx,bx
next33: ;大于,互相交换内容
mov dl,array[si+bx]
xchg dl,array[si+bx][30]
mov array[si+bx],dl
inc bx
loop next33
jmp next35
next34:
inc bx
loop next32
next35:
inc di
cmp di,xp ;比较趟数与di,当相等时,表明此趟比较完毕,进行下次比较
jl next31
dec xp
sub di,di ;进行新一趟比较,将di清零,不然就会出错。就因为这个语句,额外花了我半天的时间
cmp xp,0
jnz next31
;输出排好序的人名和电话号码
string 42
kongge
next36:
string 31
kongge
mov cx,geshu
mov bx,1
sub di,di ;将di清0,表示从电话表第一个开始,输出他们的名字
next37:
string 33
call far ptr binidec
string 34
tab 1
mov ax,di
mul case
mov si,ax
lea dx,array[si]
mov ah,9
int 21h
push cx
mov cx,3
next38: ;TAB键,使人名与电话号码隔开
mov dl,' '
mov ah,2
int 21h
loop next38
pop cx
add si,21 ;输出对应的的电话号码
lea dx,array[si]
mov ah,9
int 21h
inc di
kongge
inc bx
loop next37
string 31
ret
pai_xu endp
;******************************************************************************************
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -