📄 happy.asm
字号:
stack segment stack
dw 100 dup(?)
stack ends
data segment
bg db 0Ah,0DH
freq 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
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
dw 0
time dw 2 dup(500,500,1000,1000,1000,2000)
dw 500,500,1000,1000,1000,1000,2000
dw 500,500,1000,1000,1000,2000
dw 2 dup(500,500,1000,1000,1000,2000)
dw 500,500,1000,1000,1000,1000,2000
dw 500,500,1000,1000,1000,2000;时间数据
data ends
code segment
assume cs:code,ds:data,es:data,ss:stack
stat proc far
begin: push ds
mov ax,0
push ax
mov ax,data
mov ds,ax
mov es,ax
mov ax,stack
mov ss,ax
mov dx,offset bg
mov ah,09h
int 21h
mov si,offset freq
mov bp,offset time
call sing
ret
stat endp
sing proc near
push di
push si
push bp
push bx
repte: mov di,[si]
cmp di,0
je EndSing
mov bx,ds:[bp]
call sound
add si,2
add bp,2
jmp repte
EndSing:pop bx
pop bp
pop si
pop di
ret
sing endp
sound proc near
push ax
push bx
push cx
push dx
push di
mov al,0b6h ;8253初始化为:计数器2工作在方式3
out 43h,al
mov dx,012h ;计算时间常数
mov ax,34dch
div di
out 42h,al ;时间数预置计数器2,先送低8位,后送高8位
mov al,ah
out 42h,al
in al,61h
mov ah,al
or al,3
out 61h,al ;开喇叭(8255A礔腎/O端口61H的低两位置1)
delay: mov cx,8000h
dlms: nop
nop
loop dlms
dec bx
jnz delay
mov al,ah
out 61h,al
pop di
pop dx
pop cx
pop bx
pop ax
ret
sound endp
code ends
end begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -