8086微机原理打字练习程序.docx
- 文档编号:7878616
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:18
- 大小:148.12KB
8086微机原理打字练习程序.docx
《8086微机原理打字练习程序.docx》由会员分享,可在线阅读,更多相关《8086微机原理打字练习程序.docx(18页珍藏版)》请在冰豆网上搜索。
8086微机原理打字练习程序
1课程设计题目与要求
设计题目:
打字练习程序
课程设计内容:
设计一个在键盘上练习打字的程序。
先在屏幕上显示一段文字,用户按照它在键盘上输入,如果按错键则以红色显示并报警,正确的输入,则正常显示。
课程设计目的:
熟悉和掌握有关键盘ASCⅡ码,中断及字符显示技术。
课程设计要求:
自行编制报警中断和显示错字红色中断处理程序,为保存原中断向量。
程序运行时,通过条件调用自编的中断向量处理程序。
程序退出时,恢复中断向量。
屏幕上显示出提示信息和练习的字符段,按照字符段从键盘上输入字符即可,每输入完一行后能自动刷新练习的字符段按Esc键可退出程序。
2相关理论知识
2.1扬声器驱动
PC机上的大多数I/O都是由主板上的8255(或8255A)可编程外围接口芯片(PPI)管理,用PPI输出寄存器中的PB0和PB1来控制扬声器的驱动,而8253的通道2的输出端与扬声器相连,PB0连接通道2的CKL2,PB1和通道2的OUT2通过一与非门连接扬声器,在PB0与PB1都为高电平时,由8253产生的脉冲就进入扬声器产生声音。
2.2相关指令
1)无条件转移指令
无条件转移指令必须指定转移的目标地址(或称为转向地址),将程序无条件地转移到目标地址,去执行从该地址开始的指令。
如“JMP目标地址”
2)条件转移指令
条件指令是根据执行该指令前标志位的状态而决定是否发生的控制转移指令。
每条指令测试不同的标志位组合,看是否满足条件。
若不满足,则继续执行跟在条件转移指令后面的指令;若满足则将程序控制指令转移到改指令给出的目标地址,去执行那里开始的程序。
如用到的“JA目标地址”
用到的标志符:
JC-------CF标志为1,则转移
JNC-------CF标志为0,则转移
JA-------高于/不低于等于转移
JB-------低于/不高于等于转移
JG-------大于/不小于等于转移
3)循环控制指令
在设计循环程序时,可用于控制指令来控制循环是否继续。
如loop指令,其指令格式“loop目标地址”
4)子程序调用和返回指令
CALL指令:
实现子程序(或过程)的调用。
其格式“CALL目标地址”
RET指令:
和CALL指令配对用,实现调用指令结束后的返回
为了保证返回的正确性,CPU会自动将CALL指令的下一条指令所在的内存地址推入堆栈;当子程序执行RET指令时,会将堆栈栈顶的内容弹出,放在IP和/或CS寄存器中,以保证子程序调用过程和返回过程的正确性。
5)中断指令“INTn”
改指令执行时转到中断服务(又称中断例行)程序。
中断服务程序执行完后返回INT指令下一条指令继续执行。
设计中用到的INT10H是由BIOS对屏幕及显示器所提供的服务程序,使用INT10H中断服务程序时,先指定AH寄存器为下表编号其中之一,该编号表示欲调用的功用。
设计中用到的INT21H是由BIOS对设备所提供的服务程序,使用INT21H中断服务程序时,先指定AH寄存器为下表编号其中之一,该编号表示欲调用的功用。
设计中用到的INT16H的00,01控制从键盘读入字符的中断。
BIOS中断:
(INT10H功能表)
BIOS中断:
(INT21H功能表)
3程序段设计
3.1字符串的输入设计
用汇编语言实现打字程序的思想,首先用BIOS的10H中断类型的02H功能置光标位置,接着用DOS的21H中断类型的09H功能显示字符串来显示主界面;调用DOS的16H的01H功能,接受从键盘输入的字符到AL寄存器。
设计中,通过字符的ASCⅡ码范围,用随机循环的方法显示需要练习的字符串
3.2错字变红色的设计
有中断“INT10H”AH=9时,在光标处按指定属性或颜色显示字符。
设计中将原来显示的字符存到AX的AL中,AH控制中断,AL存字符的ASCⅡ码,然后BL存要输入的字符的ASCⅡ码,BL=颜色(图形模式,仅适用于PCjr),而可知BL=10时字符为绿色,BL=12时字符为绿色,所以通过对BL来定义颜色。
设计中有
打字对时定义为绿色
MOVAL,BL
MOVBL,10;定义绿色
MOVTODH,DL;字符位置
MOVAH,9
MOVCX,1
INT10H;在光标处按指定属性显示字符
打字错时定义为红色
MOVAL,BL
MOVBL,12;定义红色
MOVTODH,DL;字符位置
MOVAH,9
MOVCX,1
INT10H;在光标处按指定属性显示字符
3.3报警部分设计
为了具有打错字报警输出能力,系统主板上装有一个2.25英寸的扬声器以及控制电路和驱动电路。
控制电路能以位触发和定时器控制两种不同的方式驱动扬声器发声。
通过程序将方波信号输出到8255A的4号2端口,在译码电路的作用下8255A芯片被选中,具体过程是:
8086的地址总线中的低八位A7、A6、A5、A4、A3、A2、A1、A0分别为:
01100001十六进制为61H且8255A。
程序直接控制PPI(8255A可编程外围接口芯片)的输出控制寄存器(I/O端口为61H)的第一位,使该位按所需的频率进行1和0的交替变化,从而控制开关电路产生一串脉冲波形,这些脉冲经放大电路放大后驱动扬声器发出声音。
采用位触发方式发声的程序段如下:
SOUNDPROC
PUSHAX
PUSHCX
INAL,61H
ANDAL,11111101B;关断定时器通道2的门控
OUT61H,AL
MOVCX,10000
AGAIN_S:
XORAL,2;触发61H端口的第一位
OUT61H,AL
CALLDELAY
LOOPAGAIN_S
POPCX
POPAX
RET
SOUNDENDP
DELAYPROC;延时
PUSHCX
MOVCX,0FFFH
NEXT_D:
NOP
LOOPNEXT_D
POPCX
RET
DELAYENDP
;*******************************************
通过以上的程序,我们可以实现使系统主板上的喇叭发声的功能。
4程序流程图
5程序调试效果
运行后打字练习,打对字符为绿色,打错字符为红色。
如图5-1
图5-1
6心得体会
本次综合实验,我所做的是有关打字练习的问题。
如何在屏幕上显示提示字符如何接受键盘字符,由此我想到了int21的09号、1号功能。
就这样我开始了程序总体模块设计。
首先想到了从键盘中获取字符,我自己通过字符的ASCII码的输入有中断显示出来,由于考虑自己能力有限,在这次试验中我在解释各个键时做了简化,只解释了可显示字符(如英文小写字母、数字及一些符号)即ASCII码中30H~7EH部分,其他特殊键(如组合键、双态键、功能键等)都未作解释,只作为字符0来处理。
在显示键入的字符时,
另外的一个收获是这次实验使我熟悉并掌握了汇编如何实现一些功能,一些中断的调用以及MF2KI软件的应用。
在以后的学习中我会从多方面继续结合硬件学习汇编语言。
上面是关于课设内容的总结,除此之外,在这课设时间里我既有快乐,也有郁闷。
快乐的是通过亲身实践学到了更多的知识,还有懂得如何把理论与实践结合时的兴奋;郁闷的是,看了不等于知道,知道了并不等于会做,会做了不等于一定能实现,就算实现了还不知道如何更好的完善。
理论只能在一定程度上指导实践,还需要实践来进一步完善理论。
通过这次课程设计,使我深刻认识了汇编语言。
以前在课上听老师讲的时候思路很清晰,觉得自己都会,不知怎么的,自己做起来非常的困难,没办法,去图书馆找了两三本书,回来有仔细看了起来,还好,有的知识他们相互补充,让我稍有眉目。
后又和同学探讨探讨,又从网上下载了类似的程序分析,这才有了思路。
通过这次设计也让我深刻理解了这句古训:
“纸上得来终觉浅,绝知此事要躬行”。
参考文献
《微机原理与接口技术》周配玲编电子工业出版社2005.4
《微机原理与接口技术实验指导与习题集》周明德编人民邮电出版社2002.5
《微机原理及应用实验教程》甘思源编重庆大学出版社1998.3
附录
打字练习程序清单
LF=0AH
CR=0DH
;宏定义部分
PRINTMACROP1,P2;输出“*”
PUSHAX
PUSHBX
PUSHCX
MOVAH,09H
MOVAL,P1
MOVBH,0
MOVBL,P2
MOVCX,1
INT10H;在光标处按指定属性显示字符
POPCX
POPBX
POPAX
ENDM
MOVTOMACROP1,P2;移动光标到指定位置
PUSHAX
PUSHDX
MOVAH,2
MOVDH,P1
MOVDL,P2
INT10H;设置光标位置
POPDX
POPAX
ENDM
OUTPUTMACROMSG,P1,P2,P3;输出字符串
LOCALDIFFER,EXITOF
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHDI
MOVDH,P2
MOVDL,P3
MOVBH,0
MOVBL,P1
MOVDI,0
DIFFER:
MOVAH,02H
INT10H
MOVCL,MSG[DI]
CMPCL,'$'
JEEXITOF
MOVAH,9
MOVAL,MSG[DI]
MOVCX,1
INT10H
INCDI
INCDL
JMPDIFFER
EXITOF:
POPDI
POPDX
POPCX
POPBX
POPAX
ENDM
XIANSHI_GMACRO;输出箭头指示符
PUSHAX
PUSHBX
PUSHCX
MOVCX,1
MOVAH,9
MOVAL,19H
MOVBL,10001100B
INT10H
POPCX
POPBX
POPAX
ENDM
DSEGSEGMENT'DATA'
;显示窗口内容
MSG0DB'*****THERATEOFCORRECT:
$'
MSG1DB'$'
MSG2DB'**************************^_^INSTRUCTION^_^***************************$'
MSG3DB'@@PRESS"BACKSPACE"TODELETE!
$'
MSG4DB'@@PRESS"ESC"TOEXIT!
$'
SECONTDB0;
COUNT1DW0;字符总个数
COUNT2DW0;为了到行尾时自动翻行的控制
DSEGENDS
SSEGSEGMENTSTACK'STACK'
DW100hDUP(?
)
SSEGENDS
CSEGSEGMENT'CODE'
ASSUMECS:
CSEG,SS:
SSEG,DS:
DSEG
;*******************************************
STARTPROCFAR
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DSEG
MOVDS,AX
MOVES,AX
PRACTISE:
CALLSHUCHU_K
MOVDH,1
MOVDL,1
MOVTODH,DL
XIANSHI_G;显示“箭头”
MOVAH,0
INT1AH
MOVAL,DL;随机生成字母
CONT_1:
CMPAL,7EH
JACONT
CMPAL,20H
JBCON
JMPCONTI
CONT:
SUBAL,7EH
JMPCONT_1
CON:
ADDAL,20H
CONTI:
MOVCX,78
MOVAH,9
MOVBL,00001111B
MOVDH,2
MOVDL,0
JMPSHUCHU
TZD_1:
;跳转点到“EXIT”
JMPTZD_2
SHUCHU:
INCDL
MOVTODH,DL
INT10H
ADDAL,DL
CMPAL,7EH
JACONTINUE
CMPAL,20H
JBCONTINUE1
LOOPSHUCHU
JMPDAZIRUKOU
CONTINUE:
SUBAL,7EH
CONTINUE1:
ADDAL,20H
LOOPSHUCHU;到此为输出上面一行要打字练习的内容
;下面开始打字练习*******************************************
DAZIRUKOU:
MOVDH,3
MOVDL,1
;提示信息*********************************************************
PUSHDX
MOVDH,18
MOVDL,2
OUTPUTMSG2,13,DH,DL
MOVDH,19
MOVDL,2
OUTPUTMSG3,10,DH,DL
MOVDH,20
MOVDL,2
OUTPUTMSG4,10,DH,DL
MOVDH,21
MOVDL,27
MOVTODH,DL
POPDX
;*******************************************************************
PRESS:
MOVTODH,DL
MOVAH,01H
INT16H;从键盘读入字符
JNEKEY
JMPPRESS
KEY:
MOVAH,00
INT16H;从键盘读入字符
JMPISESC
ISESC:
CMPAL,1BH
JETZD_2
CMPAL,08H
JEDELETE
INCCOUNT2
INCCOUNT1;是上面的字符,则COUNT1加1
JMPISEQUAL
TZD_2:
;设定跳转点到“EXIT”
JMPSKIP1
DELETE:
MOVAX,COUNT1
CMPAX,0
JNEDELETE_G
DELETE_G:
DECCOUNT1
DECCOUNT2
SUBDH,2
MOVTODH,DL
PRINT'',0
DECDL
MOVTODH,DL
XIANSHI_G
ADDDH,2
MOVTODH,DL
MOVAH,08H
INT10H;读光标处的字符及其属性
CMPAH,10;8号功能时,AH=属性,AH=ASC码
JNZDEL
DEL:
PRINT'',0
TZD_DAZI1:
;跳转点,到“打字”
JMPPRESS
ISEQUAL:
MOVBL,AL
CMPAL,20H
JBWRONG
CMPAL,7FH
JAWRONG
SUBDH,2
MOVTODH,DL
PRINT'',0
INCDL
MOVTODH,DL
XIANSHI_G
INCDH
DECDL
MOVTODH,DL
MOVAH,8;读得光标处字符送到AL中
INT10H
CMPAL,BL
JEEQUAL
CALLSOUND;在此处添加警报声
MOVAL,BL
MOVBL,12;错字变红色
JMPUNEQUAL
WRONG:
TZD_DAZI0:
JMPTZD_DAZI1
EQUAL:
MOVAL,BL
MOVBL,10
UNEQUAL:
INCDH
MOVTODH,DL
MOVAH,9
MOVCX,1
INT10H;在光标处按指定属性显示字符
INCDL
MOVAX,COUNT2
CMPAL,78
JBTZD_DAZI0
SUBAX,78
MOVCOUNT2,AX
REFLESH:
;满一行后自动刷新(78个字符)
MOVAH,7
INT21H;无回显过滤的字符输入
JMPPRACTISE
SKIP1:
JMPEXIT
NONE:
NOP
JMPSKIP1
EXIT:
MOVAH,0
MOVAL,3
INT10H;设置显示器模式
MOVAH,4CH
INT21H;带返回码结束
RET
STARTENDP
;输出外围框架****************************************
SHUCHU_KPROC
PUSHAX
PUSHCX
PUSHDX
MOVAH,0
MOVAL,3
INT10H
MOVCX,79
MOVDH,0
MOVDL,0
AGAIN1:
INCDL
MOVTODH,DL
PRINT'*',0EH
LOOPAGAIN1
MOVCX,24
AGAIN2:
INCDH
MOVTODH,DL
PRINT'*',0EH
LOOPAGAIN2
MOVCX,79
AGAIN3:
DECDL
MOVTODH,DL
PRINT'*',0EH
LOOPAGAIN3
MOVCX,24
AGAIN4:
DECDH
MOVTODH,DL
PRINT'*',0EH
LOOPAGAIN4
POPDX
POPCX
POPAX
RET
SHUCHU_KENDP
;************************************************
;发声*************************************
SOUNDPROC
PUSHAX
PUSHCX
INAL,61H
ANDAL,11111101B
OUT61H,AL
MOVCX,10000
AGAIN_S:
XORAL,2
OUT61H,AL
CALLDELAY
LOOPAGAIN_S
POPCX
POPAX
RET
SOUNDENDP
DELAYPROC;延时
PUSHCX
MOVCX,0FFFH
NEXT_D:
NOP
LOOPNEXT_D
POPCX
RET
DELAYENDP
;*******************************************
;*******************************************
CSEGENDS
ENDSTART;setentrypoint.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 8086 微机 原理 打字 练习 程序