📄 32.asm
字号:
DATAS SEGMENT para 'data'
table dw 494 ;0,7.
dw 524 ;1
dw 588 ;2
dw 660 ;3
dw 698 ;4
dw 784 ;5
dw 880 ;6
dw 988 ;7
dw 1048 ;8,i
dw 440 ;9,6.
message db 'Paly the piano with number key(1-9) ,exit with space bar!',13,10,'$'
DATAS ENDS
STACKS SEGMENT para 'stack'
db 64 dup('stack...')
STACKS ENDS
CODES SEGMENT
main proc far
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov ah,9 ;读出字符串
mov dx,offset message
int 21h
new_note:
mov ah,0
int 16h ;中断调用 从键盘读取字符
cmp al,2eh ;"." bar is the exit key
je exit
mov bx, offset table
cmp al,'0'
jb new_note
cmp al,'9'
ja new_note
and ax,000fh ;convert the ascii to an index in si ,start with zero
shl ax,1
sub ax,2
mov si,ax
mov di,[bx][si+2]
call soundf
jmp new_note
;produces a tone of a specified frequency
soundf proc near
push ax
push bx
push cx
push dx
push di
mov al,0b6h ;write timer mode reg
out 43h,al
mov dx,12h ;timer divisor
mov ax,348ch ;1193100hz/frzq
div di ;value of frzq
out 42h,al ;write timer2 count low byte
mov al,ah
out 42h,al ;write timer2 count low byte
in al,61h
mov ah,al
or al,3
out 61h,al
mov bx,100
wait1:
mov cx,633
call waitf
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 ax
waitf1:
in al,61h
and al,10h
cmp al,ah
je waitf1
mov ah,al
loop waitf1
pop ax
ret
waitf endp
exit:
MOV ah,4ch
INT 21h
main endp
CODES ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -