汇编语言课程设计报告Word格式.docx
《汇编语言课程设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《汇编语言课程设计报告Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
当产生定时中断时(由8259A的IRQ0引起),CPU转入BIOS的08H号中断处理程序,在该中断处理程序中是一条软中断指令“INT1CH”,而在该软中断程序中只有一条IRET指令,这样系统每秒钟产生18.2次定时中断,调用18.2次INT1CH,这为开发者提供了一个编写与时间有关的程序的软中断接口,上例的定时响铃就是借用这个软接口实现的。
其具体操作如下:
(1).在时钟显示程序,截获1CH号中断,在新的1CH中断处理程序安排一个计数器,记录调用的次数,每18次(约一秒钟)显示一次当前时间。
(2).利用BOIS的1AH号中断的0号功能,读取当前计时器的数值:
入口参数:
AH=02H
执行:
INT1AH
出口参数:
AL=午夜信号,CH=时的BCD码,CL=分的BCD码,DH=秒的BCD码
(3).分别利用BIOS的10H号中断的13H号功能和DOS的21H中断的2AH号功能,实现在屏幕的右上角显示时间及日期。
(4)在主程序中要保存原1CH号中断的中断向量,并设置新的时钟显示中断程序的中断向量,然后作其它工作,如调用BIOS的键盘中断INT16H的0号功能,等待用户按键盘,也就是等待中断的发生,并在屏幕右上角显示时间及日期,当用户按键后,主程序工作完成后,恢复原1CH中断向量。
2.在定时中断发生时同时调用发声程序实现响铃。
发声程序用定时器驱动扬声器方式,这是直接利用8253/8254定时器产生声音的一种方法。
定时器2的GATE2与8255A的端口61H的PB0相连,当PB0=1时,GATE2获得高电平,使定时器2可以在模式3(方波)下工作。
定时器2的OUT2与端口61H的PB1通过一个与门与扬声器的驱动电路相连,如下图所示。
当PB1=1时,允许OUT2输出的频率信号到达扬声器电路。
定时器驱动扬声器方式发声原理
定时器2输出的方波频率取决与初始化定时器时提供的计数初值,即对CLK2端的计数脉信号的分频系数。
加在CLK2端上的频率为1193100赫之=12348CH赫之,送入定时器2的计数初值为:
12348CH÷
发声频率。
四.设计步骤
1.分析题目内容及要求,绘制程序流程图;
2.编写程序代码;
3.上机调试查错并修改;
4.运行程序,是否满足设计要求及符合实验内容,并作出相应修改;
5.完成设计实验报告内容填写。
五.设计程序流程图
1.主程序流程图:
2.中断程序:
3.读取时间子程序:
4.响铃子程序:
5.演奏乐曲子程序:
六.设计程序代码
count_val=18;
间隔数(约为一秒)
dpage=0
row=3
column=85-buff_len
color=11h;
显示属性
.286
.modelsmall
.data
Musfredw330,294,262,294,3dup(330);
频率表
dw294,294,294,330,392,392
dw294,294,330,294,262
dw330,392,330,294,330,392,330,294,330
dw330,392,330,294,262,294,330,392,294
dw262,262,220,196,196,220,262,294,330,262
dw-1
mustimedw6dup(25),50;
节拍时间表
dw2dup(25,25,50)
dw12dup(25),100
dw3dup(50),25,25,50,25,25,100
dw2dup(50,50,25,25),100
dw3dup(50,25,25),100
.code
countdwcount_val
yydb?
xxdb?
hhhhdb?
?
"
:
"
mmmmdb?
'
'
ssssdb?
db0ah
mess1db4dup(?
)
db"
/"
mess2db2dup(?
mess3db2dup(?
db0dh,0ah,24h
yeardw?
monthdb?
daydb?
buff_len=$-offsethhhh;
显示信息长度
cursordw?
;
保存当前光标位置
new1ch:
cmpcs:
count,0;
是否到显示时候
jznext;
是转next
deccs:
count;
否则间隔计数器减1
iret;
中断返回
next:
movcs:
count,count_val;
间隔计数器重置初值18
sti;
开中断
pusha;
保护现场
pushds
pushes
pushcs;
填写DS和ES
popds
popes
callget_t;
读取系统时间及日期
movbh,dpage;
BX←页号
movah,3;
取原光标位置
int10h
movcursor,dx;
保存原光标位置
movbp,offsethhhh;
bp←时间信息串首地址
movbh,dpage
movdh,row
movdl,column
movbl,color
movcx,buff_len
moval,0;
a1←显示模式,移动光标
movah,13h;
显示时钟
movdx,cursor
movah,2;
恢复光标原位置
popes;
恢复现场
popa
cmpyy,0
jnzrrr
callmusic
rrr:
decyy
callring
iret
get_tproc;
取当前系统时间和日期过程
取时间信息
int1ah
moval,ch
callttasc;
调用转换压缩BCD码为ASCII码子程序
xchgah,al
movwordptrhhhh,ax;
保存小时数
moval,cl
callttasc
movwordptrmmmm,ax
moval,dh
xchgah,al
movwordptrssss,ax
movah,2ah;
取日期数信息
int21h
movyear,cx
movmonth,dh
movday,dl
movax,year
movbx,lengthmess1
movsi,offsetmess1
calltodasc
moval,month
xorah,ah
movbx,lengthmess2
movsi,offsetmess2
moval,day
movbx,lengthmess3
movsi,offsetmess3
ret
get_tendp
ttascproc;
时间调用转换压缩BCD码为ASCII码子程序
pushcx
movah,al
andal,0fh
movcl,4
shrah,cl
addax,3030h
popcx
ttascendp
todascproc;
日期调用转换为ASCII码子程序
pusha
movcx,10
t1:
xordx,dx
divcx
adddl,30h
mov[si+bx-1],dl
decbx
jnzt1
todascendp
gsoundproc
moval,10110110b;
定时器2控制字,方式3,输出方波
out43h,al
movdx,12h;
dx|ax←11933100hz
movax,348ch
divdi
out42h,al;
定时器2分频系数
moval,ah
out42h,al
inal,61h;
a1←61h口
movah,al;
61h口原数保存到ah中
oral,03h;
61h口的pb和pb置1
out61h,al;
本行执行后即开始发声
wait1:
movcx,8289h
callwaitf
jncwait1
moval,ah;
恢复61h口原数据
out61h,al
gsoundendp
ringproc
pusha
movdx,10000;
dx←发声次数
d1←0(发声开关)
andal,0fdh;
d1取反
sound:
xoral,02h
movcx,05fffh;
cx延时循环初值
ww:
loopww
decdx
jnesound
ringendp
musicproc
moval,xx
movyy,al
movax,@data
movds,ax
leasi,musfre;
取频率表的首地址
leabp,ds:
mustime;
取节拍时间表首地址
freq:
movdi,[si];
di←频率
cmpdi,-1;
结束演奏?
jeend_mus
movbx,[bp];
bx←节拍时间值
callgsound;
调用发声程序
addsi,2;
指向下一个发声频率
addbp,2
jmpfreq;
继续演奏下一个音节
end_mus:
ret
musicendp
waitfproc;
CX=COUNTOF15.08us
pushax
waitf1:
inal,61h
andal,10h
cmpal,ah
jewaitf1
loopwaitf1
popax
waitfendp
old1chdd?
start:
movax,@code
movds,ax
movah,1
int21h
movah,30h
subal,ah
movxx,al
pushcs
popds;
填写DS
movax,351ch;
取1CH号中断向量
int21h
movwordptrold1ch,bx;
保存向量偏移地址
movwordptrold1ch+2,es
movdx,offsetnew1ch;
dx新时钟中断入口偏移地址
movax,251ch;
新中断段地址已在DS中
int21h;
设置新的1CH号中断向量
movah,0;
等待按键(即等待中断发生)
int16h
ldsdx,old1ch;
DX原中断入口偏移地址
movax,251ch;
恢复原中断向量
movah,4ch
endstart
七..心得体会
为期两周的汇编语言课程设计结束了,回想起来收获颇多。
在最开始接触到这个题目的时候,我完全是一头雾水,不知道从何入手。
因为在系统学习汇编语言课程的时候,我们学得比较浅显,根本没有做过综合性这么复杂得东西。
但是,我没有选择放弃,年轻人嘛,不能轻易对自己说不行,应该努力的去奋斗,即使最后是失败,也不会后悔,至少曾经为此努力过。
所以在接下来的时间里,首先我把最基础的汇编语言知识复习了一遍。
然后我到处查阅资料。
但是仅仅这些是不够的,最关键的是要弄清楚这个实验的落脚点儿在哪儿,所以我静下心来,好好的分析了这个实验,最后发现这个实验可以分成三个模块,一,显示系统日期时间;
二,实现每秒响铃一次;
三,实现定时奏音乐。
但是这是不够的,最最关键的是怎样把这三个模块融合到一起,这点儿也是困扰我的最大的难题。
但是我没有退缩,我积极请教,在同学的提示帮助下,我获得了思路,最后完成了这个实验。
这两周,虽然很辛苦,但是我体会到了成功的喜悦,感受到了努力过后获得成功带给我的那种震撼,那种感动。
所以,在我看来,自己最大的收获不是做出了这个东西,而是学会了一种精神,一种面对困难不退缩,为了成功不懈奋斗的精神。
八.参考文献:
[1]胡久永《汇编语言程序设计实验教程》,重庆交通学院
[2]戴梅萼等编《微型计算机技术及应用——从16位到32位》,清华大学出版社
[3]杨季文等编《80x86汇编语言程序设计教程》,清华大学出版社