汇编.docx
《汇编.docx》由会员分享,可在线阅读,更多相关《汇编.docx(11页珍藏版)》请在冰点文库上搜索。
汇编
课程设计任务书
学生姓名:
专业班级:
软件工程0401班
指导教师:
杨青工作单位:
计算机科学与技术学院
题目:
乐曲程序
初始条件:
理论:
完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。
实践:
完成了《汇编语言程序设计》的四个实验,熟悉汇编语言程序的设计环境并掌握汇编语言程序的调试方法。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
进一步理解和掌握程序直接控制I/O方式,掌握计算机发声程序的设计。
具体的设计任务及要求:
1.采用位触发方式编写程序,使计算机发出音响并奏出《两只老虎》的乐曲。
1)通过查阅相关资料,进一步理解程序直接控制I/O方式和位触发方式控制声音的工作原理。
2)一首乐曲是由不同频率和节拍的音调组成,因此控制脉冲的频率和持续时间是编写乐曲程序的关键。
根据已知的音符频率对照表,给出乐曲的频率表;设二分音符持续时间为0.5秒(50*10ms),50作为2拍的计数值,给出乐曲的节拍时间表;
3)编写程序并调试通过。
2.进一步学习利用定时器产生声音的方法,使计算机奏出《两只老虎》的乐曲。
在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。
阅读资料:
1)《IBM—PC汇编语言程序设计实验教程》3.1节
2)《IBM—PC汇编语言程序设计(第2版)》10.4节,10.5节
时间安排:
设计安排一周:
周1、周2:
完成系统分析及设计。
周3、周4:
完成程序调试,和验收。
周5:
撰写课程设计报告。
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
乐曲程序
1课程设计的任务和要求
1.1采用位触发方式编写程序,使计算机发出音响并奏出《两只老虎》的乐曲。
1.1.1通过查阅相关资料,进一步理解程序直接控制I/O方式和位触发方式控制声音的工作原理。
1.1.2一首乐曲是由不同频率和节拍的音调组成,因此控制脉冲的频率和持续时间是编写乐曲程序的关键。
根据已知的音符频率对照表,给出乐曲的频率表;设二分音符持续时间为0.5秒(50*10ms),50作为2拍的计数值,给出乐曲的节拍时间表;
1.1.3编写程序并调试通过。
1.2进一步学习利用定时器产生声音的方法,使计算机奏出《两只老虎》的乐曲。
在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。
2关键技术和方法
2.1位触发方式
程序直接控制PPI的输出控制器(I/O端口为61H)的第一位,使该位按所需的频率进行1和0的交替变化,从而控制开关电路产生一串脉冲波形,这些脉冲波形经放大后驱动扬声器发出声音。
如果控制波形的脉宽和长度就可以产生不同频率和不同音长的声音。
采用触发器方式发声的程序段如下:
Inal,61H
Movah,al
Andal,11111100b
sound:
xoral,2
out61h,al
movcxdx
wait:
loopwait
decbx
jnzsound
moval,ah
out61h,al
2.2利用定时器产生声音
CPU通过对定时器的通道2进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值,端口61H的最低位控制通道2门控的开断,以产生特殊的音响。
当定时器接收的计数值为533H时,能产生896Hz的声音。
利用定时器产生指定频率声音的程序段
Moval,10110110b
Out43h,al
Movdx,12h
Movax,34Dch
Divdi
Out42h,al
Moval,ah
Out42h,al
3设计方案和说明
3.1模块说明功能定义和出口参数
3.1.1
为该乐曲定义频率表和节拍时间表。
MUS_FREG1dw2dup(262,294,330,262)
dw2dup(330,349,392)
dw2dup(392,440,392,394,330,262)
dw2dup(294,196,262),-1
MUS_TIME1dw2dup(25,25,25,25)
dw2dup(25,25,50)
dw2dup(12,12,12,12,25,25)
dw2dup(25,25,50)
3.1.2
将两个表的偏移地址放入SI和BP
LEASI,A
LEABP,DS:
B
3.1.3
音符的频率放入DI,音符的持续时间放入BX。
Movdi,[SI]
Movbx,ds:
[BP]
3.1.4调用music的子程序发出音调。
GENSOUNDPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHDI
MOVAL,0B6H
OUT43H,AL
MOVDX,12H
MOVAX,348ch
DIVDI
OUT42H,AL;分两次把ax里
MOVAL,AH;面的内容
OUT42H,AL;输到端口42H
INAL,61H;把端口61H的内容送到AL
MOVAH,AL;保存端口61H的初始内容
ORAL,3;
OUT61H,AL;turnonthespeaker
WAIT1:
;时间延迟
MOVCX,5000
callwaitf
DELAY1:
DECBX
JNZWAIT1
MOVAL,AH;
OUT61H,AL;turnoffthespeaker
POPDI
POPDX
POPCX
POPBX
POPAX
RET
3.2流程图
3.3数据结构的定义和说明
STACKSEGMENT
DB200DUP('STACK……')定义堆栈段
SHOWMACROb
LEADX,b
MOVAH,9
INT21H调用显示字符串
ADDRESSMACROA,B
LEASI,A
LEABP,DS:
B音乐地址
4测试及评估
4.1执行结果
4.2
达到了实验的基本要求,可以播放两只老虎的音乐。
5设计心得
弄这个程序费了很大的劲,但是最后还是不太满意。
有一些问题最后是摆脱同学帮助才搞定。
尤其是关于宏的一些应用,自己临时没学会。
以至于最后验收时仍然有很多的疑问。
不过在学习过程中还是有很多的收获,学会了音乐程序的基本设计,能做一些简单的小程序来实现播放乐曲的功能。
以后我会更加努力学习这方面的知识,争取彻底掌握。
6致谢,参考文献
6.1致谢
本研究及学位论文是在我的老师杨青的亲切关怀和悉心指导下完成的。
她严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。
从课题的选择到项目的最终完成,杨老师都始终给予我细心的指导和不懈的支持。
在此谨向杨老师致以诚挚的谢意和崇高的敬意。
在此,我还要感谢在一起愉快的度过两年生活的各位同门,正是由于你们的帮助和支持,我才能克服一个一个的困难和疑惑,直至本文的顺利完成。
有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚的谢意!
最后我还要感谢培养我长大含辛茹苦的父母,谢谢你们!
6.2参考文献
6.2.1《IBM—PC汇编语言程序设计(第2版)》。
编著:
沈美明,温冬婵。
清华大学出版社,2001年8月
6.2.2《IBM—PC汇编语言程序设计使用教程》。
编著:
沈美明,温冬婵,张赤红。
清华大学出版社,1992年9月
7附录:
源程序清单
;music.asm
;wujian1.252007
;**************************数据段*************************
DATASEGMENT
INFO1DB0DH,0AH,'***************************$'
INFO2DB0DH,0AH,'welcome!
!
$'
INFO4DB0DH,0AH,'INPUTERROR!
$'
INFO5DB0DH,0AH,'PLEASEINPUTAGAIN!
$'
MUSLISTDB0DH,0AH,'Themenu:
'
DB0DH,0AH,'1MUSIC1-----------twotigers'
DB0DH,0AH,'QEXIT-------------exit'
db0dh,0ah,'$'
;*******************音乐
MUS_FREG1dw2dup(262,294,330,262)
dw2dup(330,349,392)
dw2dup(392,440,392,394,330,262)
dw2dup(294,196,262),-1
MUS_TIME1dw2dup(25,25,25,25)
dw2dup(25,25,50)
dw2dup(12,12,12,12,25,25)
dw2dup(25,25,50)
DATAENDS
;*****************************堆栈段**************************************
STACKSEGMENT
DB200DUP('STACK……')
STACKENDS
;*****************************代码段*************************************
CODESEGMENT
ASSUMEDS:
DATA,SS:
STACK,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
MOVaH,0
MOVAL,00
INT10H
;**********用来调用显示字符串的宏
SHOWMACROb
LEADX,b
MOVAH,9
INT21H
ENDM
;**********************音乐地址宏
ADDRESSMACROA,B
LEASI,A
LEABP,DS:
B
ENDM
;***********************
showINFO1
showINFO2
showMUSLIST
INPUT:
MOVAH,01H;输入1和Q来选择开始和退出
INT21H
CMPAL,'Q'
JZretu
CMPAL,'1'
JNZB0
ADDRESSMUS_FREG1,MUS_TIME1
CALLMUSIC
JMPEXIT1
B0:
CMPAL,'2'
JNZC0
CALLMUSIC
JMPEXIT1
C0:
CMPAL,'3'
JNZexit
CALLMUSIC
EXIT1:
showINFO5
JMPINPUT
EXIT:
showINFO4
showINFO5
showINFO1
showINFO2
showMUSLIST
jmpinput
RETU:
MOVAH,4CH
INT21H
;******************************************发声
GENSOUNDPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHDI
MOVAL,0B6H
OUT43H,AL
MOVDX,12H
MOVAX,348ch
DIVDI
OUT42H,AL;分两次把ax里
MOVAL,AH;面的内容
OUT42H,AL;输到端口42H
INAL,61H;把端口61H的内容送到AL
MOVAH,AL;保存端口61H的初始内容
ORAL,3;
OUT61H,AL;turnonthespeaker
WAIT1:
;时间延迟
MOVCX,5000
callwaitf
DELAY1:
DECBX
JNZWAIT1
MOVAL,AH;
OUT61H,AL;turnoffthespeaker
POPDI
POPDX
POPCX
POPBX
POPAX
RET
GENSOUNDENDP
;********************************************
waitfprocnear
pushax
waitf1:
inal,61h;p391
andal,10h
cmpal,ah
jewaitf1
movah,al
loopwaitf1
popax
ret
waitfendp
;*********************************************
MUSICPROCNEAR
PUSHDS
SUBAX,AX
PUSHAX
FREG:
MOVDI,[SI];将SI指向的内容传给DI
CMPDI,-1;判断是否到了到了最后
JEEND_MUS
MOVBX,DS:
[BP]
CALLGENSOUND
ADDSI,2
ADDBP,2
JMPFREG
END_MUS:
RET
MUSICENDP
CODEENDS
ENDSTART