汇编语言实现音乐播放器

news2025/6/4 1:02:08

目标程序

用汇编语言实现一个音乐播放器,并支持点歌

Overview

乐曲是按照一定的高低、长短和强弱关系组成的音调,在一首乐曲中,每个音符的音高和音长与频率和节拍有关,因此我们要分别为3首要演奏的乐曲定义一个频率表和一个节拍时间表。
请添加图片描述

利用8253/54定时器来驱动扬声器,在8253/54中的43端口送一个控制字0B6H,该控制字对定时器2进行初始化,使定时器2准备接收计数初值。在8253/54中的42H端口装入一个16位的计数值,以建立将要产生的发声频率。把输出端口61H的0、1两位置1,发出声音。

输入不同的数字,要播放相应的音乐。因此我们要利用输入的数字来获取歌曲的频率表地址和节拍时间表地址来播放对应音乐,利用直接定址表即可迎刃而解。

在CMOS RAM中存放着当前的时间,秒、分、时、日、月、年分别存放在0,2,4,7,8,9的单元中。这些数据以BCD码的方式存放,因此我们若要输出时间还需将他们转换为ASCII码才可正确输出。

更改界面颜色。在内存地址空间中,B8000H~BFFFFH共32KB的空间,为80*25彩色字符模式的显示缓冲区。一个字符占两个字节的存储空间,低位字节存储字符的ASCII码,高位字节存储字符的属性。属性字节的格式:7:BL闪烁 6、5、4:RGB背景色 3:I高亮 2、1、0:RGB前景色。更改属性字节即可更改界面颜色。

效果预览

初始界面

请添加图片描述

开始播放

请添加图片描述

结束播放

请添加图片描述

流程图

请添加图片描述

源码

;点歌系统:
;输入不同的数字,播放相应的音乐。
;其中“1”代表《刚好遇见你》音乐,“2”代表《成都》音乐,“3”代表《暧昧》音乐。
;输入数字“0”,则退出点歌系统。
;----------------------------------------------------
stack   segment para stack 'stack'
        db 100 dup ('?')
stack   ends
;----------------------------------------------------
data	segment para 'data'
tip0	db	'-----------------------------------','$'
tip1	db	'|  1: just met you-- Fei Yuqing   |','$' 
tip2	db	'|  2:    ChenDu   --  Zhao Lei    |','$' 
tip3	db	'|  3:   ambiguity -- Xue Zhiqian  |','$'
tip4	db	'|  0: exit                        |','$'
tip5	db	'  --please input your choice:      ','$'
tip		dw	tip0,tip1,tip2,tip3,tip4,tip0,tip5 ;界面
tip6	db	'music over!','$'
tip7	db	'begin:','$'
tip8	db	'end  :','$'
tip9	db	'You have exited successfully.','$'
tip10	db	'input error!please input again:','$'
time	db 'yy/mm/dd hh:mm:ss','$'				;输出时间的格式
table	db 9,8,7,4,2,0							;CMOS ROM中时间信息的存放单元

;----------------------------------------------------
;《刚好遇见你》
mus_freq1 dw 262,262,262
		  dw 262,220,524,440,440,440,392
		  dw 392,330,330,262,294,262,262
		  dw 262,220,524,587,524,524,440
		  dw 440,392,330,392,294,262,247
		  dw 262,220,524,440,440,440,392
		  dw 392,392,330,392,294,262,294
		  dw 262,247,262,262,262,294
		  dw 330,294,262,262,247,262,262
		  dw -1
mus_time1 dw 25,25,25
		  dw 25,25,25,25,50,25,25
		  dw 25,25,25,25,50,25,25
		  dw 25,25,25,25,50,25,25
		  dw 25,25,25,25,50,25,25
		  dw 25,25,25,25,50,25,25
		  dw 25,25,25,25,50,25,25
		  dw 25,12,12,100,25,25
		  dw 25,12,12,25,12,12,100
