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

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

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

这些心智程序你安装了吗?

原文题目:《为什么聪明人也会做蠢事(四)》 心智程序 大脑有两个特征导致人类不够理性,一个是处理信息方面的缺陷,一个是心智程序出了问题。前者可以称为“认知吝啬鬼”,前几篇文章已经讨论了。本期主要讲心智程序这个方面。 心智程序这一概念由哈佛大学认知科学家大卫•帕金斯提出,指个体可以从记忆中提取出的规则、知识、程序和策略,以辅助我们决策判断和解决问题。如果把人脑比喻成计算机,那心智程序就是人脑的

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于

Spring Roo 实站( 一 )部署安装 第一个示例程序

转自:http://blog.csdn.net/jun55xiu/article/details/9380213 一:安装 注:可以参与官网spring-roo: static.springsource.org/spring-roo/reference/html/intro.html#intro-exploring-sampleROO_OPTS http://stati

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern