汇编语言之实现发出各种声音

软件:emu8086

语言:汇编语言(Assembly)

注意:本文列出了响铃,机枪声音,音乐播放的代码,第一个代码为博主独自一人编写,所有代码都会有瑕疵,谨慎使用。

9.响铃设计

9.1设计要求:

要求掌握响铃的使用方法。设计程序,从键盘接收输入字符,如是数字N,则响铃N次,如输入为非数字,则不响铃。

9.2设计思路:

判断输入为0~9之间,将N值给BP,设置响铃延时次数CX输出N次响铃。

9.3程序清单:

DATA    SEGMENT
        pkey   DB  0AH,0DH,'please input the N:','$'
        ERR   DB  0AH,0DH,'eero!',0AH,0DH,'please input the N again:','$'
DATA    ENDS  

CODE    SEGMENT
        ASSUME  CS:CODE,DS:DATA
STATE:  MOV AX,DATA
        MOV DS,AX
        MOV ES,AX 

        LEA DX,pkey
        MOV AH,09H
        INT 21H                 ;DOS功能调用,输出字符串

INPUT:  MOV AH,01H
        INT 21H
        CMP AL,'9'
        JA  eero
        CMP AL,'0'
        JB  eero
        SUB AL,30H              ;输入为0~9,则AL为响铃次数
        SUB AH,AH
        MOV BP,AX               ;BP为响铃次数N

xiang:   MOV CX,4                ;CX为响铃延时时间
        MOV AH,02H
        MOV DL,07H
        INT 21H                 ;DOS功能调用,响铃
LP:     LOOP LP                 ;响铃延时
        DEC BP
        JNZ xiang               ;响铃N次
        JMP STATE                

eero:    LEA DX,ERR
        MOV AH,9
        INT 21H                 ;输出错误字符串
        JMP INPUT

CODE   ENDS

END  STATE

9.4程序运行结果及分析:

设置CX次数为延时次数,BP次数为响铃次数,调用响铃功能通过延时实现响铃,起初会把延时次数和响铃次数混淆导致错误。

图9 响铃设计结果

10.需要外接扬声器的发声程序

10.1机枪声音

PROGRAM SEGMENT  

MAIN PROC FAR
        ASSUME CS:PROGRAM

        ORG 100H
STRAT:MOV CX,20D

NEW_SHOT:PUSH CX
         CALL SHOOT
         MOV CX,4000H 

SILENT:LOOP SILENT
       POP CX
       LOOP NEW_SHOT
       INT 20H 

MAIN ENDP    

SHOOT PROC NEAR  

      MOV DX,140H
      MOV BX,20H
      IN  AL,61H
      AND AL,11111100B 

SOUND:XOR AL,2
      OUT 61H,AL
      ADD DX,9248H
      MOV CL,3
      ROR DX,CL
      MOV CX,DX
      AND CX,1FFH
      OR CX,10    

WAIT: LOOP WAIT 

       DEC BX
       JNZ SOUND
       AND AL,11111100B
       OUT 61H,AL
       RET      

SHOOT ENDP   

PROGRAM ENDS 

END STRAT

10.2音乐播放

;定义数据段

data segment
     infor1 db 0Dh, 0AH, "welocom you to come here listeng! $"
     mus_freg  dw 330,294,262,294,3 dup (330)     ;频率表
               dw 3 dup (294),330,392,392
               dw 330,294,262,294,4 dup (330)
               dw 294,294,330,294,262,-1
     mus_time  dw 6 dup (25),50                   ;节拍表
               dw 2 dup (25,25,50)
               dw 12 dup (25),100
data ends
;栈段定义
stack segment stack
      db 200 dup(?)
stack ends
;--------字符串输出宏----------
SHOWBM MACRO b
     LEA DX,b
     MOV AH,9
     INT 21H
 ENDM
;----------音乐地址宏-----------
ADDRESS MACRO A,B
     LEA SI,A
     LEA BP,DS:B
ENDM
;代码段定义
code segment
     assume ds:data, ss:stack, cs:code
start:
     mov ax, data
     mov ds, ax
     mov ax, stack
     mov ss, ax
     mov sp, 200
     address mus_freg, mus_time
     call music
exit:
     mov ah, 4cH
     int 21h
;------------发声-------------
gensound proc near
     push ax
     push bx
     push cx
     push dx
     push di
     mov al, 0b6H
     out 43h, al
     mov dx, 12
     mov ax, 348ch
     div di
     out 42h, al
     mov al, ah
     out 42h, al
     in al, 61h
     mov ah, al
     or al, 3
     out 61h, al
wait1:
     mov cx, 3314
     call waitf
delay1:
     dec bx
     jnz wait1
     mov al, ah
     out 61h, al
     pop di
     pop dx
     pop cx
     pop bx
     pop ax
     ret
gensound 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
;--------------发声调用函数----------------
music proc near
      xor ax, ax
freg:
      mov di, [si]
      cmp di, 0FFFFH
      je end_mus
      mov bx, ds:[bp]
      call gensound
      add si, 2
      add bp, 2
      jmp freg
end_mus:
      ret
music endp
code ends
     end start

到此这篇关于汇编语言之实现发出各种声音的文章就介绍到这了,更多相关汇编发出各种声音内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 汇编语言指令集学习条件转移指令详解

    目录 1.根据单个条件标志的设置情况转移 2. 比较两个无符号数,并根据比较的结果转移 3. 比较两个带符号数,并根据比较的结果转移 4.测试CX或ECX的值为0则转移指令 条件转移指令较多,容易混淆,在此记录一下便于日后使用 1.根据单个条件标志的设置情况转移 指令 英文 含义 格式 测试条件 JZ/JE jump if zero/equal 结果为零/相等则转移 JZ/JE OPR ZF=1 JNZ/JNE jump if not zero/equal 结果不为零/不相等则转移 JNZ/JN

  • 汇编语言显示功能实现教程详解

    目录 问题1 1 如何确定字符要显示的位置 确定3行字符在每一行的起始位置 确定3行字符在屏幕中的哪一行 2 如何确定字符要显示的颜色属性 问题2: 分析: 问题1 在屏幕中间分别显示绿底,绿底红色,白底蓝色的字符串"Welcome to masm!" 分析: 1 如何确定字符要显示的位置 在80*25的彩色字符模式显示缓冲区在内存地址的B8000H~BFFFFH共32KB的空间中 在该模式下,显示器可以显示25行,80列 所以在一行中就有80个字符,共占据160个字节,每个字符低位字

  • 图文详解通俗易懂的汇编语言寄存器

    目录 认识寄存器 计算机架构中的寄存器 通用寄存器 AX 寄存器 BX 寄存器 CX 寄存器 DX 寄存器 索引寄存器 状态和控制寄存器 物理地址 什么是段 段寄存器 CS 寄存器 什么是 Code Segment DS 寄存器 栈 栈和 SS 寄存器 栈顶越界问题 我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 下面我们就来介绍一下关于寄存器的相关内容.我们知道,寄存器是 CPU 内部的构造,它

  • 汇编语言之实现发出各种声音

    软件:emu8086 语言:汇编语言(Assembly) 注意:本文列出了响铃,机枪声音,音乐播放的代码,第一个代码为博主独自一人编写,所有代码都会有瑕疵,谨慎使用. 9.响铃设计 9.1设计要求: 要求掌握响铃的使用方法.设计程序,从键盘接收输入字符,如是数字N,则响铃N次,如输入为非数字,则不响铃. 9.2设计思路: 判断输入为0~9之间,将N值给BP,设置响铃延时次数CX输出N次响铃. 9.3程序清单: DATA SEGMENT pkey DB 0AH,0DH,'please input

  • nodejs实现发出蜂鸣声音(系统报警声)的方法

    本文实例讲述了nodejs实现发出蜂鸣声音(系统报警声)的方法.分享给大家供大家参考,具体如下: nodejs 有时候需要发出报警声音,使用以下代码可以调用系统蜂鸣器发声 process.stdout.write('\x07') 另外附上我自己的番茄工作法 nodejs    实际上就是一个25分钟的倒计时,然后发出蜂鸣声 var FANQIE_TIME = 25; function beep() { for(var i =0;i<20;i++) { process.stdout.write('

  • JAVA实现简单系统登陆注册模块

    前期准备 首先要先明确有个大体的思路,要实现什么样的功能,了解完成整个模块要运用到哪些方面的知识,以及从做的过程中去发现自己的不足.技术方面的进步大都都需要从实践中出来的. 功能:用户注册功能+系统登录功能+生成验证码 知识:窗体设计.数据库设计.JavaBean封装属性.JDBC实现对数据库的连接.验证码(包括彩色验证码)生成技术,还有就些比如像使用正则表达式校验用户注册信息.随机获得字符串.对文本可用字符数的控制等 设计的模块预览图: 彩色验证码预览图: 所用数据库:MySQL 数据库设计

  • dos命令大全 黑客必知的DOS命令集合

    一般来说dos命令都是在dos程序中进行的,如果电脑中安装有dos程序可以从开机选项中选择进入,在windows 系统中我们还可以从开始运行中输入cmd命令进入操作系统中的dos命令,如下图: 严格的说,windows 中的命令窗口并不是真正意义上的dos操作界面,其功能并不全面,真正的dos程序是在电脑中没进入系统而进入的dos界面,如下图: 如上图,我们只要在dos界面中输入各种dos命令,即可实现相应的命令,下面分享下dos命令大全: net use ipipc$ " " /us

  • cmd命令行大全 dos命令 cmd命令整理

    CMD命令 net use ipipc$ " " /user:" " 建立IPC空链接 net use ipipc$ "密码" /user:"用户名" 建立IPC非空链接 net use h: ipc$ "密码" /user:"用户名" 直接登陆后映射对方C:到本地为H: net use h: ipc$ 登陆后映射对方C:到本地为H: net use ipipc$ /del 删除IPC链

  • Android界面 NotificationManager使用Bitmap做图标

    今天看到EOE问答里面有这"[Android 界面]NotificationManager 如何使用Bitmap做图标"这样一个问题,在论坛搜索也没有好的案例 特写一个简单的demo供大家参考 今天发布的是NotificationManager 使用Bitmap做图标 关键code 复制代码 代码如下: public void notification(int flag) { Notification notification = new Notification(); //设置sta

  • C++ 学习之旅 Windows程序内部运行原理

    学习C++与.net不同的是,一定要搞清楚Windows程序内部运行原理,因为他所涉及大多数是操作系统的调用,而.net毕竟是在.netFrameWork上唱戏. 那Windows应用程序,操作系统,计算机硬件之间的相互关系究竟什么了,下面的图就给予很好的解释. 向下箭头①是 应用程序运行判断处理的结果,输出到输出的设备. 向上箭头②是输入设备,输入到操作系统中. 向下箭头③代表API,我们要解释以下API是什么.API是应用程序接口, 表示应用程序可以通知操作系统执行某个具体的动作,如操作系统

  • Android控件系列之Button以及Android监听器使用介绍

    学习目的: 1.掌握在Android中如何建立Button 2.掌握Button的常用属性 3.掌握Button按钮的点击事件(监听器) Button是各种UI中最常用的控件之一,它同样也是Android开发中最受欢迎的控件之一,用户可以通过触摸它来触发一系列事件,要知道一个没有点击事件的Button是没有任何意义的,因为使用者的固定思维是见到它就想去点! 先看下Android中普通Button的样子: 以及点中Button后的样子: 我在Android控件系列之XML静态资源中已经强调了布局和

  • net use 命令集合详解()

    net use \\ip\ipc$ " " /user:" " 建立IPC空链接 net use \\ip\ipc$ "密码" /user:"用户名" 建立IPC非空链接 net use h: \\ip\c$ "密码" /user:"用户名" 直接登陆后映射对方C:到本地为 H: net use h: \\ip\c$ 登陆后映射对方C:到本地为H: net use \\ip\ipc$ /

  • 如何判断你的电脑是否含病毒

    各种病毒时至今日也可算是百花齐放了,搞得人心惶惶,一旦发现自己的电脑有点异常就认定是病毒在作怪,到处找杀毒软件,一个不行,再来一个,总之似乎不找到"元凶"誓不罢休一样,结果病毒软件是用了一个又一个,或许为此人民币是用了一张又一张,还是未见"元凶"的踪影,其实这未必就是病毒在作怪. 这样的例子并不少见,特别是对于一些初级电脑用户.下面我就结合个人电脑使用及企业网络维护方面的防毒经验从以下几个方面给大家介绍介绍如何判断是否中了病毒,希望对帮助识别"真毒&quo

随机推荐