汇编 一个小的音乐发声程序

bssmdman 2011-11-30 10:58:31
希望哪位大侠可以给之处错误所在谢谢!!!!
stack segment para stack 'stack'
db 64 dup('stack...')
stack ends
;---------------------------------------------------------------------------------------
data segment para 'data'
mus_freq dw 330,294,262,294,3 dup(330) ; bar 1 &2
dw 3 dup(294),330,392,392 ; bar 3 &4
dw 330,294,262,294,4 dup(330) ; bar 5 &6
dw 294,294,330,294,262, -1 ; bar 7 &8
mus_time dw 6 dup(25),50 ; bar 1 &2
dw 2 dup(25,25,50) ; bar 3 &4
dw 12 dup(25),100 ; bar 5 &6
data ends
;---------------------------------------------------------------------------------------
code segment para 'code'
music proc far
assume cs:code ,ss:stack ,ds:data
start:
push dx
mov ax, 0
push ax

mov ax,data ;initialize DS
mov ds,ax

lea si, mus_freq
lea bp, mus_time
freq:
mov di,[si]
cmp di, -1
je end_mus
mov bx, ds:[bp]
call soundf
add si, 2
add bp, 2
jmp freq
end_mus:
ret
music endp

soundf proc near
push ax
push bx
push cx
push dx
push di

mov al, 0B6h ;10110110 即将计数器2设定为模式3
out 43h, al ;send it to control register
;使AX中得到送往定时器2的计数值
mov dx, 12h ;timer divisor
mov ax, 348ch
div di ;119130/(given size)
out 42h, al ;给计数器2装入计数值x从而产生对应赫兹的频率
mov al, ah
out 42h, al
;用于控制扬声器的代码
in al, 61h
mov ah, al
or al, 3 ;make pb0=1 pb1=1
out 61h, al ;turn the speaker on
;wait for sepcified interval
wait1:
mov cx, 663
call waitf
;;-------new modify----------
delay:
loop delay
dec bx
jnz wait1
mov al, ah ;recover value of port
out 61h, al ;recover the register,turn off the speaker
pop di
pop dx
pop cx
pop bx
pop ax
ret
soundf endp
waitf proc near
push ax
waitf1: in al, 61h
and al, 10h
cmp al, ah
je waitf1
mov ah, al
loop waitf1
pop ax
ret
waitf endp
code ends
end start
...全文
202 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
大熊猫侯佩 2011-12-01
  • 打赏
  • 举报
回复
什么问题?此类程序要到实模式下执行,比如win9x或dosbox

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