汇编发声程序

汇编发声程序,第1张

我这有个现成的,希望对你能有所帮助。

按键说明:

1、不输入任何数字,直接按回车键,可结束程序,返回 *** 作系统

2、每次最多能够输入N(本程序,N=8)个数字(1~8)

3、不足8位数字的,按回车结束输入

本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。

Code Segment

Assume CS:Code,DS:Code

CR EQU 000DH

LF EQU 000AH

-------------------------------------

功能:显示指定地址(Str_Addr)的字符串

入口:

Str_Addr=字符串地址(要求在数据段)

用法: Output Str_Addr

用法举例:Output PromptStr

Output MACRO Str_Addr

lea dx,Str_Addr

mov ah,9

int 21h

EndM

-------------------------------------

功能:输出一个字符

入口:dl=要显示的字符

Output_Chr proc Near

push ax

mov ah,02h

int 21h

pop ax

ret

Output_Chr endp

-------------------------------------

功能:输出回车换行

Output_CTLF proc Near

push ax

push dx

mov ah,02h

mov dl,0dh

int 21h

mov dl,0ah

int 21h

pop dx

pop ax

ret

Output_CTLF endp

-------------------------------------

Subroutine 延时指定的时钟嘀嗒数

入口:

Didas=时钟嘀嗒数(1秒钟约嘀嗒18.2次,10秒钟嘀嗒182次。若延时不是秒的10数次倍,误差稍微大点)

Delay Proc Near

push dx

push cx

xor ax,ax

int 1ah

mov Times,dx

mov Times[2],cx

Read_Time: xor ax,ax

int 1ah

sub dx,Times

sbb cx,Times[2]

cmp dx,Didas

jb Read_Time

pop cx

pop dx

ret

Times dw 0,0

Delay EndP

-----------------------------------------

功能:从键盘输入N位数字

入口:N=数字位数;di=保存输入的数字首地址

出口:cx=实际接收的数字位数

Input_Digit Proc Near

cld

mov cx,N

@@Input: mov ah,1

int 21h

cmp al,CR

jz @@Return

cmp al,'1'

jb @@Input

cmp al,'8'

ja @@Input

stosb

loop @@Input

@@Return: mov ax,N

sub ax,cx

xchg ax,cx

ret

Input_Digit EndP

-----------------------------------------

入口参数

SI=声音频率地址

CX=时间

Music Proc Near

in al,61h

push ax

or al,3

out 61h,al 接通扬声器

push cx

push dx

push si

mov al,0b6h

out 43h,al

mov dx,12h

mov ax,348ch

div word ptr [si]

out 42h,al

mov al,ah

out 42h,al

in al,61h

mov ah,al

or al,3

out 61h,al

mov cx,3314

push ax

@@Waitf1: in al,61h

and al,10h

cmp al,ah

jz @@Waitf1

mov ah,al

loop @@Waitf1

pop ax

call Delay 延时

mov al,ah

out 61h,al 关闭扬声器

pop si

pop dx

pop cx

pop ax

out 61h,al

ret

Music EndP

-----------------------------------------

Didas equ 18 延时(时钟嘀嗒次数)

frequency dw 262,294,330,349,392,440,492,524 频率值

dw 441,495,556,589,661,742,833 从其它音乐程序抄来的频率值

dw 882,990,1112,1178,1322,1484,1655 同上行

N equ 8

PromptStr db 'Please Enter ',N or 30h,' digitals(1-8): $'

Number db N dup(?)

Press_Key dbCR,LF,CR,LF,'Press any key to exit...$'

-----------------------------------------

Start:push cs

pop ds

push cs

pop es 使数据段、附加段与代码段同段

Input_Str: Output PromptStr 提示输入N位数字

lea di,Number 数字保存地址

call Input_Digit 从键盘接收数字

call Output_CTLF 输出一个回车、换行

call Output_CTLF 输出一个回车、换行

jcxz Exit_Proc

lea bx,Number 数字保存地址

Sound: push cx

push bx

mov dl,[bx] 读入一个数字

call Output_Chr 屏幕显示这个数字

and dl,0fh

dec dl

shl dl,1

mov bl,dl

mov dl,0eh

call Output_Chr 显示一个音乐符号

mov dl,20h

call Output_Chr 显示一个空格

lea si,frequency[bx] 对应的频率值地址

call Music 激活扬声器,使之发出指定频率、指定时长的声音

pop bx

inc bx 增1,处理下一个音符

pop cx

loop Sound

call Output_CTLF 输出一个回车、换行

call Output_CTLF 输出一个回车、换行

jmp Input_Str

-------------------------------------

Exit_Proc: Output Press_Key 提示 *** 作完成,按任意键结束程序

mov ah,1

int 21h

mov ah,4ch 结束程序

int 21h

Score_Table: 学生成绩存储区

Code ENDS

END Start 编译到此结束

如果是蜂鸣器的话,那么加一个电平信号就可以发声了。\x0d\x0aFMQ EQU P1.0\x0d\x0aORG 0000H\x0d\x0aLJMP MAIN\x0d\x0aORG 0030H\x0d\x0aMAIN:\x0d\x0aCPL FMQ\x0d\x0aLCALL DELAY\x0d\x0aSJMP MAIN\x0d\x0aDELAY:\x0d\x0aMOV R2,#200\x0d\x0aDLY:\x0d\x0aMOV R3,#250\x0d\x0aDJNZ R3,$\x0d\x0aDJNZ R2,DLY\x0d\x0aRET\x0d\x0aEND

相信楼上说的“发音朗读”与楼主说的不是一回事

对61h端口的I/O控制可以控制早期的PC喇叭方波声音发生器,它不是用来控制声卡的,由于只能控制声音频率,它只能发出比较单调的音乐,不能进行音幅控制、谐波处理、声音合成等,更无从谈语音合成了

你的电脑播放没问题指的是声卡没问题,现在的许多电脑已经废除了原来的PC喇叭,或者喇叭线有但是没有正常接到主板上,你可以打开检查一下;

另外,由于这类汇编程序直接控制硬件端口,一般只能在实模式的DOS环境下才能正确运行,在XP等的虚拟DOS环境下相当于空 *** 作,不能发出声音


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11306980.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存