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

2024-02-08 12:32

本文主要是介绍汇编实验——乐曲程序(两只老虎),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       首先需要知道的是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是同步增加的,程序会将空格字符与一个声音对应起来。

       最后,不要问我为什么后面输出的低阶sol没有显示成5下有个小点~~

       下面是“两只老虎”的参考代码:

;************************************************************************************
datasg segment
       mus_freq   dw 262,294,330,262,262,294,330,262      ;频率决定音高
                  dw 330,349,392,330,349,392,392,440
                  dw 392,349,330,262,392,440,392,349
                  dw 330,262,294,196,262,294,196,262

       mus_time   dw 2500,2500,2500,2500,2500,2500,2500,2500,2500,2500    ;节拍决定音长
                  dw 5000,2500,2500,5000,1200,1200,1200,1200,2500,2500
                  dw 1200,1200,1200,1200,2500,2500,2500,2500,5000,2500,2500,5000

    mes    db 31h,32h,33h,31h,31h,32h,33h,31h,33h,34h,35h,33h,34h,35h,35h,36h
      db 35h,34h,33h,31h,35h,36h,35h,34h,33h,31h,32h,35h,31h,32h,35h,31h,'$'
    
datasg ends
;************************************************************************************
;************************************************************************************
codesg segment
    main    proc   far
         assume cs:codesg,ds:datasg
   org    100h     ;链接器将之后的程序放在0100h的开始位置
;-----------------------------------------------------
 start:
         push ds
   sub  ax,ax
   push ax
   mov  ax,datasg
   mov  ds,ax

            lea  di,mus_freq   ;频率
            lea  bx,mus_time   ;节拍
   lea  si,mes    ;音符
            mov  cx,32d;
;-----------------------------------------------------
 new_shot:  
            push cx
      call sound
   add  di,2
      add  bx,2
   add  si,1
   mov  cx,0ffffh
;-----------------------------------------------------
 silent:
   loop silent
         pop  cx
   loop new_shot
   mov  al,48h
         out  61h,al
           
   mov  ah,4ch
   int  21h
   
      ret
 main endp
 
;-----------------------------------------------------
sound proc near

   mov  ah,02h    ;利用中断21h的02功能调用,显示音符简谱
   and  si,00ffh
   mov  dx,[si]
   int  21h

   in  al,61h
   and  al,11111100b
  sing:
      xor  al,2    ;将PB1置1,打开扬声器
   out  61h,al

   push ax
   call widnth
   pop  ax
   mov  cx,dx
  waits:
      loop waits    ;循环延迟,由此控制开关电路所产生脉冲的频率
      dec  WORD PTR [bx]  ;实现相应节拍的声音
   jnz  sing

   
      and  al,11111100b  ;关闭扬声器
   out  61h,al
   ret       ;一轮实现了一个音的输出
  
sound endp
;----------------------------------------------------- 
;-----------------------------------------------------
widnth proc near     ;控制脉宽的计数值
            mov  ax,2801    
   push bx     ;保存的是节拍
   mov  bx,50
            mul  bx
   div  WORD PTR [di]  ;除以了相应的频率
   mov  dx,ax
   pop  bx
   ret
widnth endp
;-----------------------------------------------------
codesg ends  
;************************************************************************************   
 end start
;************************************************************************************





这篇关于汇编实验——乐曲程序(两只老虎)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/691047

相关文章

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

防止SpringBoot程序崩溃的几种方式汇总

《防止SpringBoot程序崩溃的几种方式汇总》本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配... 目录1. 全局异常处理2. 使用 try-catch 捕获异常3. 使用断路器4. 设置最大内存和线