⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mymusic.asm

📁 汇编语言实现用电脑自带喇叭放音乐。可自己改代码来实现不同歌曲的放制。
💻 ASM
字号:
STACK       SEGMENT PARA STACK 'STACK'
            DB 200 DUP(0)
STACK       ENDS

DATA        SEGMENT
BK          DB'Push Esc to end up.$'
CHOOSE1     DB '1,hair like snow   2,three point five miles flower   3,the song of nankai $'
CHOOSE2     DB '4,the quite summer   5,the birthday song    6,the red star  7,wash and brush$'
SIGN        DB 'There is not the song!$'
FREQ1	      DW 22000,392,588,660,660,588,660,784,880,784	
		DW 523,588,660,880,784,660,784			
	      DW 784,880,1045,880,784,660,784,660			
		DW 524,440,660,588,523,523,440,523,588,588,523	                             
            DW 0
TIME1       DW 25,50,50,25,50,25,50,50,50,50 
		DW 50,50,50,50,50,25,175
		DW 25,25,100,50,50,100,50,100
		DW 50,50,50,100,50,50,50,50,50,100,100 
FREQ2       DW 300,392,523,523,523,523,523
            DW 494,440,392,494,523,588,523,523
            DW 392,523,523,523,523,523
            DW 494,440,392,588,660,698,660,660
            DW 392,523,523,523,523,523
            DW 494,440,392,588,523,588,698,660,524
            DW 524,524,660,588,524,524,494,588,523,523                             
            DW 0
TIME2       DW 1,50,100,100,600,100,100
            DW 100,100,100,100,100,100,50,200
            DW 100,100,100,600,100,100
            DW 50,100,100,100,100,100,50,200   
            DW 100,100,100,600,100,100
            DW 50,100,100,100,100,100,50,150,200
            DW 100,100,100,100,100,100,100,100,50,500        
FREQ3       DW 22222,392,523,523,523,588,660,660,660
		DW 588,660,698,494,588,523,523
		DW 392,523,523,523,588,660,660,660
		DW 588,660,698,494,588,523,523
		DW 784,784,880,880,784,784,698,698
		DW 698,698,784,784,698,698,660,660
		DW 392,523,523,523,588,660,660,660
		DW 588,660,698,494,588,523,523		
		DW 0
TIME3		DW 50,50,50,25,50,50,50,25,125
		DW 25,25,50,50,50,25,50
		DW 50,50,25,50,50,50,25,125
		DW 25,25,50,50,50,25,100
		DW 50,50,25,100,50,50,25,50
		DW 25,50,25,75,50,50,25,50
		DW 50,50,25,50,50,50,25,125
		DW 25,25,50,50,50,25,100
FREQ4       DW 22222,660,392,440,523,523
		DW 660,660,660,660,588,523,523
		DW 392,392,330,392,440,523,523
		DW 440,440,523,440,392,784
		DW 660,660,588,523,588,660,440,392
		DW 392,440,524,524,440,588
		DW 392,440,523,588,660,784,784,880,660,588,588,440,524            
            DW 0
TIME4       DW 50,100,100,50,50,100
		DW 50,50,50,50,50,50,100
		DW 25,50,50,50,50,50,100
		DW 25,50,25,50,50,450
		DW 50,50,50,50,50,50,50,150
		DW 50,50,50,50,50,200
		DW 50,50,50,50,50,50,50,50,50,250,50,50,200
FREQ5       DW 262,262,294,262,349,330
            DW 262,262,294,262,392,349
            DW 262,262,523,440,349,330,294
            DW 466,466,440,262,392,349                            
            DW 0
TIME5       DW 50,50,100,100,100,200 
            DW 50,50,100,100,100,200
            DW 50,50,100,100,100,100,300
            DW 50,50,100,100,100,200  
FREQ6       DW 392,392,392,440,392,440
            DW 330,294,262,262,262,440
            DW 440,523,440,392,349,330,294                        
            DW 0
TIME6       DW 50,50,50,50,200,100 
            DW 50,50,200,50,50,100
            DW 100,50,50,50,50,50,200 
