打字计时新3333Word文件下载.docx

上传人:b****6 文档编号:20697044 上传时间:2023-01-25 格式:DOCX 页数:16 大小:151.62KB
下载 相关 举报
打字计时新3333Word文件下载.docx_第1页
第1页 / 共16页
打字计时新3333Word文件下载.docx_第2页
第2页 / 共16页
打字计时新3333Word文件下载.docx_第3页
第3页 / 共16页
打字计时新3333Word文件下载.docx_第4页
第4页 / 共16页
打字计时新3333Word文件下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

打字计时新3333Word文件下载.docx

《打字计时新3333Word文件下载.docx》由会员分享,可在线阅读,更多相关《打字计时新3333Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。

打字计时新3333Word文件下载.docx

2.课程设计报告书

内容摘要

汇编语言是微机原理和接口设计的基础,微机主机和接口所要实现的功能都要通过汇编语言来实现。

尽管汇编语言设计程序有编程效率低的缺点,但其运行效率高,速度快,并且特别适合很多特殊应用的场合,如加密解密、病毒分析和防治、软件破解等。

这些在应用方面的优点是其他语言不可比拟的,面对硬件的直接控制更是其特长。

因此,在很多高级语言(如C++)中都可嵌入用汇编语言编写的程序段,以实现优势互补,发挥各自的长处。

本程序是一个在键盘上练习打字并能统计时间的程序,在缓冲区中预放了一些字母,运行时,可按照屏幕上显示的字母输入练习,每输入完一行按回车键后,可显示出练习输入的时间。

通过它练习英文打字练习,并能够统计时间。

程序运行时,使用自编的中断向量处理程序。

程序退出时,恢复中断向量。

目录

一、概述………………………………………………………………4

二、方案设计与论证……………………………………………………………4

1.实验目的…………………………………………………………………4

2.实验步骤…………………………………………………………………4

四、设计方案……………………………………………………………………6

1.定义数据段,设置主要参数……………………………………………

2.代码段…………………………………………………………………

3.使用子程序分化各子功能……………………………………………

五、程序代码……………………………………………………………………12

六、实验结果及分析……………………………………………………………17

七、心得体会……………………………………………………………………18

八、参考文献……………………………………………………………………18

一、概述

汇编语言是微型计算机原理及应用的基础,微机主机和接口所要实现的功能都要通过汇编语言来实现。

尽管汇编语言程序设计编程效率低,但其运行效率高、速度快。

因此掌握汇编语言是学好微机原理和接口设计的第一步。

打字计时程序主要是中断的使用,难点在于键盘中断的重新写入以及自编的定时中断。

二、方案设计与论证

1、实验目的:

熟悉和掌握有关键盘和时间的中断及字符显示技术。

2、实验步骤:

1)设计思路:

在键盘上练习的打字例句及其地址表、计时单元等预先放在DATA数据段中,自编的中断程序kbint检测按键时产生的中断,并把按键的扫描码转换为ASCII码存入缓存区buffer,这个工作和ROM09类型的键盘中断例行程序所完成的工作大致相同,只是在解释各个键时作了简化,即只解释了可显示字符,如英文字母、数字及一些符号;

其他特殊键,如组合键、双态键、功能键等都未作解释,只作为字符码0来处理。

在主程序部分保存原09类型的中断向量,设置自编例行程序的中断向量,设置中断屏蔽位,然后开中断。

当键盘中断处理后,主程序中安排指令读取缓冲区中的字符并显示在屏幕上。

在主程序的末尾,利用DOS功能恢复原09类型的中断向量,然后返回DOS。

在显示键入的字符时,还应判断字符是否为回车(0DH)。

如为回车符,说明一个句子输入完毕,此时调用显示时间的子程序显示出打字时间,然后顺序显示下一个例句。

如果所存放的例句都已显示完,则又从第一个例句开始显示,直至键入某一功能键(如Esc键、Shift键等)退出程序,结束打字练习。

打字时间统计利用自定时器中断处理程序clint来完成。

每输完一例句,计时一次。

在此中断例行程序中,定时器中断的次数记录在计数单元count中,当count计数值为18时,sec计数单元加1,当sec计数值达到60时,min计数单元加1。

因为输入完一个句子无论如何也不会达到小时级,所以对hours计数值的调整判断,实际上只起到退出定时器中断的作用。

显示时间的子程序disptime分别将各遍野单元的二进制数转换为十进制数,并以min:

sec:

msec的形式显示出来。

其中msec是由count记数值转换成的:

count×

1秒/18.2=count×

55ms

2)设计流程图,如下图所示

三、设计方案

1.定义数据段,设置主要参数:

缓冲区:

BUFFER,BUFPT1,BUFPT2

2.代码段

调用中断8259,键盘中断,时钟中断,设置打字计时文件程序顺序

3.使用子程序分化各子功能

DISPTIMEPROCNEAR

BINDECPROCNEAR;

将二进制转化为十进制显示时间

DECDIVPROCNEAR;

转化成字符显示

DISPCHARPROCNEAR

KBGETPROCNEAR;

获取键盘键入的信息

KBINTPROCNEAR;

查表查到相应的字符

RESET09PROC;

重新设置09号中断

RESET1CPROC;

重新设置1c功能

RESETPROC;

回复1C与09

四、程序代码

STACKSEGMENTPARASTACK'

STACK'

DB256DUP(0)

TOPLABELWORD

STACKENDS

DATASEGMENTPARAPUBLIC'

DATA'

BUFFERDB16HDUP(0);

缓冲区大小

BUFPT1DW0;

缓冲区1

BUFPT2DW0;

缓冲区2

KBFLAGDB0;

参数,80H表示允许,00表示不允许

PROMPTDB'

*PLEASEPRACTISETYPING*'

0DH,0AH,'

$'

定义提示语句

SCANTABDB0,0,'

1234567890-='

8,0;

定义键盘

DB'

QWERTYUIOP[]'

0DH,0

ASDFGHJKL;

'

0,0,0,0

ZXCVBNM,./'

0,0,0

'

0,0,0,0,0,0,0,0,0,0,0,0,0

789-456+1230.'

OLDCS9DW?

9号中断向量地址

OLDIP9DW?

9号中断向量首地址

STR1DB'

WANGLAOSHININHAO.'

DB0DH,0AH,'

STR2DB'

WANGLAOSHIXINKULE.'

STR3DB'

WANGLAOSHIWOMENAINI.'

STR4DB'

WANGLAOSHINIYONGYUANZAIWOMENXINZHONG.'

STR5DB'

WANGLAOSHIZAIJIAN.'

CRLFDB0DH,0AH,'

COLONDB'

:

'

EVEN

SADDRDWSTR1,STR2,STR3,STR4,STR5

COUNTDW0;

记时器记数

SECDW0;

MINDW0;

HOURSDW0;

小时

SAVE_LCDW2DUP(?

);

1C向量地址

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA,ES:

DATA,SS:

STACK

MAINPROCFAR

START:

MOVAX,STACK

MOVSS,AX

MOVSP,OFFSETTOP

PUSHDS;

现场保护

SUBAX,AX

PUSHAX

MOVAX,DATA

MOVDS,AX

MOVES,AX

*******将原中断向量09H保存在自设的单元中******

MOVAH,35H

MOVAL,09H

INT21H

MOVOLDCS9,ES

MOVOLDIP9,BX

******设置自编处理程序的中断向量******

PUSHDS

MOVDX,SEGKBINT

MOVDS,DX

MOVDX,OFFSETKBINT

MOVAH,25H

POPDS

******将原中断向量1CH保存在自设的单元中******

MOVAL,1CH

MOVSAVE_LC,BX

MOVSAVE_LC+2,ES

******设置自编处理程序的中断向量******

MOVDX,SEGCLINT

MOVDX,OFFSETCLINT

POPDS

******允许键盘和定时器中断******

INAL,21H

ANDAL,11111100B

OUT21H,AL

******显示提示信息******

FIRST:

MOVDX,OFFSETPROMPT

MOVAH,9

MOVSI,0

******在屏幕上显示例句******

NEXT:

MOVDX,SADDR[SI]

MOVAH,09H

******初始化变量******

MOVCOUNT,0

MOVSEC,0

MOVMIN,0

MOVHOURS,0

STI

******允许更高一级的中断******

FOREVER:

CALLKBGET

TESTKBFLAG,80H

JNZENDINT

CALLDISPCHAR

POPAX

CMPAL,0DH

JNZFOREVER

MOVAL,0AH

******显示时间******

CALLDISPTIME

LEADX,CRLF

******显示例句结束否?

******

ADDSI,2

CMPSI,5*2

JNENEXT

JMPFIRST

******原来的中断向量******

ENDINT:

CLI

MOVDX,SAVE_LC

MOVAX,SAVE_LC+2

MOVAL,1CH;

恢复中断向量1CH

MOVDX,OLDIP9

MOVAX,OLDCS9

RET

MAINENDP

******定时器中断处理程序******

CLINTPROCNEAR

MOVBX,DATA

MOVDS,BX

LEABX,COUNT

INCWORDPTR[BX]

CMPWORDPTR[BX],18;

初始化记数

JNERETURN

CALLINCT

ADJ:

CMPHOURS,12;

是否满12小时

JLERETURN

SUBHOURS,12;

满足减去12

RETURN:

IRET

CLINTENDP

INCTPROCNEAR

MOVWORDPTR[BX],0

ADDBX,2

INCWORDPTR[BX];

BX内容自增1

CMPWORDPTR[BX],60;

和60比较

JNEEXIT

EXIT:

INCTENDP

******显示打字练习时间******

DISPTIMEPROCNEAR;

显示时间主段

MOVAX,MIN;

分移动到AX寄存器

CALLBINDEC;

显示数字

MOVBX,0

