📄 l3.asm
字号:
DATA SEGMENT
TUNE DW 294,294,294,294,330
DW 294,262,262,392,392,440
DW 262,262,262,262,294,330
DW 294,294,294,294,330
DW 294,262,196,196,220
DW 262,262,262,262,330
DW 330,294,294,294,392
DW 0
RHYTHM DW 3,1,3,1,3,2
DW 1,1,1,1,2,3
DW 3,1,3,2,3,3
DW 3,1,2,3,2
DW 3,1,2,3,3
DW 2,2,1,1,3
DW 1,1,3,2,2
SNAME DB 'QIAN LI ZHI WAI',13,10,'$'
STRING DB 'PUT YOUR OWN SONG',13,10,'$'
DATA ENDS
STACK SEGMENT PARA STACK'STACK'
DW 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
STAT PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
CALL SING
CALL DPIANO
RET
STAT ENDP
SING PROC NEAR
LEA DX,SNAME ;输出提示语(曲名)
MOV AH,9
INT 21H
LEA SI,TUNE
LEA BP,RHYTHM
PUSH DI
PUSH SI
PUSH BP
PUSH BX
REPTO: MOV DI,[SI]
CMP DI,0
JE ENDSONG
MOV AX,DS:[BP]
MOV BX,3700
MUL BX
MOV BX,AX
CALL SOUND
ADD SI,2
ADD BP,2
JMP REPTO
ENDSONG:POP BX
POP BP
POP SI
POP DI
RET
SING ENDP
SOUND PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL,0B6H ;写命令控制字10110110
OUT 43H,AL
CMP DI,100 ;如果为100则不发声
JE DELAY
MOV DX,12H ;计算计数值
MOV AX,34DCH
DIV DI
OUT 42H,AL ;送低字节
MOV AL,AH
OUT 42H,AL ;送高字节
IN AL,61H ;打开扬声器发声
OR AL,3
OUT 61H,AL
DELAY: MOV CX,09fffh ;延时
KILLT: LOOP KILLT
DEC BX
JNZ DELAY
IN AL,61H ;关闭扬声器
AND AL,0FCH
OUT 61H,AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
SOUND ENDP
DPIANO PROC NEAR
LEA DX,STRING ;输出提示语
MOV AH,9
INT 21H
THEN: MOV AH,1 ;用户输入
INT 21H
MOV BX,7000
CMP AL,31H
JNE NEXT1
MOV DI,131
JMP FF
NEXT1: CMP AL,32H
JNE NEXT2
MOV DI,147
JMP FF
NEXT2: CMP AL,33H
JNE NEXT3
MOV DI,165
JMP FF
NEXT3: CMP AL,34H
JNE NEXT4
MOV DI,175
JMP FF
NEXT4: CMP AL,35H
JNE NEXT5
MOV DI,196
JMP FF
NEXT5: CMP AL,36H
JNE NEXT6
MOV DI,220
JMP FF
NEXT6: CMP AL,37H
JNE NEXT7
MOV DI,247
JMP FF
NEXT7: CMP AL,38H
JNE NEXT8
MOV DI,262
JMP FF
NEXT8: CMP AL,39H
JNE NEXT9
MOV DI,294
JMP FF
NEXT9: CMP AL,30H
JNE OTHERS
MOV DI,330
JMP FF
FF: CALL SOUND
JMP THEN
OTHERS: RET
DPIANO ENDP
CODE ENDS
END STAT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -