📄 00.asm
字号:
stack segment stack
dw 100 dup(?)
stack ends
data segment
title1 db "Happy Birthday to you! ",0dh
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 50,50,100,100,100,200
dw 50,50,100,100,100,200
dw 50,50,100,100,100,100,300
dw 50,50,100,100,100,200
close dw -4
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 bx,title1
mov ah,06h
int 10h
MOV DX,63H
MOV AL,10000010B
OUT DX,AL
mov dx,43h
mov al,0b6h
out dx,al
read:
mov si,offset close
mov bp,offset time
mov di,[si]
cmp di,0
je restart
mov bx,ds:[bp]
call sound
MOV DX,61H
in al,DX
and al,00000001B
jz read
restart:
mov si,offset frequency
mov bp,offset time
call sing
ret
start endp
sing proc
push di
push si
push bp
push bx
again:
mov di,[si]
cmp di,0
je restart
mov bx,ds:[bp]
call sound
mov ah,06h
lea bx,title1
int 10h
mov dx,61h
in al,dx
and al,00000001b
jz read
add si,2
add bp,2
jmp again
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,12h ;计算时间常数
mov ax,34dch
div di
out 42h,al ;设置时间常数 并将记数值输入到2#通道
mov al,ah
out 42h,al
delay:
mov cx,1400
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 + -