MOVAL,'

MOVAH,0EH;

显示冒号

INT10H

MOVAX,SEC;

秒移动到AX

CALLBINDEC

MOVAH,0EH

MOVBX,COUNT

MOVAL,55D;

百分秒

MULBL

DISPTIMEENDP

******将二进转化为十进显示时间******

BINDECPROCNEAR

MOVCX,100D;

显示百位

CALLDECDIV

MOVCX,10D;

显示十位

MOVCX,1;

显示个位

BINDECENDP

YS1PROCNEAR

MOVcx,0ffffH

DLY1:

deccx

cmpcx,0

JNZDLY1

DECDIVPROCNEAR;

MOVDX,0

DIVCX

ADDAL,30H;

转换成ASCII

INT10H;

显示一个字符

MOVAX,DX

DECDIVENDP

******获取键盘键入的信息******

KBGETPROCNEAR

PUSHBX

MOVBX,BUFPT1;

标志缓冲区的大小

CMPBX,BUFPT2

JNZKBGET2

CMPKBFLAG,0;

!

=00H的时候,一直获取键盘

JNZKBGET3

POPBX

JMPKBGET

KBGET2:

MOVAL,[BUFFER+BX]

INCBX

CMPBX,16H

JCKBGET3

KBGET3:

MOVBUFPT1,BX

RET

******键盘中断处理程序******

KBGETENDP

KBINTPROCNEAR

INAL,60H;

键盘输入寄存器端口地址

INAL,61H;

控制商品寄存器地址

ORAL,80H

OUT61H,AL;

读数据

ANDAL,7FH;

第八位清0,ASCII只有7位

OUT61H,AL

TESTAL,80H

JNZKBINT2

MOVBX,OFFSETSCANTAB;

查表输出字符

XLATSCANTAB;

查表

CMPAL,0

JNZKBINT4

MOVKBFLAG,80H

JMPKBINT2

KBINT4:

MOVBX,BUFPT2

MOV[BUFFER+BX],AL

JCKBINT3

KBINT3:

CMPBX,BUFPT1

JZKBINT2

MOVBUFPT2,BX

KBINT2:

MOVAL,20H

OUT20H,AL;

送825920H端口

KBINTENDP

DISPCHARPROCNEAR;

显示字符

MOVAH,0EH;

显示一个字符在AL里

显示一个字条符

DISPCHARENDP

CODEENDS

ENDSTAR

五、实验结果及分析

六、实验总结

课程设计对我们多数初学汇编的学生来说,确实是个一座高峰。

翻越它是要付出诸多努力的。

我们也是摸索了好久才弄明白它的。

在此做个小结,也许对自己今后的学习有一些借鉴的作用。

为了避免寄存器冲突的问题,在设计子程序时,应把所有用到的寄存器都入栈保存,但用来传递参数和结果的寄存器则要注意,不必入栈的就不入栈了,以免得不到预期的结果。

可以把寄存器当作变量来看待,有时候它存储的是数据变量(如把BP当作字符个数的记录器),而有时候它存储的是地址变量(如DI、SI);

内存中的数据,按它们的结构关系,则可以把它们看待成数组,我们对数组,可以通过首地址来访问它们。

传递参数和结果的,一般可以用寄存器,也可以用一段内存空间来传递,特别是需要传递的数据较多的时候。

在设计子程序时,往往涉及到许多的循环,这时候就要注意把不该循环的变量要放在循环体外。

一周的汇编语言课程设计结束了,我的收获是很大的。

通过课程设计的编程和对编程过程中遇到的问题的思考,有效的提高了我对汇编的认识和理解,切实的提高了我的编程能力,补全了我的不足。

通过这次课程设计,我巩固所了学过的知识,能用汇编语言熟练地运用顺序、选择、循环三大结构,进一步掌握了各个指令的功能,特别是转向指令,掌握了子程序的定义及调用,以及正确地运用DEBUG指令。

在整个程序的编写中,调试占了很大部分的时间。

要想写好汇编语言的程序,必须认真对待代码的每一个细节,还必须熟练的掌握debug命令,这对程序的调试是非常重要的。

通过这次实际动手能力的培养,我进一步熟悉了汇编语言的结构和使用方法,基本达到了能独立阅读、编制和调试一定规模的汇编语言程序的水平另外,我觉得,学习汇编有一个比较大的好处,就是可以了解到在电脑中每一个字节数据的来龙去脉,我觉得学习汇编可以发挥一下自己的空间想像力,特别是对内存中数据的组织、存储关系的想像。

当然,学习汇编还有另一个重要的收获,就是如何处理数据的问题。

七、参考文献

[1]张荣标等编著.《微型计算机原理与接口技术》北京:

机械工业出版社

[2]宋杰汪志宏江敏编.《微型计算机与接口技术课程设计》.北京:

教师评语及设计成绩

评语

课程设计成绩:

指导教师:

日期:

年月日

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

当前位置:首页 > 职业教育 > 其它

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

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