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

📄 test.asm

📁 用汇编语言实现的
💻 ASM
字号:

stack	segment	para	'data'
	db	64	dup('stack...')
stack	ends
;-----------------设置频率和时间--------------------

dseg	segment	para	'data'
mus_freq  dw 196,196,262,196    	;1,2
	  dw 330,262,392,440    	;3,4
	  dw 392,392,392,523,523	;5,6
	  dw 440,392,349,440,392	;7,8
	  dw 392,392,392,440,440        ;1,2
	  dw 294,294,294,392,349	;3,4
	  dw 330,196,196,392,392,440	;5,6
	  dw 392,349,330,294,262	;7,8
	  dw 262,392,392,523,523	;1,2
	  dw 440,440,392,349,392	;3,4
	  dw 440,294,294,392,392,440	;5,6
	  dw 494,392,440,494,523,523
	  dw -1	
mus_time  dw 37,13,50,50        	;1,2
	  dw 50,50,75,25		;3,4
	  dw 50,37,13,50,50   		;5,6
	  dw 37,13,25,25,100		;7,8
	  dw 50,37,13,50,50		;1,2
	  dw 50,37,13,75,25		;3,4
	  dw 50,37,13,50,25,25		;5,6	  
	  dw 25,25,25,25,100		;7,8
	  dw 50,37,13,50,50		;1,2
	  dw 50,37,13,75,25		;3,4
	  dw 50,37,13,50,23,23		;5,6
	  dw 25,25,25,25,100,100
dseg	ends
;---------------------------------------
cseg	segment	para	'code'
	assume	cs : cseg, ss : stack, ds : dseg
music	proc	far
	push	ds
	sub	ax, ax
	push	ax
	mov	ax, dseg
	mov	ds, ax
	lea	si, mus_freq           ;取去频率表首址
	lea	bp, ds : mus_time      ;取时间表首址
freq:   mov   al,30h 
        mov   ah,1
        int   16h
        cmp   al,20h
        jz    pau
        jmp   npau
pau:    mov   ah,1
        int   21h
        cmp   al,0dh
        jnz   pau
        jz    npau
npau:   mov     di,[si]
        cmp	di, -1
	je	end_mus
	mov	bx, ds : [bp]
	sal	bx, 1                ;预定义的32倍
	sal	bx, 1
	sal	bx, 1
	sal	bx, 1
	sal	bx, 1
	sal	bx, 1
	call	gensound
	add	si, 2
	add	bp, 2
	jmp	freq
end_mus:
	ret
music	endp

;------------------发生函数------------------------------
gensound proc near
	push ax
	push bx
	push cx
	push dx
	push di
;---------------------------------------------
	mov	al , 0b6h
	out	43h , al        ;初始化8253A
;--------------------------------------------

	mov	dx , 12h         ;时间被除数
	mov	ax , 533h*896
	div	di
	out	42h , al        ;写时间常数底字节
	mov	al , ah
	out	42h , al         ;写时间常数高字节
	in	al , 61h         ;取当前端口设置
	mov	ah , al          ;保存AL
	or	al , 3            ;接通扬声器
	out	61h , al
;--------------------------------------------
wait1:	mov	cx , 35000        ;延时
delay:	loop	delay
	dec	bx
	jnz	wait1
;--------------------------------------------
	mov	al , ah           ;恢复原端口设置
	out	61h , al
;------------------------------------------------
	pop	di
	pop	dx
	pop	cx
	pop	bx
	pop	ax
	ret
gensound	endp
cseg	ends
	

;----------------------------------------
	end	music

⌨️ 快捷键说明

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