汇编语言课程设计报告.docx
- 文档编号:5845331
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:16
- 大小:134.66KB
汇编语言课程设计报告.docx
《汇编语言课程设计报告.docx》由会员分享,可在线阅读,更多相关《汇编语言课程设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
汇编语言课程设计报告
《实时钟显示与定时控制设计》
课程设计报告
专业:
电子信息工程
班级:
08级3班
姓名:
学号:
所属课程:
微机原理与接口技术
实验室:
指导教师:
2010年7月4日
一.课程设计目的…………………………………………………2
二.课程设计要求…………………………………………………2
三.课程设计内容…………………………………………………2
四.设计步骤…………………………………………………3
五.设计程序流程图………………………………………………3
六.设计程序代码………………………………………………7
七.心得体会………………………………………………13
八.参考文献………………………………………………14
一.课程设计目的
通过本课程设计,综合应用接口技术各汇编语言程序设计技术,在PC机上实现时钟显示、定时和响铃,以提高接口、汇编技术的应用能力。
二.课程设计要求
1.利用BIOS和DOS的系统功能调用,能将计算机系统的日期和时间读出并显示出来。
2.用“时:
分:
秒”(都是两位)的形式连续显示系统时间。
3.利用定时接口芯片每秒钟响一次铃。
4.提示输入定时时间(即定时秒数),每经历指定的秒数,则演奏乐曲。
三.课程设计内容
1.利用定时中断实现时钟显示。
当产生定时中断时(由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(?
)
db"/"
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
pushds
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;显示时钟
int10h
movbh,dpage
movdx,cursor
movah,2;恢复光标原位置
int10h
popes;恢复现场
popds
popa
cmpyy,0
jnzrrr
callmusic
rrr:
decyy
callring
iret
get_tproc;取当前系统时间和日期过程
movah,2;取时间信息
int1ah
moval,ch
callttasc;调用转换压缩BCD码为ASCII码子程序
xchgah,al
movwordptrhhhh,ax;保存小时数
moval,cl
callttasc
xchgah,al
movwordptrmmmm,ax
moval,dh
callttasc
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
calltodasc
moval,day
xorah,ah
movbx,lengthmess3
movsi,offsetmess3
calltodasc
ret
get_tendp
ttascproc;时间调用转换压缩BCD码为ASCII码子程序
pushcx
movah,al
andal,0fh
movcl,4
shrah,cl
addax,3030h
popcx
ret
ttascendp
todascproc;日期调用转换为ASCII码子程序
pusha
movcx,10
t1:
xordx,dx
divcx
adddl,30h
mov[si+bx-1],dl
decbx
jnzt1
popa
ret
todascendp
gsoundproc
pusha
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
decbx
jncwait1
moval,ah;恢复61h口原数据
out61h,al
popa
ret
gsoundendp
ringproc
pusha
movdx,10000;dx←发声次数
inal,61h;d1←0(发声开关)
andal,0fdh;d1取反
sound:
xoral,02h
out61h,al
movcx,05fffh;cx延时循环初值
ww:
loopww
decdx
jnesound
popa
ret
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
movah,al
loopwaitf1
popax
ret
waitfendp
old1chdd?
start:
movax,@code
movds,ax
movah,1
int21h
movah,30h
subal,ah
movyy,al
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;恢复原中断向量
int21h
movah,4ch
int21h
endstart
七..心得体会
为期两周的汇编语言课程设计结束了,回想起来收获颇多。
在最开始接触到这个题目的时候,我完全是一头雾水,不知道从何入手。
因为在系统学习汇编语言课程的时候,我们学得比较浅显,根本没有做过综合性这么复杂得东西。
但是,我没有选择放弃,年轻人嘛,不能轻易对自己说不行,应该努力的去奋斗,即使最后是失败,也不会后悔,至少曾经为此努力过。
所以在接下来的时间里,首先我把最基础的汇编语言知识复习了一遍。
然后我到处查阅资料。
但是仅仅这些是不够的,最关键的是要弄清楚这个实验的落脚点儿在哪儿,所以我静下心来,好好的分析了这个实验,最后发现这个实验可以分成三个模块,一,显示系统日期时间;二,实现每秒响铃一次;三,实现定时奏音乐。
但是这是不够的,最最关键的是怎样把这三个模块融合到一起,这点儿也是困扰我的最大的难题。
但是我没有退缩,我积极请教,在同学的提示帮助下,我获得了思路,最后完成了这个实验。
这两周,虽然很辛苦,但是我体会到了成功的喜悦,感受到了努力过后获得成功带给我的那种震撼,那种感动。
所以,在我看来,自己最大的收获不是做出了这个东西,而是学会了一种精神,一种面对困难不退缩,为了成功不懈奋斗的精神。
八.参考文献:
[1]胡久永《汇编语言程序设计实验教程》,重庆交通学院
[2]戴梅萼等编《微型计算机技术及应用——从16位到32位》,清华大学出版社
[3]杨季文等编《80x86汇编语言程序设计教程》,清华大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 课程设计 报告