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

📄 ppp.asm

📁 建立歌曲文档
💻 ASM
字号:
;输出字符串的宏定义
strings	macro		op1
		push		dx
		push		ax
		lea		dx,op1
		mov		ah,09h
		int		21h
		pop		dx
		pop		ax
endm
;*******************************************************************
;参数乘以20的宏 
times		macro		op2
		mov		cl,50
		mov		al,op2
		mul		cl
endm

;**********************************************************************************
;堆栈段定义

stack segment para stack 'stack'
        dw 128 dup(?)
stack ends
;**************************************************************

;数据段定义
data segment para 'data'
namepath	db 	'd:\music.txt',00

nhandle	dw	?


inputname	label	byte
namelen	db	?
iname		db	10 dup(?)
song		db	38 dup(?),13d,10d

allname	label	 byte
namesum	db	?
names		db	500  dup(' ')

ppp		db	'$'

fno		db	?
fname		db	10 dup(?)
exist		db	' '

intro		db    '*********************************************************'

		db	13d,10d,'*********************************************************'
		db	13d,10d,'                   *      1.insert       *'
		db	13d,10d,'                   *	  2.search       *'
		db	13d,10d,'	           *      3.infomation   *                    '
	      db	13d,10d,'	           *      4.quit	 *                    '
		db	13d,10d,'*********************************************************$'
sel		db	13d,10d,'** select:$'

sw		db	13d,10d,'** The select is out of range!**$'

tip		db	13d,10d,'*********************************************************'
		db	13d,10d,'*                 INSERT UNIT                           *'
		db	13d,10d,'********************************************************$'

tip1		db	13d,10d,'The name of Singer and Songs(xx-xx):$'
tip2		db	13d,10d,'Please input the Name of Singer:$'
tip4		db	13d,10d,'ReadFile Error!!$'
tip3		db	13d,10d,'CreatFile Error!!$'
tip5		db	13d,10d,'WriteFile Error!!$'
tip6        db	13d,10d,'OpenFile Error!!$'
tip7		db	13d,10d,'Sorry,Cannot find!$'
tip8		db	13d,10d,'----------All Singers And Their Songs---------'
tip9		db	13d,10d,'SINGER && SONGS'
		db	13d,10d,'$'
tip10		db	13d,10d,'----------   The Search Result  ---------------$'
data ends
;**************************************************************
code segment 
    assume cs:code,ds:data,ss:stack
main  	proc		far
start:      mov 		ax,data					;//传送数据段
            mov 		ds,ax
 		
			
            call		open						;//打开歌曲文件
		call		read						;//读入缓冲区
		call		select					;//功能选择
		ret
main		endp

;*****************************************************************
;	THE MENU		输出菜单

introduce  	proc		near
		strings	intro
		ret		
introduce	endp


;******************************************************************
;To present a space	输出一个空格

space  	proc		 near
		mov		dl,0dh
		mov 		ah,02
		int		21h
		mov		dl,0ah
		mov		ah,02
		int		21h
		ret
space 	endp
;****************************************************************
;TO input a stop		输出一个无回显

stop     	proc		near
		mov		ah,07h
		int		21h
		ret
stop		endp

;***************************************************************
;Select a  function  选择功能
select	proc		near

menu:       
            call		space
		call		introduce
choose:     
 		strings	sel
            mov		ah,01h
		int		21h
		cmp		al,30h
		jb		again						;//输入不合法
		
		cmp		al,34h				
		ja		again						;//输入不合法
		jz		exit						;//退出
		
		cmp		al,31h
		jnz		a
		call		insert					;//插入
		jmp		menu
		
a:		cmp		al,32h					;//查找
		jnz		u
		call		search
		jmp		menu
	
u:		cmp		al,33h					;//输出全部信息
		jnz		all
		call		allinform
		
all:		jmp		menu	

again:      
 		strings	sw
		jmp		choose					;//不合法处理
		
exit:		
		call		creat
		call		write
		ret

select	endp           
		


;***************************************************************
;  输出所有信息
allinform	proc		near
		call		space
		strings	tip8
		call		space
		mov		bl,[allname]
		times		bl
		mov		cx,ax
		mov		si,0
lop13:      mov		dl,names[si]
		mov		ah,02
		int		21h
		inc		si	













		loop		lop13
		ret

allinform	endp

;***************************************************************
;	Insert  information to file

insert	proc		near
		
		call		space
		strings	tip
		call		space
		strings	tip1		                 	 	;//输出提示输入信息的提示:
		call		inputm				 	;//输入信息
		call		compare
		ret
insert      endp

;***************************************************************
inputm	proc		near
		push		si
	
		mov		si,1
		mov		dx,10
a2:		mov		ah,01h
		int		21h
		cmp		al,0dh
 		jz		w
		cmp		al,2dh
		jz		x
		mov		inputname[si],al
		inc		si
		jmp		a2
		

x:	      cmp		si,dx
		ja		a3
		mov		inputname[si],20h	
		inc		si
		jmp		x			
a3:		
		add		dx,10
		jmp		a2
				
w:		cmp		si,49
		jz		jieshu
		mov		inputname[si],20h
		inc		si
		jmp		w
		
		
jieshu:    
		pop		si
		ret
inputm	endp	


;*******************************************************************
search	proc		near
	      call		space
		strings	tip2
		mov		si,0
s:		mov		ah,01h
		int		21h
		cmp		al,13d
		jz		sea
		mov		fname[si],al
		inc		si
		jmp		s						;//输入查找的歌手名,以space结束
sea:	
		mov		cx,si
	      mov		[fno],cl
		
		mov		al,[namesum]
		cmp		al,0						;//文档为空时,找不到
		jz		cannotfind
		dec		al
c:		mov		bl,al					
		mov		ah,0
		mov		cl,50
		mul		cl
		mov		si,ax						;//文档缓冲区的偏移量
		
		mov		cl,[fno]
		xor		ch,ch
		lea		di,fname					;//字符串的偏移地址给DI
		
lop6:		mov		al,names[si]				;//字符串进行比较
		mov		dl,[di]
		cmp		dl,al
		jnz		still						;//不匹配
		inc		si
		inc		di
		loop		lop6
		jmp		canfind					;//匹配
still:
		mov		al,bl
		dec		al
		jl		cannotfind					;//全部不匹配
		jmp		c						;//进行下一次匹配

cannotfind: 
		mov		dl,[exist]
		cmp		dl,0
		jnz		b	
		strings	tip7						;//输出查找失败信息
		jmp		b	
		
		
canfind:	
		mov		dl,[exist]
		cmp		dl,0
		jnz		v
		call		space
		mov		dl,1
		mov		[exist],dl

v:		mov		bh,bl							;//找到
		times		bl
		mov		si,ax
		mov		cx,50
		call		space
		call		space
		strings	tip10
		strings	tip9
n:		
		mov		dl,names[si]				;//输出找到信息
		mov		ah,02
		int		21h
		inc		si
		loop		n
		mov		al,bh
		dec		al
		jmp		c
		
b:		mov		dl,0
		mov		[exist],0
		ret
search	endp					
	


;**************************************************************

;比较字符串
compare	proc		near
		
		mov		al,[namesum]
		cmp		al,0
		jz		firstin
		jmp		k						;//文档为空时头插

firstin:	
		mov		cx,50
		lea		di,names
		lea		si,iname						
lop4:		mov		al,[si]
		mov		[di],al
		inc		si			
		inc		di
		loop		lop4
		jmp		j						;//头插



k:		dec		al
		
		mov		bl,al
		mov		ah,0
		mov		cl,50
		mul		cl
		mov		si,ax						;//找文档缓冲区的偏移量
		
		mov		cl,[inputname]
		xor		ch,ch
		lea		di,iname					;//插入歌手的偏移量给DI
		
lop:		mov		al,names[si]
		mov		dl,[di]
		cmp		dl,al						;//比较
		jnz		notequal					;//不等
		inc		si
		inc		di
		loop		lop
		jmp		sert						;//相等则插入
notequal:
		jae		sert
		
		mov		dl,bl						;//比较小于的时候,后移一个名字的为数并继续下一次的比较
		inc		bl
		times		dl
		lea		si,names
		add		si,ax
		times		bl	
		lea		di,names
		add		di,ax					

		mov		bl,dl
		mov		cx,50

shift:	mov		al,[si]
		mov		[di],al
		inc		si                          
		inc		di
		loop		shift						;//文档缓冲区向后移位


g:		dec		bl
		cmp		bl,0
		jl 		firstin					;//匹配到第一个时头插
		times		bl
		mov		si,ax
		lea		di,iname
		mov		cl,[inputname]
		xor		ch,ch
		jmp		lop
sert:										;//大于或等于的时候插入
		times		bl
		add		ax,50
		mov		cx,50
		lea		si,names
		add		si,ax
		lea		di,iname
lop1:		mov		al,[di]
		mov		[si],al
		inc		si
		inc		di
		loop		lop1	
			


j:		add		[namesum],1					;//文档信息数目计数加一 
		
		ret
compare	endp
		
;*************************************************************
;建立文件
creat		proc		near
		mov		ah,3ch
		mov		cx,00
		lea		dx,namepath
		int		21h
		mov		nhandle,ax
		jc		went
            jmp		l

went:		strings	tip3
l:	      ret
creat		endp		
		


;*************************************************************

;Open File   		为读写打开文件
open		proc		near	
		mov		ah,3dh
		mov		al,02
		lea		dx,namepath
		int		21h

		jc		ow

		mov		nhandle,ax
		jmp		p
ow:			
		call		creat	
	      mov		ah,3dh
		mov		al,02
		lea		dx,namepath
		int		21h
		mov		nhandle,ax
p:
		ret
open		endp
;******************************************************************

;READ PART			读文件到缓冲区
read		proc		near
		mov		ah,3fh
		mov		bx,nhandle
		mov		cx,501
		lea		dx,allname	
		int		21h
		jc		rerror
		jmp		to
rerror:
		strings	tip4
to:	
		ret
read		endp


;****************************************************************
;WRITE INTO  FILE		写文件到缓冲区
write 	proc  	near
		
		mov		ah,40h
		mov		bx,nhandle
		mov		cx,501
		lea		dx,allname
		int		21h
		jc		werror
		
  		mov		ah,3eh
		mov		bx,nhandle
		int		21h
		jmp		good

werror:	strings	tip5

good:		ret
write		endp		
;****************************************************************

code		ends
		end		start



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -