📄 0000.asm
字号:
stack segment stack
dw 100 dup(?)
stack ends
data segment
title1 db "Happy Birthday$"
frequency dw 196,196,220,196,262,247
dw 196,196,220,196,294,262
dw 196,196,392,330,262,247,220
dw 349,349,330,262,294,262,0
time dw 25,25,50,50,50,100
dw 25,25,50,50,50,100
dw 25,25,50,50,50,50,150
dw 25,25,50,50,50,100
data ends
code segment
start proc far
assume cs:code,ds:data
push ds
mov ax,0
push ax
mov ax,data
mov ds,ax
LEA DX,title1
mov ah,06h
int 10h
MOV DX,63H
MOV AL,10000010B
OUT DX,AL
;mov ah,06H
;mov dx,offset title1
;int 10h
mov si,offset frequency
mov bp,offset time
read:
MOV DX,61H
in al,DX
and al,00000001B
jz read
call sing
ret
start endp
sing proc
push di
push si
push bp
push bx
again:
;mov si,offset frequency
;mov bp,offset time
mov di,[si]
cmp di,0
je end_sing
mov bx,ds:[bp]
;read:
;in al,61h
;and al,1H
;jz read
call sound
add si,2
add bp,2
a:
mov dx,61h
in al,dx
add al,00000001b
jz a
jmp again
end_sing:
pop bx
pop bp
pop si
pop di
ret
sing endp
sound proc
push ax
push bx
push cx
push dx
push di
MOV DX,43H
mov al,0b6h ;8253初始化 2#通道方式3
out DX,al
;mov al,10000010b ;8255初始化 端口B工作在方式0 作开始、暂停的输入
;out 63h,al
mov dx,12h ;计算时间常数
mov ax,34dch
div di
out 42h,al ;设置时间常数 并将记数值输入到2#通道
mov al,ah
out 42h,al
;MOV DX,61H
;in al,DX ;PB1口为暂停键
;and al,00000001B
;jz read
delay:
mov cx,2801 ;延时;dl10ms:loop dl10ms ;实现发音的单位时间10ms
dec bx
jnz delay
pop di
pop dx
pop cx
pop bx
pop ax
ret
sound endp
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -