显示计时器-汇编语言课程设计报告.doc

上传人:PIYPING 文档编号:10550727 上传时间:2021-05-23 格式:DOC 页数:12 大小:145KB
返回 下载 相关 举报
显示计时器-汇编语言课程设计报告.doc_第1页
第1页 / 共12页
显示计时器-汇编语言课程设计报告.doc_第2页
第2页 / 共12页
显示计时器-汇编语言课程设计报告.doc_第3页
第3页 / 共12页
显示计时器-汇编语言课程设计报告.doc_第4页
第4页 / 共12页
显示计时器-汇编语言课程设计报告.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《显示计时器-汇编语言课程设计报告.doc》由会员分享,可在线阅读,更多相关《显示计时器-汇编语言课程设计报告.doc(12页珍藏版)》请在三一文库上搜索。

1、汇编语言课程设计 实验题目:常驻内存时钟 学 院:石油化工学院 指导老师:魏宝武 班 级:计算机科学与技术2班姓 名:高帅 学 号: 21号地 点:机房 时 间: 17、18周沈阳工业大学汇编程序设计报告设计目的 运用汇编语言编制程序以实现各种功能将所学汇编语言知识综合起来运用于实际设计要求能灵活运用汇编语言进行编程学习运用调用中断指令实现各种操作学习中断服务程序设计方法了解com程序的基本格式 设计内容本设计的程序结构大致如下:1伪指令 进行数据常量赋值(CURSOR字符显示所在列值 ATTRIB字符属性值)2代码段 由于本程序属com类型,所以只有一个段即代码段。3数据变量定义、分配空间(

2、OLDCUR 为原光标所在列值 OLD1C 原1C号中断向量的入口地址 )4中断服务程序 取代原中断向量INT 1CH。此中断当每次系统时钟发出信号时发出中断,运行显示时间的常驻内存程序。中断服务程序子程序:SHOWBYTE 显示时间子程序,入口参数为BX。调用SHOW、CURMOVE子程序。SHOWCOLON 显示时间中的“:”子程序,无入口参数。SHOW 在显示器的DOS界面里显示字符、数字,入口参数AL。CURMOVE 移动光标子程序,无入口参数。5中断程序设置部分 将中断服务程序设置成第1CH号中断向量并常驻内存。设计程序执行过程分析 经分析此程序为com类型的程序,原因是本程序大致上

3、符合com程序格式。Com 程序的汇编语言格式如下:NAME 模块名(可有可无)段名 SEGMENT ASSUME 段寄存器地址说明 ORG 100H START:JMP BEGIN 数据空间预置 BEGIN:指令1 指令2 指令n 段名 ENDS END STARTCom程序的源程序形式不允许分段,程序中用到的数据定义、存储空间预置、堆栈区域以及程序代码均在仅有的一个段内。程序运行的起点必须是100H。程序结束使用END。按一般编程的习惯,将要定义的数据空间预置放到了程序前面并用JMP指令跳过。在本程序中唯一不符合格式处为没有设置程序运行起点为100H。程序执行过程中所用到的中断向量表如下:

4、INTAH 功能调用参数返回参数102置光标位置BH=页号DH,DL=行,列103读光标位置BH=页号CH=光标起始位置DH,DL=行,列109在光标位置显示字符及其属性BH=显示页AL=字符BL=属性CX=字符重复次数1A2读实时钟CH:CL=时:分(BCD数)DH,DL=秒:1/100秒(BCD数)1C定时器控制的软中断,每次系统时钟信号出现时发出中断2125设置中断向量DS:DX=中断向量AL=中断类型号2131结束并驻留AL=返回码DX=驻留区大小2135取中断向量AL=中断类型ES:BX=中断向量程序过程具体分析如下: 首先,程序开关进行了数据常量的定义,定义了数字显示所在列为69(

5、45h)位于屏幕右侧,和数字显示时的属性值2fh.然后进行代码段的定义,com程序只有一个段,即代码段 从start开始jmp go 转移指令为com程序固定格式,跳过数据空间预置和自定义的中断服务程序以及其调用的子程序.转到go.标号go后面的程序为顺序结构,进行中断程序的设置中作.先将CS的内容压栈送入DX中,将AX的内容设置为351H.AH=35H为取中断向量,AL=1CH为中断向量类型,即也1CH号中断向量的CS:IP.将BX-OLD1C,ES-OLD1C+2,即OLD1C中存储原1CH中断向量的CS:IP.取标号NEWINT1C的偏移地址送入DX中,(程序开始处已设置DS:CODE)