;---------------------------------------------------
;《成都》
mus_freq2 dw 196,262
		  dw 262,294,330
		  dw 392,330,330
		  dw 330,196
		  dw 262
		  dw 294,262,220
		  dw 196,196
		  dw 262,262,294,330
		  dw 440,330,392
		  dw 330,294
		  dw 262
		  dw 294,392
		  dw 330,294
		  dw 330,392
		  dw 392,330,392
		  dw 440,524,440
		  dw 330,294,262
		  dw 294,330,330
		  dw 196,392
		  dw 330,330
		  dw 294,262,262
		  dw 196,294,262
		  dw 330,294,262
		  dw 262
		  dw -1
mus_time2 dw 25,75
		  dw 50,12,12
		  dw 25,25,25
		  dw 25,50
		  dw 75
		  dw 25,25,25
		  dw 125,25
		  dw 75,50,12,12
		  dw 25,25,50
		  dw 25,25
		  dw 75
		  dw 50,25
		  dw 25,100
		  dw 25,75
		  dw 25,25,25
		  dw 25,25,75
		  dw 25,50,25
		  dw 50,25,125
		  dw 25,100
		  dw 25,25
		  dw 25,25,75
		  dw 25,50,25
		  dw 50,12,12
		  dw 200
;-------------------------------------------------
;《暧昧》
mus_freq3 dw 262,262,262,294,262
		  dw 392,440,330,330,294
		  dw 247,247,247,262,247
		  dw 330,392,247,294,262
		  dw 220,247,220,247,220
		  dw 330,349,262,220,247
		  dw 196,262,294,294
		  dw 349,330,330,294,262,294
		  dw 330,262,262,262,294,262
		  dw 392,440,330,330,294
		  dw 294,247,247,247,262,247
		  dw 330,392,247,294,262
		  dw 220,247,220,247,220
		  dw 330,349,220,262,247
		  dw 247,330,392,294,262
		  dw -1
mus_time3 dw 25,25,25,25,25
		  dw 25,100,25,25,100
		  dw 25,25,25,25,25
		  dw 25,100,25,25,100
		  dw 25,25,25,25,25
		  dw 25,100,25,25,75
		  dw 25,50,50,25
		  dw 50,25,25,25,50,25
		  dw 75,25,25,25,25,25
		  dw 25,100,25,25,25
		  dw 75,25,25,25,25,25
		  dw 25,100,25,25,100
		  dw 25,25,25,25,25
		  dw 25,100,25,25,25
		  dw 100,50,25,50,75
;---------------------------------------------------
;直接定址表
mus_time  dw mus_time1,mus_time2,mus_time3
mus_freq  dw mus_freq1,mus_freq2,mus_freq3
data ends
;----------------------------------------------------
code    segment para 'code'
        assume cs:code,ss:stack,ds:data
music   proc far
			
        mov ax,data
        mov ds,ax
        
        call tips;打印界面
               
		mov bh,00;第0页
        mov dh,06;第7行
        mov dl,42;第42列
        mov ah,02
        int 10h;设置光标位置
        
		mov ah,01
		int 21h;键盘输入并回显
		
input:	cmp al,30h;和'0'比较
		jb	end_error;调用end_error处理错误输入
		cmp al,33h;和'3'比较
		ja	end_error;调用end_error处理错误输入
		cmp al,30h;判断输入是否为'0'
		je	end_exit;调用end_exit退出程序
		
		sub al,30h;ASCII码转换为对应数字
		dec al;减一,因为地址从0开始
		mov ah,0;ax寄存器高位置0
		shl ax,1;每个地址数据占两个字节,向左移位实现*2
		mov di,ax;相对位移赋值给变地寄存器实现寄存器相对寻址
		mov si,mus_freq[di]
		mov bp,mus_time[di]
		
		
		mov ah,02
		mov dh,08
		mov dl,20
		int 10h;设置光标位置
		
		mov ah,09
		lea dx,tip7
		int 21h;显示输出
		
		push dx
		mov dh,08
		mov dl,26
		call timer;调用timer子程序显示开始播放时间,dh设置显示行数,dl设置显示列数
		pop dx
		
freq:
        mov     di,[si]
        cmp     di,-1
        je      end_mus;遇到-1时中止乐曲
        mov     bx,ds:[bp]
        call    soundf;调用发声子程序
        add     si,2
        add     bp,2
        jmp     freq
end_mus:
		mov bh,00
		mov dh,10
		mov dl,26
		mov ah,2
		int 10h;设置光标位置
		
		mov	ah,09
		lea dx,tip6
		int 21h;显示输出

		mov ah,02
		mov dh,11
		mov dl,20
		int 10h;设置光标位置
		
		mov ah,09
		lea dx,tip8
		int 21h;显示输出

		push dx
		mov dh,11
		mov dl,26
		call timer;调用timer程序显示结束时间
		pop dx
		
		jmp music_end;

end_exit:
		mov bh,00
		mov dh,09
		mov dl,20
		mov ah,02
		int 10h;设置光标位置
		
		mov ah,09
		lea dx,tip9
		int 21h;显示输出
		
		jmp music_end
		
end_error:
		mov ax,0b800h
		mov es,ax
		mov si,7*160+44*2
		mov byte ptr es:[si],20h;将输入处清空,以处理第二次仍然是错误的情况

		mov bh,00
		mov dh,07
		mov dl,12
		mov ah,02
		int 10h;设置光标位置
		
		mov ah,09
		lea dx,tip10
		int 21h;显示输出
		
		mov bh,00;第0页
        mov dh,07;第7行
        mov dl,44;第44列
        mov ah,02
        int 10h;设置光标位置
        
		mov ah,01
		int 21h;键盘输入并回显
		
		jmp input
		
music_end:
        mov     ax,4c00h
        int     21h
music   endp
;-----------------------------------------------------
;发声程序
soundf	proc far
        push ax
        push bx
        push cx
        push dx
        push di
        
        mov al,0b6h
        out 43h,al;对定时器2进行初始化
        mov dx,12h
        mov ax,348Ch;12348CH/DI中存放的给定频率得到声音计数值
        div di
        out 42h,al
        mov al,ah
        out 42h,al;分两次先后装入低8位和高8位的声音计数值
        in al,61h
        mov ah,al
        or al,3
        out 61h,al;将61h端口的数据0、1位置1,发声
        
WAIT1:  mov cx,4971;4971*15.08=0.07s
        call waitf;调用延迟程序
        dec bx
        jnz WAIT1

        mov al,ah
        out 61h,al;恢复接口的值
        
        pop di
        pop dx
        pop cx
        pop bx
        pop ax
        ret
soundf endp
;----------------------------------------------------
;时间延迟
waitf	proc far
		push ax
waitf1:
		in	al,61h
		and	al,10h
		cmp	al,ah
		je	waitf1
		
		mov	ah,al
		loop waitf1
		
		pop	ax
		ret
waitf	endp
;------------------------------------------------------
;打印界面 按预先设定的tip中的内容输出并更改背景颜色
tips	proc far
		push ax
		push ds
		push si
		push cx
	
		mov si,offset tip
		sub si,2
		mov cx,7
		mov al,-1
tipsf:

		mov bh,0
		inc al
		mov dh,al
		mov dl,12
		mov ah,2
		int 10h
		
		push ax
		add si,2
		mov dx,[si]
		mov ah,09
		int 21h
		pop ax


		loop tipsf
		
		mov ax,0b800h
		mov es,ax
		mov bp,0
		mov si,25
colorf:;改背景颜色
		mov byte ptr es:[bp+si],00110000B;颜色属性
		add si,2
		cmp si,95;控制改色区域的列的范围
		jb colorf
		add bp,160
		mov si,25
		cmp bp,160*6;控制改色区域为1-6行
		jb colorf
		
		pop cx
		pop si
		pop ds
		pop ax
		ret
		
tips	endp
;------------------------------------------------------
;显示当前时间,dh设置输出所在的行数,dl设置列数
timer proc far
		push ax
		push ds
		push si
		push di
		push cx
		push bx
	
		mov ax,data
		mov ds,ax
start:	mov si,offset table
		mov di,offset time
		
		mov cx,6
s1:		push cx
		mov al,ds:[si]
		out 70h,al;向70h写入要访问的单元的地址
		in al,71h;从71h中得到指定单元的数据
		
		mov ah,al
		mov cl,4
		shr	ah,cl;十位数码值
		add ah,30h;转换位ASCII码
		and al,00001111b;个位数码值
		add al,30h;转换位ASCII码
		mov ds:[di],ah
		mov ds:[di+1],al
		add di,3
		inc si
		pop cx		
		loop s1
		
		mov bh,0
		mov ah,2
		int 10h;根据预先指定的dh,dl设定光标位置
		
		mov dx,offset time
		mov ah,9
		int 21h;显示输出
		
		pop bx
		pop cx
		pop di
		pop si
		pop ds
		pop ax
		ret
timer endp
;------------------------------------------------------
code    ends
;---------------------------------------------------------
        end     music 

11b;个位数码值
		add al,30h;转换位ASCII码
		mov ds:[di],ah
		mov ds:[di+1],al
		add di,3
		inc si
		pop cx		
		loop s1
		
		mov bh,0
		mov ah,2
		int 10h;根据预先指定的dh,dl设定光标位置
		
		mov dx,offset time
		mov ah,9
		int 21h;显示输出
		
		pop bx
		pop cx
		pop di
		pop si
		pop ds
		pop ax
		ret
timer endp
;------------------------------------------------------
code    ends
;---------------------------------------------------------
        end     music 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1278705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生成带依赖Jar 包的两种常用方式:IDEA打包工具:Artifacts 和 maven-shade-plugin

文章目录 前言1、IDEA打包工具:Artifacts1.1 创建Artifacts1.2 选择第三方jar文件1.3 打包Artifacts1.4 测试jar包 2、maven-shade-plugin2.1、pom文件添加2.2、打包2.3、测试jar包 总结 前言 当我们编写完Java程序后,为了提高执行效率通常会将应用程序…

MySQL5.7安装与配置:自动化一键安装配置

介绍 本文介绍了一个自动化安装MySQL的Shell脚本。该脚本可以帮助用户快速安装MySQL,并自动进行配置和初始化。通过使用该脚本,用户无需手动执行繁琐的安装步骤,大大简化了MySQL的安装过程。 使用shell自动化安装教程 1. 复制脚本 首先&a…

flink源码分析之功能组件(四)-slot管理组件II

简介 本系列是flink源码分析的第二个系列,上一个《flink源码分析之集群与资源》分析集群与资源,本系列分析功能组件,kubeclient,rpc,心跳,高可用,slotpool,rest,metrics&…

零基础打靶—CTF4靶场

一、打靶的主要五大步骤 1.确定目标:在所有的靶场中,确定目标就是使用nmap进行ip扫描,确定ip即为目标,其他实战中确定目标的方式包括nmap进行扫描,但不局限于这个nmap。 2.常见的信息收集:比如平常挖洞使用…

哈夫曼树与并查集

带权路径长度: 哈夫曼树定义: 哈夫曼树的构造: 哈夫曼编码: 并查集: 代码实现:​​​​​​​ 优化:​​​​​​​

ftp的服务安装配置

安装 yum install -y vsftpd # 是否安装成功 rpm -qa | grep vsftpd # 是否开机启动 systemctl list-unit-files | grep vsftpd # 开机启动 systemctl enable vsftpd.service # ftp端口 netstat -antup | grep ftp # 状态 service vsftpd status service vsftpd start service…

mybatis多表查询(xml)

多表查询都用resultMap resultMap 说白了就是他可以手动设置映射参数&#xff0c;例如 可以指定 column代表数据库的参数 property 代表实体类的参数 <id column"roleid" property"id"></id> column代表数据库的参数 property 代表实体类…

融合CFPNet的EVC-Block改进YOLO的太阳能电池板缺陷检测系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着太阳能电池板的广泛应用&#xff0c;对其质量和性能的要求也越来越高。然而&#xff0c;由于生产过程中的各种因素&#xff0c;太阳能电池板上可能存在各种缺…

人工智能和网络安全:坏与好

人工智能似乎可以并且已经被用来帮助网络犯罪和网络攻击的各个方面。 人工智能可以用来令人信服地模仿真人的声音。人工智能工具可以帮助诈骗者制作更好、语法正确的网络钓鱼消息&#xff08;而糟糕的语法往往会暴露出漏洞&#xff09;&#xff0c;并将其翻译成多种语言&…

