能远离诈骗吗 發表於 2021-11-27 09:57:48

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

<p>软件:emu8086</p>
<p>语言:汇编语言(Assembly)</p>
<p>注意:本文列出了响铃,机枪声音,音乐播放的代码,第一个代码为博主独自一人编写,所有代码都会有瑕疵,谨慎使用。</p>
<p>9.响铃设计</p>
<p>9.1设计要求:</p>
<p>要求掌握响铃的使用方法。设计程序,从键盘接收输入字符,如是数字N,则响铃N次,如输入为非数字,则不响铃。</p>
<p>9.2设计思路:</p>
<p>判断输入为0~9之间,将N值给BP,设置响铃延时次数CX输出N次响铃。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112709550714.png" /></p>
<p>9.3程序清单:</p>
<div class="jb51code">
<pre class="brush:plain;">
DATA    SEGMENT
      pkey   DB0AH,0DH,'please input the N:','$'
      ERR   DB0AH,0DH,'eero!',0AH,0DH,'please input the N again:','$'
DATA    ENDS

CODE    SEGMENT
      ASSUMECS: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'
      JAeero
      CMP AL,'0'
      JBeero
      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

ENDSTATE</pre>
</div>
<p>9.4程序运行结果及分析:</p>
<p>设置CX次数为延时次数,BP次数为响铃次数,调用响铃功能通过延时实现响铃,起初会把延时次数和响铃次数混淆导致错误。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112709550715.png" /></p>
<p style="text-align: center">图9 响铃设计结果</p>
<p>10.需要外接扬声器的发声程序</p>
<p>10.1机枪声音</p>
<div class="jb51code">
<pre class="brush:plain;">
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
      INAL,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</pre>
</div>
<p>10.2音乐播放</p>
<div class="jb51code">
<pre class="brush:plain;">
;定义数据段

data segment
   infor1 db 0Dh, 0AH, "welocom you to come here listeng! $"
   mus_fregdw 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_timedw 6 dup (25),50                   ;节拍表
               dw 2 dup (25,25,50)
               dw 12 dup (25),100
data ends
;栈段定义
stack segment stack
      db 200 dup(&#63;)
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,
      cmp di, 0FFFFH
      je end_mus
      mov bx, ds:
      call gensound
      add si, 2
      add bp, 2
      jmp freg
end_mus:
      ret
music endp
code ends
   end start</pre>
</div>
<p>到此这篇关于汇编语言之实现发出各种声音的文章就介绍到这了,更多相关汇编发出各种声音内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>汇编语言 and和or逻辑运算指令的实现</li><li>汇编语言系列之汇编实现各种码制的转换(思路详解)</li><li>c语言中if语句是怎么变成汇编代码的详解</li><li>汇编语言系列之汇编实现简单数学运算</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 汇编语言之实现发出各种声音