6、所以此时,DS:DX中为新的INT 1CH的中断向量入口地址.设置AX内容为251CH,AH=25H为设置中断向量,AL=1CH为中断向量类型,即设置INT 1CH的中断向量入口地址为DS:DX,调用INT 21H,将NEWINT1C的位置登记为1CH号中断向量的入口地址.接下来要将新的中断向量,设置为常驻内存的程序.正常情况下,当程序结束后,其所占内存被DOS收回,中断服务程序即不可再用,若想让程序退出后中断服务程序所占内存仍然保留,以使为后续程序提供中断服务.则必须让中断服务程序驻留内存.DOS的31H号功能调用可实现终止并驻留内存.DX=驻留内存节数,AL=退出码,无出口参数.DX中要指

7、出节数而不是字节数,1节等于16个字节,设需要驻留部分长度为n个字符.计算公式为DX=(n/16)+1+16式中加加1是为了防止n不是16整数倍时将余数部分考虑上,再加16是因为DOS在启动应用程序时会在程序前加上一段前缀PSP (DOS管理程序用的数据结构).它需要和程序一块驻留内存.PSP占256字节,正好16节.取标号GO的偏移地址存入DX,用DX减START处的偏移地址即得到需驻留内存程序长度,将DX再右移4位即实现除以16的操作再加11H(17),DX中便为常驻内存需的节数,调用INT 21H的31H号功能,程序驻留内存并终止.中断服务程序部分:在本设计中的中断服务程序是将原INT

8、1CH取代,换成显示时钟的中断程序,而显示时钟的常驻内存的中断程序,需要实时调用,所以在取代原1CH号中断后没有将其恢复,如果恢复原1CH的中断程序将无法连续的显示当前时间.中断服务程序入口NEWINT1C,保存标志寄存器,保存AX,BX,CX,DX.段间调用原1CH中断向量对应的中断程序.(对于INT 1CH对诮的中断程序不可缺少,删除这条语句程序运行不正常,甚至出现死机的现象)读光标位置.BH=0为显示页号(图形方式)调用INT 10H的3号功能返回CH,DH,DL=行,列.将DX内容存入OLDCUR中设置光标位置,同样BH清0,将自定义CURSOR光标位置给DX,即00行,69列,调用I

9、NT 10H的2号功能.调用INT 1AH 2号功能,读系统时钟,返回CH:CL=时:分,DH:DL=秒:1/100秒,返回参数均为BCD数.秒,时,分压栈,将时分出栈存入BX,再将BX压栈.调用SHOWBYTE,显示时间数字子程序,入口参数BXSHOWBYTE子程序: 保护BX压栈,将BHAL,即AL中为小时数,AL右移4位为小时的十位,加30H变成ASCII码调用SHOW子程序显示小时的十位,入口参数AL.SHOW子程序:保护AX,BX,CX压栈.AL中为欲写字符,BX=ATTRIB设置BH=0显示页号,BL=2FH欲写字符的属性.CX=1为写字符次数.调用INT 10H 在光标处显示字符