Mongodb安装及其使用

1.Linux系统上安装Mongodb 在usr/local文件夹下创建mongo文件夹 下载mongodb包 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.5.tgz解压mongodb tar -zxvf mongodb-linux-x86_64-rhel70-6.0.5.tgz更改文件夹的名字 mv mongodb-linux-x86_64-rh…

卷积神经网络-3D医疗影像识别

文章目录 一、前言二、前期工作1. 介绍2. 加载和预处理数据 二、构建训练和验证集三、数据增强四、数据可视化五、构建3D卷积神经网络模型六、训练模型七、可视化模型性能八、对单次 CT 扫描进行预测 一、前言 我的环境&#xff1a; 语言环境&#xff1a;Python3.6.5编译器&a…

css中的 Grid 布局

flex布局和grid布局区别 flex布局是 一维布局grid布局是二维布局 flex布局示例 grid布局示例 grid 布局初体验 体验地址 <div class"wrapper"><div class"one item">One</div><div class"two item">Two</div&…

【中文编码】利用bert-base-chinese中的Tokenizer实现中文编码嵌入

最近接触文本处理&#xff0c;查询了一些资料&#xff0c;记录一下中文文本编码的处理方法吧。   先下载模型和词表&#xff1a;bert-base-chinese镜像下载   如下图示&#xff0c;下载好的以下文件均存放在 bert-base-chinese 文件夹下    1. 词编码嵌入简介 按我通俗的…

笔记-基于CH579M模块通过网线直连电脑进行数据收发(无需网络)

刚学习&#xff0c;做个记录。 基于CH579M模块通过网线直连电脑进行数据收发(无需网络) 目录 一、工具1、CH579模块2、 网线3、电脑以及网络调试工具 二、操作步骤1、TCP/UDP等程序下载以及设置以太网IP2、网络断开3、检查以太网是否正常显示并稳定4、打开网络调试助手进行测试…

揭秘原型链:探索 JavaScript 面向对象编程的核心(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Swin Transformer实战图像分类(Windows下,无需用到Conda,亲测有效)

目录 前言 一、从官网拿到源码&#xff0c;然后配置自己缺少的环境。 针对可能遇到的错误&#xff1a; 二、数据集获取与处理 2.1 数据集下载 2.2 数据集处理 三、下载预训练权重 四、修改部分参数配置 4.1 修改config.py 4.2 修改build.py 4.3 修改units.py 4.4 修…

【程序设计】简易生产者、消费者模型

需求&#xff1a; 创建消息队列时需要指定队列的容量上限&#xff0c;队列中没有消息时&#xff0c;消费者从队列中take元素会阻塞&#xff1b;队列中的消息数量达到容量上限时&#xff0c;生产者往队列中put元素会阻塞。要保证线程安全。 组成&#xff1a; &#xff08;1&…

西南科技大学模拟电子技术实验五(集成运算放大器的应用设计)预习报告

一、计算/设计过程 设计一:用集成运放设计一个输入为0.05v,放大为-100的反相比例运算电路。 对于理想电路,反相比例运算电路的输出电压与输入电压之间的关系如下: =-100,所以 =100 若是假定R1为100k,则R2= =1k 为了减小输入级偏置电流引起的运算误差,在同相输入端…

全新MacOS固件正式版发布,打造出色的操作系统体验!

MacOS 11-14(PKG系统安装包及IPSW固件) 11.7.10/12.7.1/13.6.2/14.1.2正式版已经隆重发布&#xff01;这些固件版本适用于MacOS 11至14&#xff0c;带来了令人瞩目的升级和改进。 新版本固件通过增强系统的稳定性和性能&#xff0c;为用户创造了更加出色的操作系统体验。无论您…

VSC++: string声明的字符串这么相加

缘由https://bbs.csdn.net/topics/397667834 void string声明的字符串这么相加() {//缘由https://bbs.csdn.net/topics/397667834struct teacher { string name; };teacher t[3];string teachernameseed1 "张赵王";//把字符串放入种子中string teachernameseed2 &…