📄 henry03.asm
字号:
DATA SEGMENT
WORDS1 DB 'THIS IS A ELECTRONIC PIANO,INPUT 1-8!','$'
WORDS2 DW 524,588,660,698,784,880,988,1048
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV BX,0H
MOV DX,OFFSET WORDS1
MOV AH,09H
INT 21H ;显示WORDS1
CALL CR
P1: MOV AH,01H ;输入字符
INT 21H
CMP AL,0DH ;回车就可以退出
JZ EXIT
CMP AL,31H ;非1到8的数忽略
JL P1
CMP AL,38H
JG P1
SUB AL,31H ;ASCII码转为实际数值
SHL AL,1H ;乘以2是因为表中存储的
;都是双字节的数
MOV BL,AL ;键入的字符植转化为查表偏移量
MOV DI,WORDS2[BX] ;表中的数值传给DI寄存器
CALL SINGING
JMP P1
EXIT: MOV AH,4CH
INT 21H
SINGING PROC ;发音的子程序
MOV SI,02FFH
MOV AL,0B6H ;B6H=10110110第二个计数器,
;先读低八位,再读高八位
OUT 43H,AL
MOV DX,12H
MOV AX,34DCH ;被除数为34DCH
DIV DI
OUT 42H,AL ;记数的初值存入计数器中
MOV AL,AH
OUT 42H,AL
IN AL,61H ;读喇叭的端口地址61H
MOV AH,AL
OR AL,3 ;打开与门
OUT 61H,AL
DELAY: MOV CX,0FFFFH
P2: LOOP P2 ;做了一个延时
DEC SI
JNZ DELAY
MOV AL,AH
OUT 61H,AL ;关闭与门
RET
SINGING ENDP
CR: MOV DL,0DH ;这里是换行
MOV AH,02H
INT 21H
MOV DL,0AH
INT 21H
RET
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -