⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.asm

📁 汇编实验:电话本管理程序。具有输入
💻 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 + -