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

 更新时间:2021年11月27日 09:57:48   作者:BoBoRing  
本文给大家分享一个练手小项目,响铃设计项目,列出了响铃,机枪声音,音乐播放器的代码,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

软件: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

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

相关文章

  • 汇编 JCC指令表与笔记

    汇编 JCC指令表与笔记

    这篇文章主要介绍了汇编 JCC指令表与笔记,需要的朋友可以参考下
    2020-01-01
  • 汇编语言进制转换之16进制转10进制

    汇编语言进制转换之16进制转10进制

    这篇文章主要介绍了汇编语言进制转换之16进制转10进制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 汇编语言 寄存器内存访问原理解析

    汇编语言 寄存器内存访问原理解析

    这篇文章主要介绍了汇编语言 寄存器内存访问原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 汇编语言:x86汇编指令大全及其注意事项

    汇编语言:x86汇编指令大全及其注意事项

    用最精炼的语言,记录汇编语言中所有常用或不常用或极其重要的汇编指令及其注意事项,以方便自己和读者进行查阅,如有错误和不足请在评论区指出
    2021-10-10
  • UEFI开发实战用户交互界面使用说明VFR文件

    UEFI开发实战用户交互界面使用说明VFR文件

    这篇文章主要为大家介绍了UEFI开发实战用户交互界面使用说明VFR文件,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 使用汇编实现字符串的大小写转换

    使用汇编实现字符串的大小写转换

    这篇文章主要介绍了使用汇编实现字符串的大小写转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 汇编语言学习手把手的Debug教程

    汇编语言学习手把手的Debug教程

    这篇文章主要为大家分介绍了汇编语言学习的Debug教程内容,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-11-11
  • 浅析shellcode 反汇编模拟运行及调试方法

    浅析shellcode 反汇编模拟运行及调试方法

    这篇文章主要介绍了shellcode 反汇编,模拟运行以及调试方法,本文给大介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 汇编语言入门教程阮一峰版

    汇编语言入门教程阮一峰版

    汇编语言是一种最低级、最古老、不具有移植性的编程语言,它能够直接访问计算机硬件,所以执行效率极高,占用资源极少,一般用于嵌入式设备、驱动程序、实时应用、核心算法等
    2020-01-01
  • ARM汇编判断之如何用汇编判断数组中正负数个数

    ARM汇编判断之如何用汇编判断数组中正负数个数

    这篇文章主要介绍了ARM汇编判断之如何用汇编判断数组中正负数个数,在汇编语言中程序的基本框架是不变的,这里我们可以直接把正向遍历的程序给贴过来,然后我们思考怎么运用判断后缀把数组中正数和负数分开,进行判断个数和分别求和,需要的朋友可以参考下
    2022-04-04

最新评论