汇编语言课程设计打字练习程序Word格式.docx

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

汇编语言课程设计打字练习程序Word格式.docx

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

汇编语言课程设计打字练习程序Word格式.docx

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

count×

1秒/18.2=count×

55ms

2.2程序流程图

3.代码设计

3.1功能模块说明

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

缓冲区:

BUFFER,BUFPT1,BUFPT2

3.1.2代码段

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

3.1.3使用子程序分化各子功能

DISPTIMEPROCNEAR

BINDECPROCNEAR;

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

DECDIVPROCNEAR;

转化成字符显示

DISPCHARPROCNEAR

KBGETPROCNEAR;

获取键盘键入的信息

KBINTPROCNEAR;

查表查到相应的字符

RESET09PROC;

重新设置09号中断

RESET1CPROC;

重新设置1c功能

RESETPROC;

回复1C与09

3.2源程序

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.'

******设置一些存储地址便于理解******

EVEN

OLDCS9DW?

9号中断向量地址

OLDIP9DW?

9号中断向量首地址

******预设置打字练习的句子******

STR1DB'

ABCDEFGHIJKLMNOPQRSTUVWXYZ.'

句子1

DB0DH,0AH,'

STR2DB'

THEREARESOMENEWSPAPERSONTHETABLE.'

STR3DB'

THEREARESOMECLOUDSINTHESKY.'

STR4DB'

SHEALWAYSEATSHERLUNCHATNOON.'

STR5DB'

IDONOTLIKEAUTUMNANDWINTER.'

CRLFDB0DH,0AH,'

COLONDB'

:

'

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,0

MOVAL,4

INT21H

MOVAH,0BH

MOVBH,0

MOVBL,4

INT11H

MOVAH,35H;

取中断向量的功能调用

MOVAL,09H

MOVOLDCS9,ES

MOVOLDIP9,BX

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

PUSHDS

MOVDX,SEGKBINT;

自编中断类型程序段地址放入DS

MOVDS,DX

MOVDX,OFFSETKBINT;

自编中断类型程序偏移地址放入DX

MOVAH,25H;

设置中断向量功能调用

POPDS

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

MOVAH,35H

MOVAL,1CH

MOVSAVE_LC,BX

MOVSAVE_LC+2,ES

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

MOVDX,SEGCLINT

MOVDS,DX

MOVDX,OFFSETCLINT

MOVAH,25H

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

INAL,21H;

允许键盘和定时器中断

ANDAL,11111100B

OUT21H,AL

******设置显示方式******

FIRST:

MOVAH,0

MOVAL,3

INT10H

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

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

MOVAH,09H

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

******

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:

RET

INCTENDP

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

DISPTIMEPROCNEAR;

显示时间主段

MOVAX,MIN;

分移动到AX寄存器

CALLBINDEC;

显示数字

MOVBX,0

MOVAL,'

MOVAH,0EH;

显示冒号

MOVAX,SEC;

秒移动到AX

CALLBINDEC

MOVAH,0EH

MOVBX,COUNT

MOVAL,55D;

百分秒

MULBL

DISPTIMEENDP

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

BINDECPROCNEAR

MOVCX,100D;

显示百位

CALLDECDIV

MOVCX,10D;

显示十位

CALLDECDIV

MOVCX,1;

显示个位

BINDECENDP

DECDIVPROCNEAR;

MOVDX,0

DIVCX

ADDAL,30H;

转换成ASCII

INT10H;

显示一个字符

MOVAX,DX

DECDIVENDP

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

KBGETPROCNEAR

PUSHBX

CLI

MOVBX,BUFPT1;

标志缓冲区的大小

CMPBX,BUFPT2

JNZKBGET2

CMPKBFLAG,0;

!

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

JNZKBGET3

POPBX

JMPKBGET

KBGET2:

MOVAL,[BUFFER+BX]

INCBX

CMPBX,16H

JCKBGET3

KBGET3:

MOVBUFPT1,BX

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;

显示字符

显示一个字符在AL里

显示一个字条符

DISPCHARENDP

CODEENDS

ENDSTART

4.调试与运行

4.1实验步骤:

1)打开windows命令窗口

2)进入masm程序的安装目录,汇编源文件,如图:

图4.1.2汇编程序

3)连接程序,并查看生成可执行文件weijia.exe。

图4.1.3查看生成可执行文件

4)关闭对话框,打开可执行文件weijia.exe,开始打字计时练习。

4.2运行程序:

1)设置主程序段显示提示信息,程序功能应该实现下图所示:

图4.2.1程序调试

2)调用DISPCHARPROCNEAR显示用户字条,调用DISPTIMEPROCNEAR显示时间,然后输出下一句提示程序应该实现下图所示:

图4.2.2程序调试

3)如此循环多次,当第五个例句输入完成后,再返回第一句继续打字计时。

图4.2.3程序调试

4.3调试中出现的问题

没有注意到要操作的目标数据(内存中的数据)的大小和使用的操作容器(寄存器)的大小没有一致。

另外,对于处理数据的ds:

[bx]方式,如movds:

[bx],dxaddbx,2在循环中应注意bx的递增或递减大小,如果处理字节,比如用dl,循环中就加或减1;

如果处理字,比如用dx,就加或减2。

在以后应该留意这个一致性。

在8086上,ss和sp都是16位的,栈所处理数据的最小单位也是16位的,即最小是一个字,栈一次读和一次写,都至少是一个字那么大。

5.总结

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

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

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

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

当前位置:首页 > 总结汇报 > 实习总结

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

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