微机原理实习报告电子时钟用汇编语言实现.docx
《微机原理实习报告电子时钟用汇编语言实现.docx》由会员分享,可在线阅读,更多相关《微机原理实习报告电子时钟用汇编语言实现.docx(16页珍藏版)》请在冰点文库上搜索。
微机原理实习报告电子时钟用汇编语言实现
河南农业大学课程设计报告
题目:
电子时钟显示设计
课程:
微型计算机原理
专业:
电子信息工程
班级:
学生姓名:
学号:
指导教师:
完成日期:
机电工程学院
目录
前言……………………………………………………………………………………………………….1第一章绪论…………………………………………………………………………………………….2
一、实习目的…………………………………………………………………………………………2
二、实习要求……………………………………………………………………………………….2
三、设计所需设备……………………………………………………………………………………2第二章软件系统介绍……………………………………………………………………….................3一、中断技术(或其它相关技术…………………………………………………………………….3
(一介绍中断的概念中断技术…………………………………………………………………….3
(二DOS及BIOS中断……………………………………………………………………………..3
二、汇编语言及汇编工具简介………………………………………………………………….3
三、软件介绍………………………………………………………………………………………….3第三章设计分析……………………………………………………………………………………4
一、软件设计思路…………………………………………………………………………………..4
二、软件各模块内容………………………………………………………………………………….4
(一光标定位子程序原理………………………………………………………………………….4
(二清屏原理……………………………………………………………………………………...4
(三字符及字符串显示原理……………………………………………………………………….4
(四压缩BCD转为ASCII码原理………………………………………………………………….5
(五动态扫描键盘原理…………………………………………………………………………...5三、程序流程图设计………………………………………………………………………………….5第四章系统实现……………………………………………………………………………………….7
一、程序原代码清单及详细注释…………………………………………………………………….7
二、实验结果……………………………………………………………………………………..….15总结……………………………………………………………………………………………………...16
一、软件的选取……………………………………………………………………………………...16
二、图案的设计……………………………………………………………………………………...16
三、程序调试……………………………………………………………………………………….16参考文献…………………………………………………………………………………………….....16
前言
软件设计题目
电子时钟。
(在计算机屏幕上显示当前系统的时间,日期,或时间和日期,3人一组
设计目的:
1.了解定时/计数器和中断(DOS/BIOS的使用;
2.掌握定时/计数器和中断的工作原理和编程方法。
编程要求:
1.调用系统时间,在屏幕上显示出来;
2.获取键盘的按键值,判断键值并退出系统。
程序设计参考步骤:
第一部分:
定义显示界面。
第二部分:
调用系统时间(日期,并将调用的用二进制表示的时间数转换成ASCII码,并将时间数(日期数存入内存区。
第三部分:
将存在系统内存区的时间数(日期数用显示字符串的形式显示出来。
第四部分:
获取键盘的按键值,判断键值并退出系统。
第一章绪论一、实验目的
1.理解掌握定时/计数器和中断的使用方法。
2.掌握微机常用的输入输出方式及接口技术。
3.掌握一定的汇编语言知识,培养自己的动手操作能力。
4.学习程序设计的基本思路和方法。
二、实习要求
1.调用系统时间,在屏幕上显示出来;
2.获取键盘的按键值,判断键值并退出系统。
三、设计所需设备:
PC机
第二章软件系统介绍
一、中断技术(或其它相关技术
(一介绍中断的概念中断技术
在微机中,当CPU在执行过程中时,由于随机的事件(包括CPU内部的和CPU外部的事件引起的CPU暂时停止正在执行的程序,而转去执行一个用于处理该事件的程序—称为中断式服务程序(或称中断处理程序,处理完后又返回被终止的程序断点处继续执行,这一过程成为中段(二DOS及BIOS中断
通过调用DOS系统的8号功能实现控制字符的输入,通过调用延时程序实现十分之一秒的定时,通过调用DOS系统的2号功能实现光标定位,调用DOS系统的2号功能实现字符的输出,通过调用DOS系统的9号功能实现字符串的输出。
二、汇编语言及汇编工具简介
汇编语言(AssemblyLanguage是面向机器的程序设计语言。
在汇编语合中,用助记符(Memoni代替操作码,用地址符号(Symbol或标号(Label代替地址码。
这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。
于是汇编语言亦称为符号语言。
使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。
汇编程序把汇编语言翻译成机器语言的过程称为汇编。
EMU8086是学习汇编必不可少的工具,它结合了一个先进的原始编辑器、组译器、反组译器、具除错功能的软件模拟工具(虚拟PC,还有一个循序渐进的指导工具。
Emu8086同主流汇编程序相比,语法简单得多,但是它能生成兼容8086的机器语言。
可以直接对通用寄存器,段寄存器,直接进行汇编编址操作,而且便于直接生成exe文件进行操作。
三、软件介绍
这个电子时钟可以通过DOS命令实现对系统时间进行调用,并且直接显示出来,按‘C’或‘c’直接修改时间,然后按‘ESC’退出此时的程序
第三章设计分析
一、软件设计思路
先在数据段开一段显示缓冲区,用来存储系统时间,调用子程序的清屏部分。
调用DOS中断,得到系统当前时间,并将其二进制转换成ASCII码。
再分别将小时数、分钟数、秒数存入显示缓冲区,在修改时间的时候调用键盘输入输出程序实现时钟的修改功能,然后存入结束字符‘$’。
调用DOS字符串显示功能将时间显示在显示器上,调用屏幕的I/O中断,定位光标的开始位置,将时间显示在预先定义好的位置。
把程序设计成用刷新的方式来不断获取系统的时间,这样就有了会一秒一秒走动的电子时钟。
二、软件各模块内容
(一光标定位子程序原理
DOS显示屏为25行、80列,左上角为(0,0,右下角(18,4F
设置光标,可调用BIOS系统,用汇编语句调用中断INT10H。
入口信息为
(AH=2要设置光标;
(BH=0页号;
(DH,DL=光标的行号、列号
(二清屏原理
开始执行程序时为保证有一个洁净的屏幕,可使显示屏做上滚动作,使屏幕留下一片空白。
要使屏幕上滚,可用汇编语句INT10H,入口信息为
(AH=6使屏幕上滚
(AL=00上滚行数
(CH,CL=滚动区域左上角的行、列号
(DH,DL=滚动区域右下角的行、列号
(BG=00颜色的设置
(三字符及字符串显示原理
通过调用DOS系统模块2只能是西安DL中的一个字符的显示。
为了实现字符串的显示,调用其9号模块功能,其入口信息为
(AH=9显示字符串的功能模块
(DS:
DX指向字符串的首地址,要求字符串以字符‘$’结尾。
4
(四压缩BCD转为ASCII码原理
(1.两位的:
先将压缩BCD码的高4位取出,右移四位后,与30H相或,存到相应内存单元;然后将低4位取出,与30H相或,存到下一内存单元。
(2.一位的:
原数字加30H
(五动态扫描键盘原理
运用INT21H的8号功能来实现动态扫描键盘。
如果有键按下,则相应的键值的ASCII码被存到AL中。
判断AL中的数值,若不是控制字符,则继续循环,从而实现动态扫描键盘。
三、程序流程图设计
5
6
第四章系统实现
一、程序原代码清单及详细注释
;--------------------------------数据段定义阶段-------------------------------------------------------
datasegment
mess1DB'↖^(&&&&^↖(^o^',0ah,0dhDB'&&&&Happy^New~*Year',0ah,0dh
DB'**************',0ah,0dh
DB'****************************ASMASSIGNMENT***********',0ah,0dh
DB'*****************ELECTRONICCLOCK**************',0ah,0dh
DB'************DesignedbyZhangLeiChengQinandWuXiao*',0ah,0dh
DB'************PressCorctocorrectthetime******',0ah,0dh
DB'*************PressESCbuttontoexit************',0ah,0dh
DB'**********',0ah,0dh
DB'********************',0ah,0dh
DB'*********************',0ah,0dh,'$'
TSDB?
0ah,0dh
DB?
0ah,0dh
DB'====**======@@======**=====',0ah,0dh
DB'Pleaseinputthenewtime(hh:
mm:
ss:
',0dh,0ah,'$';提示输入时间的格式mess2db'TheTimeis:
',0ah,0dh,'$'
HCQdb40;在数据段开一段时间显示缓冲区,大小为40个字节
hordb?
;为变量分配一个字节的空间,初值为任意字符
7
mindb?
;为变量分配一个字节的空间,初值为任意字符
secdb?
;为变量分配一个字节的空间,初值为任意字符
dataends
;--------------------------------堆栈段定义阶段-------------------------------------------------
stacksegment
db100dup(?
;定义100个字节的堆栈段
stackends
;--------------------------------代码段定义阶段------------------------------------------
codesegment
assumecs:
code,ss:
stack,ds:
data;确定各个逻辑段的类型
start:
callclear;调用清屏子程序
display:
;时间显示部分
movax,data;将DATA的段基地址送到寄存器AX
movds,ax;将AX寄存器的内容存到DS中
movbx,offsetHCQ;送HCQ的偏移地址到BX
movah,2ch;调用DOS时间调用功能,功能号:
2cH,小时,分钟,秒数int21h;分别保存在CH,CL,DH中
moval,ch;小时数设定
movah,0;此处置零是为了
callC16-10;调用进制转换子程序
incbx
;----------------------------------------------------------
moval,':
';显示分隔符号
mov[bx],al;将寄存器内容存入BX中
incbx;寄存器指向的地址+1
;-------------------------------------------------------
movah,2ch;调用DOS时间调用功能,功能号:
2cH,小时,分钟,秒数
8
int21h;分别保存在CH,CL,DH中
moval,cl;分钟数设定
movah,0;将该位置零
callC16-10
incbx
;-------------------------------------------------------------------------
moval,':
';显示分隔符号
mov[bx],al;将寄存器内容存入BX中
incbx;寄存器指向的地址+1
;---------------------秒的设计---------------------------------
movah,2ch;秒设定
int21h
moval,dh
movah,0;将该位置零
callC16-10
incbx
;----------------------------------------------------------------------
moval,'$';将字符串的结束位送至显示缓冲区的最后一位mov[bx],al
;------------------------------------------------------------------------
pushbx;修改时间显示的地方
movah,2;置光标位置,调用功能号AH=2
movbh,0;置显示模式
movdh,17;DH跟DL分别为行号与列号,并入栈保护BXmovdl,50;显示输出在第17行
int10h;显示输出在51列
popbx
leadx,HCQ;送HCQ偏移地址到DX,并调用DOS显示功能,功能号为9movah,9;调用DOS9号功能,显示字符串
int21h
pushbx
movah,2;置光标位置调用DOS的功能,AH=2
movbh,0;置显示以下模式
movdh,1;修改前面附加的内容的显示位置
movdl,0
int10h
leadx,mess1;取mess1的有效地址赋给DX
movah,9;调用DOS9号功能,显示字符串
int21h
popbx;BX寄存器出栈
pushbx;PUSHBX
movah,2;置光标位置
movbh,0;置显示模式
movdh,17;定位在17行
movdl,35;定位在35列
int10h
popbx
leadx,mess2;取mess1的有效地址赋给DX
movah,9
int21h
;-----------------------------
movah,1;调用键盘I/O中断功能号1,获取键值到ALint16h
cmpal,'c';是c键,转到时间修改程序
jeCor
cmpal,'C';是C键,转到时间修改程序
jeCor
cmpal,1bh
jzquit;是ESC键,退出程序
jmpdisplay
quit:
movah,4ch;程序终止功能号
int21h
ret
Cor:
callcorrect;调用时间修改子程序
;-------------------------------
C16-10PROCNEAR
PUSHCX
MOVAH,0;16位二进制数转换为ASCII码
MOVCX,10D;基数10
DIVCL;用除10取余的方法转换为BCD码(二进制码
ADDAX,3030H;BCD码转换为ASCII码的代码
MOV[BX],AL;此时将低八位的AL加载到BX中,[BX]指的是寄存器BX指向的内存单元
INCBX;BX指向的存储单元加一
MOV[BX],AH
POPCX
RET
C16-10ENDP
;-------------------------------------------
clearprocnear
pushax;入栈保护现场
pushbx
pushcx
pushdx
movax,0600h;ah=06(滚动al=00(全屏空白
movbh,2eh;设置背景颜色(2和前景颜色(e
subcx,cx;将寄存器清零
movdx,5f5fh;设备重定向子功能号功能描述
int10h
popdx;出栈恢复现场
popcx
popbx
popax
ret
clearendp
;----------------------------
correctprocNEAR;时间修改子程序
callinput;调用键盘输入子程序输入数据
movch,hor
movcl,min
movdh,sec
anddl,0h
movah,2dh;调用DOS功能调用系统时间并修改系统时间int21h
jmpstart
ret
correctendp
;-------------------------------------------
inputprocNEAR;键盘输入子程序
pushax;入栈保护数据
pushbx
pushcx
pushdx
pushf
movdx,offsetTS;显示修改时间的格式提示
movah,09h;显示字符串,提示的内容
int21h;调用DOS功能
movdx,OFFSETHCQ;数据缓冲区的数据输入
movah,0ah;带缓存的键盘输入(字符串
int21h
anddx,0h;将寄存器置零
leabx,HCQ;向BX装入有效地址
incbx;地址+1
incbx;跳过‘:
’
movdh,[bx];将[BX]的内容储存到寄存器DH中
subdh,30h;将得到的ASCII码转化为16进制的数据incbx;地址加1
movdl,[bx];分
subdl,30h;转化为16进制的数据
movcl,10;计数器计数十次
moval,dh;将DH的内容送入寄存器
mulcl;通过减30h,再乘10的方法得到该二进制数addal,dl;然后将两个数据相加
movch,al;存入时间
movhor,al;将寄存器的内容存入HOR中
incbx
incbx
movdh,[bx];将ASCII码转换为二进制数
subdh,30h
incbxmovdl,[bx]subdl,30hmovcl,10moval,dhmulcladdal,dlmovcl,almovmin,alincbxincbxmovdh,[bx]subdh,30hincbxmovdl,[bx]subdl,30hmovcl,10moval,dhmulcladdal,dlmovdh,almovsec,alpopfpopdxpopcxpopbxpopaxretinputendp;---------------------------14;乘以10;将ASCII码转换为二进制数;出栈恢复数据
codeendsendstart二、实验结果点击运行后,出现运行的结果如下:
当按下‘c’或‘C’时显示提示符“pleaseinputthenewtime(hh:
mm:
ss:
”15
总结“纸上得来终觉浅,绝知此事要躬行”,这是本次课程设计我最大的体会。
刚开始时,看着老师给的参考材料,心里想“这个课程设计不是很难的事情嘛,把这几个子程序堆一块不就完了”,可是真正做起来时,才发现事情远非想的那么简单。
从上机软件的选取,到课程设计报告的最终完成,我们经历了很多曲折,也收获了很多,下面具体阐述一下。
一、软件的选取古语云:
工欲善其事必先利其器。
汇编语言上机软件和流程图绘制软件的选取对此次课程设计非常重要。
经过对比我们最终选取了EMU8086最终也能熟练操作这款软件。
这是此次设计较大的收获。
二、图案的设计为了能得到一个比较漂亮的界面显示,我们在图案设计上花了不少功夫。
很多次设计的图案很漂亮,可是搬到程序里面运行时却是一堆乱码,让我们很沮丧...还有要把秒表的显示正好调到图案正中央,我们也经过了多次调试。
在这个过程中,我们学会了耐心,去除浮躁,平心静气的把程序一遍遍的修改、调试,臻于完美。
三、程序调试程序调试前,我们检查了好几遍。
可是调试时还是错误百出。
尤其是“;”的使用,一定要区分英文输入的分号和中文分号的区别,还有字符串结束时一定要加‘$’,否则会出现乱码。
这些都是调试中发现的问题,只有注意细节,细心,才能顺利完成任务。
通过本次课程设计,我加深了对课汇编语言的理解,同时熟练掌握了汇编语言的编辑、调试软件。
在以后的学习生活中还要继续保持严谨认真的科学态度,保持不断尝试和探索的耐心,保持勇于解决问题的决心。
不断地向老师、同学们学习、交流,分享吸取他们的经验,更好的提高自己。
参考文献《微型计算机原理》P150~158、P166~171张荣祥中国电力出版社《微型计算机原理与接口技术(第二版)冯博琴吴宁主编清华大学出版社》16