汇编语言实现乐曲程序实践
来源:互联网 发布:旺角卡门 知乎 编辑:程序博客网 时间:2024/04/28 11:10
主要的用到了延迟程序和61H 端口和42端口。
关键代码段:
MOV AL,0B6H OUT 43H,AL MOV DX,12H 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
用到了43端口和42端口以及61端口
关键代码弄懂之后就没有什么问题了。
输入a播放《两只老虎》
输入b以后按12345678发出不同频率的声音。
频率定义在代码的开头部门。
附上源码:
DISPLAY MACRO b LEA DX,b MOV AH,9 INT 21H ENDM ;*********************** DATA SEGMENT LIST DB 0DH,0AH,'a: <<Liang Zhi Lao Hu>>' DB 0DH,0AH,'b: Keyboard Piano' DB 0DH,0AH,'q: exit' db 0dh,0Ah,'$' MUS_FREG1 dw 263,294,330,263, 263,294,330,263, 330,349,392, 330,349,392, 392,440,392,349,330,263, 392,440,392,349,330,263, 263,196,263, 263,196,263, 0 MUS_TIME1 dw 10 dup(20), 40, 2 dup(20), 40, 4 dup(10), 20, 20, 4 dup(10), 20, 20, 2 dup(20), 40, 2 dup(20), 40table dw 262 ;C dw 294 ;D dw 330 ;E dw 349 ;F dw 392 ;G dw 440 ;A dw 494 ;B dw 523 ;C DATA ENDS ;***********************************************************STACK SEGMENTSTACK ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX MOV AH, 0 MOV AL,0 INPUT: ;控制播放的主程序 DISPLAY LIST MOV AH,01H INT 21HQ: CMP AL,'q' JZ RETUA: CMP AL,'a' JNZ B lea SI,MUS_FREG1 lea BP,MUS_TIME1 CALL MUSIC JMP INPUTB: CMP AL,'b' JNZ INPUT CALL PIANO JMP INPUTRETU: MOV AH,4CH INT 21H;********************************************* 通用发声程序 soundf PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AL,0B6H OUT 43H,AL MOV DX,12H 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 soundf ENDP ;******************************************** waitf proc near push cx waitf1: in al,61h and al,10h cmp al,ah je waitf1 mov ah,al loop waitf1 pop cx ret waitf endp ;********************************************* 音乐播放MUSIC PROC NEAR PUSH DS SUB AX,AX PUSH AX FREG: MOV DI,[SI] CMP DI,0 JE END_MUS MOV BX,[BP] CALL soundf ADD SI,2 ADD BP,2 JMP FREG END_MUS: RETMUSIC ENDP ;********************************************* 键盘钢琴PIANO PROC NEAR PUSH DS SUB AX,AX PUSH AX read_key: mov ah,0 int 16H cmp al,0dh je exit mov bx,offset table cmp al,'1' jb read_key cmp al,'8' ja read_key and ax,0fh sub ax,1 shl ax,1 mov si,ax mov di,[bx][si] mov bx,20 call soundf jmp read_keyexit: retPIANO ENDPCODE ENDS END START
1 0
- 汇编语言实现乐曲程序实践
- 51单片机演奏乐曲的程序
- 汇编语言程序
- 汇编语言程序
- 汇编实验——乐曲程序(两只老虎)
- 汇编语言中常用进制数据输出的程序实现
- 汇编语言中常用进制数据输出的程序实现
- 汇编语言程序设计-十进制转换为十六进制的程序实现
- 乐曲创作
- 乐曲创作
- 乐曲创作
- IBM PC汇编语言实践操作
- 第一个汇编语言程序
- 汇编语言程序格式
- 汇编语言程序框架
- 汇编语言学习程序
- 汇编语言《闰年程序》
- 汇编语言编写时钟程序
- SQL语法(一)
- 安装了VS2013 又安装VS2010 遇到 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 解决方案
- 【SDOI2012】bzoj2705 Longge的问题
- 知识库--ZooKeeper + Watches and Notifications(59)
- BZOJ2117
- 汇编语言实现乐曲程序实践
- Oracle SQL性能优化
- make menuconfig 报错 undefined reference
- C::写一个可以演示多个字符从两端移动,中间汇聚的代码
- POJ 1236 Network of Schools 已翻译
- 也来谈谈EMI和EMC电路中磁珠和电感的不同作用
- Jquery-基本选择器
- 腾讯笔试:把两个数和告诉A,积告诉B,求这两个数是什么
- python使用pymysql操作mysql