10、执行后光标位置不变,显示小时的十位,恢复CX,BX,AX内容,子程序返回.调用CURMOVE子程序使光标移到下一位置.CURMOVE子程序:AX,BX,CX,DX寄存器保护调用INT 10H 3号功能读取光标位置,返回DX,DL=列值,DL加1,光标移向下一列.恢复DX,CX,BX,AX内容.返回SHOWBYTE程序.恢复BX内容为时,分.取BH=小时,送入AL,取AL低4位,即小时的个位.调用SHOW显示小时的个位数字,入口参数AL,执行过程同前.调用CURMOVE移动光标,过程同前.返回中断服务程序.调用SHOWCOLON子程序调用显示时间中的“:”字符.SHOWCOLON子程序:将“:”

11、送入AL中调用SHOW子程序在屏幕上.执行过程同前.返回中断服务程序.恢复BX内容为时,分,交换BH,BL的内容.将分钟的值放在BH中.调用SHOWBYTE子程序显示分钟.执行过程同前.调用SHOWCOLON子程序显示“:”, 执行过程同前.把秒的值存入BX,用以显示秒.调用SHOWBYTE子程序显示秒,执行过程同前.返回中断服务程序.OLDCURDX,调用INT 10H,2号功能设置光标位置为运行前的位置.恢复DX,CX,BX,AX,及标志寄存器F的内容.中断返回,恢复现场,中断服务程序结束.设计程序运行及结果 COM程序执行后,中断服务程序设置为INT 1CH 类型,此类型中断被INT 8

12、H(8253/8254计数器)中断调用,每秒执行18.2次.即每次系统时钟出现时发出中断,所以当COM程序执行后,马上发生中断执行显示时钟的中断服务程序,而中断每秒18.2次,屏幕上的时钟便在人眼来看是始终显示在屏幕的右上角.程序执行结果:在DOS界面下的右上角显示当前时钟执行结果如下图:程序流程图如下:2开始取中断服务程序的入口地址送入DX数据常量赋值调用INT 21 的25号功能将中断服务程序设置为1C类型中断向量代码段定义JMP GO计算中断服务程序的长度送入DX数据空间预置调用INT 21的31号功能使程序正常结束并常驻内存中断服务程序调用INT 21 的35号功能取1C的中断向量地址

13、 GO:结束将原1C号中断向量地址存入OLD1C中1 4中断服务程序开始调用SHOWBYTE程序显示BH中的秒各寄存器保存OLDSURDX 调用INT 10 2号功能光标返回中断前位置段间调用原INT 1CH的中断程序各寄存器内容恢复调用INT 21 的3号功能读当前光标位置 返回行列值中断返回恢复现场原光标位置存入OLDSOR中断服务程序结束调用INT 21 1A号功能读当前时钟.返回CX,DXSHOWBYTE子程序开始将DX压栈,CXBX,BX压栈保护BX内容保护调用SHOWBYTE子程序显示时间数字,显示小时将BH中内容送入AL调用SHOWCOLON子程序显示“:”“:”取AL的高4位即

14、时间的十位转换为ASCII码交换BH,BL的内容调用SHOW子程序显示AL中的数字调用SHOWBYTE显示此时BH的内容,显示分钟调用CURMOVE光标移向下一位置调用SHOWCOLON显示“:”将BH中的时间的个位送入AL ,转换成ASCII码DXBX 开始显示秒5386DL加1,移向下一列调用SHOW显示数字调用INT 10 2号功能,将光标移向下一位置移动光标到下一位置各寄存器内容恢复RET返回中断服务程序RET 返回SHOWBYTE或SHOWCOLON程序SHOWBYTE结束返回中断CURMOVE结束SHOW子程序开始SHOWCOLON子程序开始AL中为“:”各寄存器内容保护调用SHO

15、W显示AL中的字符调用INT 10 9号功能显示AL中字符调用CURMOVE将光标移向下一位置各寄存器内容恢复RET 返回SHOWBYTE 或SHOWCOLON程序RET 返回中断程序SHOWCOLON结束SHOW子程序结束CURMOVE子程序开始各寄存器保护调用INT10 2号功能读光标位置,取列值7设计程序代码:CURSOR EQU 45H ATTRIB EQU 2FHCODE SEGMENTASSUME CS:CODE,DS:CODESTART: JMP GOOLDCUR DW ?OLD1C DW 2 DUP(?)NEWINT1C: PUSHFCALL DWORD PTR CS:OLD1

16、CPUSH AXPUSH BXPUSH CXPUSH DX XOR BH,BHMOV AH,3 ;读光标位置 INT 10H ;显示器驱动程序 MOV CS:OLDCUR,DX MOV AH,2 ;设置光标位置XOR BH,BH MOV DX,CURSOR ;自定义CURAOR光标位置给DX;即第00行,第69列(45H) INT 10H ;显示器驱动程序MOV AH,2 ;读CMOS时钟,即系统时钟CH=小;时,CL=分,DH=秒(都为BCD数) INT 1AH ;时钟驱动程序 PUSH DX PUSH CX ;将CX小时寄存器给BX,CX备用POP BX ;CX-BX PUSH BX ;保

17、护BX CALL SHOWBYTE ;调用显示时间数字的子程序 CALL SHOWCOLON ;调用显示:的子程序入口参数AL POP BX XCHG BH,BL ;交换BH BL为的是显示分 CALL SHOWBYTE CALL SHOWCOLON POP BX ;把DX给BX,现在开始显示秒 CALL SHOWBYTE ;调用显示时间数字的子程序 MOV DX,CS:OLDCUR ;调用光标的地址MOV AH,02H ;10号功能AH=2是设置光标位置XOR BH,BH ;BH清0,为图形方式INT 10H ;10号功能调用 POP DX POP CX POP BXPOP AXIRETSH

18、OWBYTE PROC NEAR ;显示时间数字子程序入口参数BH PUSH BX MOV CL,04H MOV AL,BH ;先将小时的十位给AL,比;如12点,这个是转变1的 SHR AL,CL ;将小时的数转化为ASCII码ADD AL,30H CALL SHOW ;调用显示子程序CALL CURMOVE ;移动光标POP BX ;再将小时的个位给AL,比如;12点,这个是转变2的MOV AL,BHAND AL,0FHADD AL,30HCALL SHOW ;调用显示子程序CALL CURMOVE ;调用移动光标子程序 RETSHOWBYTE ENDPSHOWCOLON PROC NEA

19、R ;显示时间中的: MOV AL,: CALL SHOW CALL CURMOVE RET SHOWCOLON ENDP CURMOVE PROC NEAR ;移动光标子程序,就好像在;DOS中,按空格,光标后移一个位置 PUSH AXPUSH BXPUSH CXPUSH DXMOV AH,3 ;读光标位置MOV BH,0 ;BH为显示页号BH=0是图形方式INT 10H ;10H号功能是显示器驱动程序 INC DL ;DH,DL=行,列值MOV AH,2 ;设置光标位置INT 10HPOP DX POP CXPOP BXPOP AXRET CURMOVE ENDPSHOW PROC NEA

20、R ;这个子程序功能是在显示器上显示数字PUSH AX PUSH BXPUSH CXMOV AH,09H ;在当前光标处写字符的代码和属性 MOV BX,ATTRIB ;BH=00显示页号,BL=2F欲 ;写字符的属性MOV CX,1 ;字符计数 INT 10HPOP CXPOP BXPOP AX RET SHOW ENDP GO: PUSH CS POP DSMOV AX,351CH ;AH=35H 取中断向量;AL=1CH为中断向量号,该中;断被INT 8H(即8253/8254 ;计数器)中断调用,每秒执行18.2次 INT 21H ; 中断返回参数ES:BX MOV OLD1C,BX MOV BX,ES MOV OLD1C+2,BX MOV DX,OFFSET NEWINT1C;中断程序入口地址MOV AX,251CH ;AH=25H设置中断向 ; 量,AL=1CH为中断向量号 INT 21H MOV DX,OFFSET GO ;常驻内存程序的长度 SUB DX,OFFSET START MOV CL,4SHR DX,CLADD DX,11HMOV AX,3100H ;AH=31H程序常驻内存INT 21HCODE ENDSEND START

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

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1