梦想天籁之音.docx
《梦想天籁之音.docx》由会员分享,可在线阅读,更多相关《梦想天籁之音.docx(14页珍藏版)》请在冰豆网上搜索。
梦想天籁之音
目录
绪论……………………………………………………………………………2
第一章原理…………………………………………………………………3
第二章设计思路………………………………………………………5
第三章遇到的问题及解决方案…………………………8
结论…………………………………………………………………………9
谢辞…………………………………………………………………………10
参考文献…………………………………………………………………10
附录A………………………………………………………………………11
梦想天籁之音
绪论
选择汇编程序的理由:
1.学习和使用汇编语言可以从根本上认识和理解计算机的工作过程。
2.现在计算机系统中,某些功能仍然靠汇编语言程序来实现。
3.汇编语言程序的效率要高于任何的高级语言程序。
即汇编程序的目标代码比高级语言程序短而运行速度快。
题目:
为了具有音响输出的能力,系统板上安装有一个2.25英寸的扬声器以及控制电路和驱动电路,控制电路能以位触发和定时器控制两种不同的方式驱动扬声器发声。
要求用这两种方法之一设定不同的音阶,然后可根据不同的按键发出对应的音频和音长。
选择这个题目的原因:
我们喜欢古典音乐的人,喜欢名指挥家的人,在心目中都有一个美丽的梦想。
我们在音乐会上,在片子上,看过他们的绝妙的精彩表演。
一次次倾听美妙的音乐,不禁让我有了一个新大陆般的发现。
这个新大陆的发现,着实让我震惊了一次!
不是因为他的指挥有多么的激烈,宏大,浪漫,也不是因为他的对于德奥音乐的理性的,极为逻辑的诠释,而是因为,他给我们带来的一种完全是另类风格的冲击。
而且这样的冲击,也并不是那种感情的旋涡完全被掀起其高潮的那种冲击,而是极为委婉的,甚至是极为平静的,有着和音乐的极为靠近,又不失距离感的那种奇特的冲击。
其实,要说是一种冲击,已经不那么准确了。
因为老克的追求,是要让人们既有完全与音乐融合,又时时处处不会被音乐吞没的那种感觉。
通过这一个学期的学习汇编知识,我了解汇编原来可以让我编出我喜爱的东西,我相信我一定能完成这个题目,因为我喜欢所以我选择。
能够通过计算机弹奏美妙的音乐,这样的事情很有意义。
以前小时候特别喜欢听音乐,所以每次上音乐课的时候都很高兴听老师能在那么一架大钢琴面前弹我们喜欢的歌曲。
现在可以在自己的电脑上演奏音乐,那是一件多么令人高兴的事情啊!
!
!
编这个程序首先要电脑上有个扬声器(这个应该不是问题,每台电脑上应该都有),并且要能使它发声。
这是个关键。
有中音乐意境优美,乐曲结构严密。
它的主题旋律尽管有多种变化,新的因素层出不穷,但每一段的结尾都采用同一乐句出现.听起来十分和谐。
在民间音乐中,这种手法叫“换头合尾”,能从格格不同角度揭示乐曲的意境,深化音乐表现的内容。
我想实现那么一种意境,可是能力有限啊,但是,万里长征有第一步,我要用汇编编写出一段演奏音乐的程序来,开始着手设计程序。
第一章
了解各种汇编原理基础
我想要首先了解汇编重点指令:
宏指令的定义与使用
在汇编语言源程序中,有的程序段在整个程序中要多次出现。
这种出现可能是完全不修改的重复,也可能是仅修改某个操作数,而程序段的功能并无多大的变化。
为了减少源程序中重复编写相同程序段的工作,可以使用宏指令来进行,宏指令的使用要先进行定义,然后才能调用,并在汇编过程中自动展开。
第二:
了解产生声音的原理步骤:
PC机通过内置的永久磁铁扬声器产生声音,扬声器和端口42H、43H和61H连接。
扬声器发声的操作步骤如下:
1.得到端口61H的状态,并保存。
2.为了打开扬声器,发送在位0和1中的位串11到端口61H。
端口激活Inter8255可编程外围接口(PPI)芯片。
3.为了关闭扬声器发送在位0和1中的位串00到端口61H。
第三:
了解调试程序DEBUG的使用
DEBUG是DOS的一个外部命令,其命令格式为:
[path]DEBUG[filename][parm1][parm2]
[path]是DEBUG命令在磁盘上的路径
filename是要用DEBUG来处理的文件的名字,它包括文件的盘符、路径、文件主名和扩展名。
参数parm1和parm2是文件filename运行时使用的参数。
当启动DEBUG时,将对CPU的各寄存器进行初始化:
1.如果启动时指定的filename是.EXE文件,则DEBUG启动后将自动把指定的文件装入内存,并置:
CS为程序代码段段地址
IP为第一条要执行指令的偏移地址
SS为堆栈段段地址
SP为堆栈底部+1单元的偏移地址
DS和ES是装入文件前第一个可用内存段的段地址(即DEBUG程序后的第一个段地址)
标志寄存器的所有标志位为0
BX(0)和CX是装入的文件长度
其余寄存器为0。
2.如果启动DEBUG时指定的文件filename不是.EXE文件,则DEBUG将把文件装入内存,并置:
四个段寄存器为DEBUG程序后面的第一个段地址
IP指向100H
SP指向这个段的段尾
标志寄存器的所有标志位为0
BX和CX是装入的文件长度
其余寄存器为0。
3.如果启动DEBUG时不指定filename,则只是把CPU的各寄存器进行初始化,初始化结果与上述的第2点相同。
这时要想显示、修改文件,可以用DEBUG的子命令装入文件。
从键盘输入一个键用的是BIOS16H中断,AL中回送的是键的ASCII码。
AH中回送键的扫描码。
因为没有用到功能键或控制键,所以完全可以用DOS的键盘输入功能。
然后首先想到的是如何让计算机发声就是用8253定时输出方波的那种,原来自己都弄过的,可时间久了,查到:
8253/喇叭的口地址
定时常数的设置
用的是BIOS中的BEEP来控制.
用定时器中的42H和43H来计数,用输出端口61H来发声,和GENSOUND链接执行
。
第四:
宏观掌握PC机发音原理及音乐程序编制方法,8088指令:
IN,OUT,DIV,OR
第二章
设计思路:
了解计算机发声原理(见第一章内容),查找资料,找相关程序参考。
设计子程序
将子程序用主程序连接起来,
通过调试链接运行程序。
完成设计
思路解析:
从上表中可以看出编写一个发声的程序不再复杂,有了思路可以开始编写,编写过程可以拿附件中的程序来解释:
开始放开其他部分写发声段通用发声程序段:
gensoundprocfar
pushax
pushbx
pushcx
pushdx
pushdi
moval,0b6h
out43h,al
movdx,12h
movax,3280h
divdi
out42h,al
moval,ah
out42h,al
inal,61h
movah,al
oral,3
out61h,al
wait1:
movcx,55afh
delay:
loopdelay
decbx
jnewait1
moval,ah
out61h,al
popdi
popdx
popcx
popbx
popax
ret
gensoundendp
写完后先不管它,由于音乐的演奏肯定要出现延时部分:
第二步编写主程序(也是调用发声程序的代码)
musicprocfar
pushds
subax,ax
pushax
movax,dseg
。
。
。
。
。
。
end_mus:
ret
musicendp
最后我写数据段:
我选用了一首儿歌《两只老虎》为播放音乐,
先写题目《twotigers!
》根据网上提供的乐谱编写数据段代码,如下所示:
tigerdb0ah,0dh,'《twotigers》!
$'
mus_freqdw2dup(262,294,330,262)
dw2dup(330,349,392)
dw2dup(392,440,392,349,330,262)
dw2dup(294,196,262),0ffffh
mus_timedw6dup(10000),20000
dw2dup(10000,10000,20000)
dw12dup(10000),40000
dsegends
等等其他指令(个人习惯),编译运行通过,完成汇编课程设计。
编写过程:
a.建立汇编源程序─通过───→b.编译为目标文件─ ↓┬─→d.连接为可执行文件
↑
│ c.不通过,重新修改(语句错误) ↓
├──────────────────────┘ ↓
↑ f.不正确,用调试工具调试,重新修改(逻辑错误) ↓
└────────────────────────────←e运行
↓正确
g.完成
第三章
设计过程中出现的问题及解决方案:
第一.我的作业中出现在divideoverflow的错误:
结果是除法溢出!
检查了被除数是不是0,或是别的不合适的值等等。
查出错误改写程序
第二.以下代码出现错误:
wait:
movcx,5000
spkr_on:
loopspkr_on
decbx
jnzwait
提示为MOV还有WAIT错误,错误类型看不懂,于是我将这段代码删除,并改写了程序代码,汇编通过!
第三,原理问题:
就是用什么语句访问端口。
编译时碰到ASM时会把文件编译成一个巨大的ASM文件,再重新启动汇编程序汇编,速度太慢。
这通过看各种程序不断优化和简化程序得到改进!
第四.学习寻址是重点。
实地址寻址和保护地址寻址,了解各种寻址方式。
第五.始写完没声音。
首先,了解到声音应该是从PCSpeaker上发出的,看看PCSpeaker能不能发声,
我看到课外书上有介绍:
测试PCSpeaker
看别的程序是不是能响,有个用键盘模拟电子琴的程序,运行试试,看是不是在Windows下这种直接访问端口地址的程序不让运行。
把程序简化,只发一个音就退出,看是否发音。
然后来检查程序是否错误。
得到的结果是程序出错,PCSpeaker没有问题。
第六,由于设置播放的频率有问题,播放的歌曲速度不一,延时出现问题,在改写延时后基本得到解决,解决方法很笨,有是大段的删除代码而保持速度的一致和提高,因为暂时没有找到更好的方法来解决音乐中休止符问题。
以上就是在写程序时遇到的一些问题,可能是程序比较小,遇到的大问题没有,小问题不多,所以得到的问题类型不是很多,了解问题的知识面也不是很广!
这样积累起来的经验很少,所以以后得经常编写各种小程序,以便于提高自身的编程能力!
结论
通过编写汇编发声程序首先可以了解到产生声音的原理:
PC机通过内置的永久磁铁扬声器产生声音,扬声器和端口42H、43H和61H连接。
在传统的汇编语言程序设计中,选择结构程序设计一般用转移指令(JMP)加标号来实现,这种程序结构实际上并不是真正的选择结构;在循环程序设计中,一般用循环指令(LOOP)或转移指令来实现循环,这种结构也不具有结构化程序中的"WHILE循环"或"REPEAT循环"的结构特征;在程序分支和循环的控制条件方面,每步判断只能判断一个条件,条件增多时,不得不增加判断指令的条数,在这里不能应用逻辑表达式进行条件判断。
本文介绍一些设计选择结构程序、循环结构程序、过程子程序及其他一些用于结构化程序设计的语句及用于多条件判断的逻辑表达式。
利用这些语句可设计具有高级语言结构风格的结构化汇编语言程序。
还可以了解其他更多的汇编知识:
汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。
它同样需要编程者将每一步具体的操作用命令的形式写出来。
汇编程序通常由三部分组成:
指令、伪指令和宏指令。
由于汇编程序的每一句指令只能对应实际操作过程中的一个很细微的动作,例如移动、自增,因此汇编源程序一般比较冗长、复杂、容易出错,而且使用汇编语言编程需要有更多的计算机专业知识,但汇编语言的优点也是显而易见的,用汇编语言所能完成的操作不是一般高级语言所能实现的,而且源程序经汇编生成的可执行文件不仅比较小,而且执行速度很快。
高级语言是目前绝大多数编程者的选择。
和汇编语言相比,它不但将许多相关的机器指令合成为单条指令,并且去掉了与具体操作有关但与完成工作无关的细节,例如使用堆栈、寄存器等,这样就大大简化了程序中的指令。
同时,由于省略了很多细节,编程者也就不需要有太多的专业知识。
所以此次的汇编应用课程设计大作业中,使我掌握了DOS的中断,BIOS的中断,以及键盘硬中断的BIOS号中断等。
通过多次上机和指导老师的指导下从多方面掌握播放声音技术,使我对汇编知识有了更深一步的掌握。
在汇编课程设计中,由于知识的局限,程序设计中难免有不足之处,我体会出知识是在平时的学习中是一点一点积累的,而且在学习中要刻苦学习,虚心请教。
才能不断提高和完善自己的编程能力和水平!
从而在以后的学习与生活中要注重积累,对汇编语言进行全面的掌握和更好的应用
谢辞
谢谢一直支持帮助鼓励我的朋友玉仙,还有生我养我的父母以及我的所有的亲人,感谢他们一直这样支持我鼓励我,还要谢谢我们尊敬的老师,没有老师的教导我很难自己编写出程序来,还有寝室里我的电脑儿子和电风扇朋友,让我能完成这个任务。
还有借给我参考书的图书馆,还有学校,晚上不熄灯,不断电,使我们有充分的时间完成该课程设计。
还有中国铁通为我们装的宽带(虽然付了钱的),最后感谢大米!
让我能活下来!
参考文献
《IBMPC汇编语言程序设计(第五版)中文版》
人民邮电出版社
2002年4月
《80x86汇编语言程序设计教程》
清华大学出版社出
杨季文编
《IBM-PC汇编语言程序设计》
沈美明温冬婵编著
出版社:
清华大学出版社
《PC机汇编语言实战精解》
李春生编著
出版社:
南开大学出版社
附录A:
源程序
stacksegmentpara'stack'
db64dup('stack...')
stackends
dsegsegmentpara'data'
tigerdb0ah,0dh,'twotigers!
$'
mus_freqdw2dup(262,294,330,262)
dw2dup(330,349,392)
dw2dup(392,440,392,349,330,262)
dw2dup(294,196,262),0ffffh
mus_timedw6dup(10000),20000
dw2dup(10000,10000,20000)
dw12dup(10000),40000
dsegends
csegsegmentpara'code'
assumecs:
cseg,ds:
dseg,ss:
stack
musicprocfar
pushds
subax,ax
pushax
movax,dseg
movds,ax
leadx,tiger
movah,9
int21h
leasi,mus_freq
leabp,ds:
mus_time
freq:
movdi,[si]
cmpdi,-1
jeend_mus
movbx,ds:
[bp]
callgensound
addsi,2
addbp,2
jmpfreq
end_mus:
ret
musicendp
gensoundprocfar
pushax
pushbx
pushcx
pushdx
pushdi
moval,0b6h
out43h,al
movdx,12h
movax,3280h
divdi
out42h,al
moval,ah
out42h,al
inal,61h
movah,al
oral,3
out61h,al
wait1:
movcx,55afh
delay:
loopdelay
decbx
jnewait1
moval,ah
out61h,al
popdi
popdx
popcx
popbx
popax
ret
gensoundendp
csegends
endmusic