FREQ7       DW 22222,294,294,330,392,440,524,440,392,294,330,294                
	    DW 262,294,330,392,330,294,262,294,262
	    DW 330,392,440,523,440,392,294,330,294
	    DW 262,294,330,392
	    DW 330,392,440,524,440,392,294,330,294
	    DW 262,294,330,392,330,294,262,294,262
	    DW 330,392,440,523,440,392,294,330,294
	    DW 330,294,262,294,262                            
          DW 0
TIME7     DW 50,50,50,50,50,25,25,25,25,50,50,100
	    DW 50,50,25,25,25,25,50,50,100
	    DW 50,50,25,25,25,25,50,50,100
	    DW 50,50,100,200
	    DW 50,50,25,25,25,25,50,50,25
	    DW 50,50,25,25,25,25,50,50,100
	    DW 50,50,25,25,25,25,50,50,100
	    DW 25,25,25,25,100  
DATA        ENDS

CODE        SEGMENT 
            ASSUME CS:CODE,DS:DATA,SS:STACK
START       PROC FAR
            MOV  AX,DATA
            MOV  DS,AX
            LEA  DX,BK
            MOV AH,9
            INT 21H
            MOV DL,10
            MOV AH,2
            INT 21H
            MOV DL,13
            INT 21H
            LEA  DX,CHOOSE1
            MOV  AH,9
            INT  21H
            MOV  DL,10
            MOV AH,2
            INT 21H
            MOV DL,13
            INT 21H
            LEA DX,CHOOSE2
            MOV AH,9
            INT 21H
AGAIN:      MOV AH,0
            INT 16H
            CMP AL,'1'
            JE M1
            CMP AL,'2'
            JE M2
            CMP AL,'3'
            JE M3
            CMP AL,'4'
            JE M4
            CMP AL,'5'
            JE M5
            CMP AL,'6'
            JE M6
            CMP AL,'7'
            JE M7
            CMP AL,27
            JE QUIT
            MOV DL,10
            MOV AH,2
            INT 21H
            MOV DL,13
            MOV AH,2
            INT 21H
            LEA  DX,SIGN
            MOV AH,9
            INT 21H
            JMP AGAIN
PLAY1:     
            M1:LEA  SI,DS:FREQ1
            LEA  BP,DS:TIME1
            JMP PLAY
            M2:LEA SI,DS:FREQ2
            LEA BP,DS:TIME2
            JMP PLAY
            M3:LEA SI,DS:FREQ3
            LEA BP,DS:TIME3
            JMP PLAY
            M4:LEA SI,DS:FREQ4
            LEA BP,DS:TIME4
            JMP PLAY
            M5:LEA SI,DS:FREQ5
            LEA BP,DS:TIME5
            JMP PLAY
            M6:LEA SI,DS:FREQ6
            LEA BP,DS:TIME6 
            JMP PLAY 
            M7: LEA SI,DS:FREQ7
            LEA BP,DS:TIME7
            JMP PLAY 
  
PLAY:       MOV  DI,[SI]
            CMP  DI,0
            JE   AGAIN
            MOV  BX,DS:[BP]              ;bl中为音符音长/10ms的值
SOUND:   
            MOV  AL,0B6H                 ;计数器2,模式3,二进数
            OUT  43H,AL                  ;送控制寄存器
            MOV  DX,12H                  ;8253/54时钟端的输入频率1193100Hz=12384CH
            MOV  AX,348CH
            DIV  DI
            OUT  42H,AL
            MOV  AL,AH
            OUT  42H,AL                  ;在计数器2中装入ax中的控制字
            IN   AL,61H
            MOV  AH,AL
            OR   AL,3
            OUT  61H,AL                  ;把输出端口61H的0,1两位置置1,发出声音
_WAIT:      MOV  CX,5800                 ;延时 1658*15.08=25ms
            PUSH AX
LOOP1:      IN   AL,61H
            AND  AH,10H
            CMP  AL,AH                   ;置8255A监控端口的PB4为1,使其每15.08us触发一次
            JE   LOOP1
            MOV  AH,AL
            LOOP LOOP1
            POP  AX
            DEC  BL
            JNZ  _WAIT
            MOV  AL,AH                  
            OUT  61H,AL                  ;恢复原8255A中监控端口的值
            ADD  SI,2
            ADD  BP,2
            JMP PLAY         
           
QUIT:       MOV  AX,4C00H
            INT  21H
            START       ENDP            
CODE        ENDS           
            END START                               

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -