汇编模拟钢琴

;比较low的钢琴
ASSUME CS:CODE,DS:DATA,SS:STACK
DATA  SEGMENT
    ;设置键盘区位
    ;中音区 A: 7 S: 8 D: 9 F:10 J:11 K:12 L:13
    ;高音区 Q:14 W:15 E:16 R:17 U:18 I:19 O:20
    ;低音区 Z: 0 X: 1 C: 2 V: 3 B: 4 N: 5 M: 6
    ;填补区 T:17 Y:18 G:10 H:11 P:20
    ;       ‘[‘:20 ‘]‘:20 ‘;‘:14 ‘"‘:14 ‘<‘:
    ;       ‘<‘:5 ‘>‘:5 ‘\‘:6
    ;       ‘^‘:0 ‘-‘:0 ‘`‘:0
    ;由于acsii码‘A‘的号码较小,为了大小写一致,直接减去‘A‘则得到序号为
    NORMALF DD 119000
    TIME DW 0
    IND DB    7,4,2,9,16,10,10,11,19,11,12,13,6,5,20,20,14,17,8,17,18,3,15,1,18,0,20,6,20,0,0,0,7,4,2,9,16,10,10,11,19,11,12,13,6,5,20,20,14,17,8,17,18,3,15,1,18,0
    FRE DW    131,147,165,175,196,220,247,262,294,330,349,392,440,494, 524,587,659,698,784,880,988
    STR1 DB "Welcome!!$"
    STR2 DB "The keyboard is distributed like that:$"
    STR3 DB "0 exit$"
    STR4 DB "High   Q W E R U I O$"
    STR5 DB "Medium A S D F J K L$"
    STR6 DB "Low    Z X C V B N M$"
    LENSTR DW 10,39,7,21,21
DATA ENDS

STACK SEGMENT
    BUFF DB 80H DUP(0)
STACK ENDS

CODE SEGMENT
    INIT PROC                         ;直接把所有频率除以基准频率
       MOV CX,21
       MOV DI,0
       LOOP1:
       MOV DX,NORMALF[2]
       MOV AX,NORMALF
       DIV FRE[DI]
       MOV FRE[DI],AX
       ADD DI,2
       LOOP LOOP1   

       MOV CX,5                        ;输出提示语
       LEA DI,STR1
       MOV AX,0900H
       MOV DX,DI
       MOV SI,0
       INT 21H
       CALL NEWLINE
       LOOP3:
       ADD DI,LENSTR[SI]
       ADD SI,2
       MOV DX,DI
       MOV AX,0900H
       INT 21H
       CALL NEWLINE
       LOOP LOOP3

       RET
    INIT ENDP

    RING PROC                         ;此时调用的字符存储在栈中
       POP SI
       POP DI
       SUB DI,‘A‘
       MOV AL,IND[DI]
       MOV DI,AX
       ADD DI,DI
       MOV AX,0

       MOV AL,0B6H
       OUT 43H,AL
       MOV AL,BYTE PTR FRE[DI]
       OUT 42H,AL
       MOV AL,BYTE PTR FRE[DI+1]
       OUT 42H,AL
       IN  AL,61H
       OR  AL,3
       OUT 61H,AL

       MOV AL,0
       INT 1AH
       MOV TIME,DX
       BACK1:
       MOV AL,0
       INT 1AH
       SUB DX,TIME
       CMP DX,5H
       JB BACK1
       MOV AX,0
       OUT 61H,AL
       PUSH SI
       RET
    RING ENDP    

    NEWLINE PROC
      MOV AH,02H
      MOV DL,0DH
      INT 21H
      MOV AH,02H
      MOV DL,0AH
      INT 21H
      RET
    NEWLINE ENDP

    BEGIN:
    MOV AX,DATA
    MOV DS,AX
    MOV AX,STACK
    MOV SS,AX
    CALL INIT

    LOOP2:
    MOV AH,01H
    INT 21H
    CMP AL,‘A‘
    JB EXIT
    CMP AL,‘z‘
    JA EXIT
    MOV AH,0
    PUSH AX
    CALL RING
    JMP LOOP2

    EXIT:
    MOV AX,4C00H
    INT 21H
CODE ENDS
END BEGIN

  

时间: 2024-10-29 19:07:48

汇编模拟钢琴的相关文章

汇编——模拟试卷二

5. 使用LINK 连接命令,执行后可生成文件的扩展名为(C). A. COM B. EXE  C. OBJ D. LST 8. 执行下列指令后,正确的结果是(D). MOV AL,100 MOV BL,-1 A. AL=100H,BL=01H B. AL=64H,BL=0FFH  C. AL=64H,BL=81H   D. AL=100H,BL=0FFH 1 100 ==> 64H 2 3 -1 ==> FFH 9. 在循环程序中使用LOOP 指令作为循环结束的判断,其计数值一般应放的寄存器

在Matlab上模拟钢琴并制作&lt;&lt;爱的礼赞&gt;&gt;

参考论文 钢琴音色识别与电子合成系统的设计与实现程美芳电子科技大学 https://kns.cnki.net/KCMS/detail/detail.aspx?dbcode=CMFD&dbname=CMFD201601&filename=1015701190.nh&uid=WEEvREcwSlJHSldRa1FhdXNXaEhoOG5EWWFBdVllNHRmb3VmejJxakNQMD0=$9A4hF_YAuvQ5obgVAqNKPCYcEjKensW4IQMovwHtwkF4VY

汇编——模拟试卷五

一.单项选择题(每小题1 分,共20 分) 1. 指令ADD AX,[3500H]中,源操作数使用的寻址方式是(A). A. 直接寻址 B. 寄存器寻址 C. 寄存器相当寻址    D. 立即寻址 2. 条件转移指令JZ 产生转移的测试条件是( ). A. ZF=0 B. ZF=1 C. ZF=1 或CF=1 D. ZF=0 或CF=1 1 JZ就是JE 3. 在字符串操作指令中,源串操作数放在的寄存器是( ). A. CS B. SS C. DS D. ES 1 字符串操作指令中,源串操作数在

DSP5509项目之用FFT识别钢琴音调(5)之开始傅里叶变换

1. 首先电脑上下载一个模拟钢琴的软件 2. 研究下钢琴的声音范围27HZ到4000HZ,那么采样频率需要是信号的两倍频率以上,所以建议采样频率是16KHZ. 原文地址:https://www.cnblogs.com/429512065qhq/p/9581618.html

C#源码大汇总

C#高仿QQ2013可在广域网部署聊天系统GG叽叽 动态显示硬盘分区容量饼图 自定义ProgressBar控件高仿Win8进度条 多皮肤精美在线QQ悬浮客服插件 jQuery仿天猫首页多格焦点图片轮播 jQuery时间轴特效 自动完成菜单.代码提示.输入纠错控件 仿Google浏览器进度条 仿苹果Safari浏览器选项卡自定义TabControl控件 蜂窝大战游戏 C#开源内容管理系统DTcms v3.0正式版源码 ScreenToGif录制屏幕到gif动画 CSS3仿Google Play的垂

OSSchedLock()函数透析

uC/OS-II的OSSchedLock()和OSSchedUnlock()函数允许应用程序锁定当前任务不被其它任务抢占. 使用时应当注意的是:当你调用了OSSchedLock()之后,而在调用OSSchedUnlock()之前, 千万不要再调用诸如OSFlagPend().OSMboxPend().OSMutexPend().OSQPend().OSSemPend()之类的事件等待函数! 而且应当确保OSSchedLock()和OSSchedUnlock()函数成对出现,特别是在有些分支条件语

如何动态调用 C 函数

JSPatch 支持了动态调用 C 函数,无需在编译前桥接每个要调用的 C 函数,只需要在 JS 里调用前声明下这个函数,就可以直接调用: 我们一步步来看看怎样可以做到动态调用 C 函数. 函数地址 首先若要动态调用 C 函数,第一步就是需要通过传入一个函数名字符串找到这个函数地址,这里一个必要的前提条件就是 C 编译后的可执行文件里必须有原函数名的信息,才有可能做到通过函数名字符串找到函数地址.我们写个简单的程序来看看它编译后可执行文件的内容有没有这个信息: 编译这个文件,并用otool看下它

8086汇编语言学习(五) 8086寻址方式

8086汇编内存寻址方式 前面的博客都多少提到了8086汇编的内存寻址,例如mov ax [2345H].而8086汇编还提供了更多.更灵活的寻址方式,以满足多种需求. 需要强调的是,无论何种寻址方式,内存寻址的地址总是由基础地址+偏移地址(段基址+偏移量)组合而成,不同之处在于基础地址与偏移地址应该从何处获得. 8086汇编提供寻址段基址的方式 在示例mov ax [2345H]中,并没有显示的指明段地址的值,这是因为8086汇编在处理没有明确指明段基址的指令时,默认将数据段寄存器DS的值作为

汇编钢琴

;电子琴 data segment note dw 262,294,330,349,392,440,494,523,578,659,698 data ends code segment assume ds:data , cs:code main proc far mov ax,data mov ds,ax begin: call input call sound cmp si,80h jnz begin mov ah,4ch int 21h main endp input proc near p