汇编实验——乐曲程序(两只老虎)

       首先需要知道的是PC机是通过什么来发声的,8255(A)可编程序外围接口芯片(PPI)。PPI有三个八位寄存器,两个用于输入,一个用于输出,而输出寄存器的I/O端口为61h,这是会在程序中体现的,而该输出寄存器端口号的第0位和第1位是选择扬声器的驱动方式。用汇编实现发声系统程序,有两种方式,一种是位触发方式,另一种是定时器方式。

       其中位触发方式直接使61h的PB1交替置1和0来实现脉冲电流,控制扬声器从而交替打开和关闭,产生不同音高和不同音长的声音。

       而定时器方式需要用到定时器内部的Counter2和控制寄存器,它们分别对应的端口号是42h43h。在该方式中需要将一个控制字送入43h中(类似于计算机组成原理中的ROM微指令),控制字为8位,由高到低,前两位选择计数器,第3、4位选择计数器读写指示位,第5、6和7位选择操作模式(输出脉冲的形状),最后一位选择计数值格式(0为二进制,1为BCD码格式),另外42h存放的是计算得到的延迟时间。当然61h的0和1位需要都置为1。

       实现了输出一个简谱音符的同时响相应的音,之前将输出音符放在了扬声器输出声音的后面,出现了声音延迟于音符输出,在数据段mes存放数据的开头增加一个空格依然无法同步,原因很简单,在主程序段中,di、bx和si是同步增加的,程序会将空格字符与一个声音对应起来。

       最后,

  • 9
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
很抱歉,我不太明白你的问题。不过如果你是想让我展示一段汇编语言代码,来播放“两只老虎”这首儿歌的话,可以参考以下代码: ``` .model small .stack 100h .data note1 db 6dh, 0 note2 db 6dh, 0 note3 db 7dh, 0 pause db 0, 6dh, 0 .code mov ax, @data mov ds, ax ; 第一遍 mov dx, offset note1 call playnote mov dx, offset note1 call playnote mov dx, offset pause call playnote mov dx, offset note2 call playnote mov dx, offset note2 call playnote mov dx, offset pause call playnote mov dx, offset note3 call playnote mov dx, offset pause call playnote ; 第二遍 mov dx, offset note1 call playnote mov dx, offset note1 call playnote mov dx, offset pause call playnote mov dx, offset note2 call playnote mov dx, offset note2 call playnote mov dx, offset pause call playnote mov dx, offset note3 call playnote mov dx, offset pause call playnote ; 第三遍 mov dx, offset note1 call playnote mov dx, offset note1 call playnote mov dx, offset pause call playnote mov dx, offset note2 call playnote mov dx, offset note2 call playnote mov dx, offset pause call playnote mov dx, offset note3 call playnote mov dx, offset pause call playnote ; 退出程序 mov ah, 4ch int 21h playnote proc near push ax push bx push cx push dx mov ah, 86h mov al, 0 mov bx, 165 mov cx, 1 int 15h mov dx, 0 mov al, [bx] or al, al jz endplay mov ah, 86h mov cx, 52227 mov al, [bx] out dx, al mov al, ah out dx, al endplay: pop dx pop cx pop bx pop ax ret playnote endp end ``` 这段代码使用了 86h 中断来播放音符,其中 note1、note2、note3 和 pause 分别代表了 C、D、E 和休止符。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值