汇编语言课程设计报告Word格式.docx

上传人:b****5 文档编号:18832369 上传时间:2023-01-01 格式:DOCX 页数:16 大小:134.66KB
下载 相关 举报
汇编语言课程设计报告Word格式.docx_第1页
第1页 / 共16页
汇编语言课程设计报告Word格式.docx_第2页
第2页 / 共16页
汇编语言课程设计报告Word格式.docx_第3页
第3页 / 共16页
汇编语言课程设计报告Word格式.docx_第4页
第4页 / 共16页
汇编语言课程设计报告Word格式.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

汇编语言课程设计报告Word格式.docx

《汇编语言课程设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《汇编语言课程设计报告Word格式.docx(16页珍藏版)》请在冰豆网上搜索。

汇编语言课程设计报告Word格式.docx

当产生定时中断时(由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汇编语言程序设计教程》,清华大学出版社

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 职高对口

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1