微机原理字符串动画显示.docx
《微机原理字符串动画显示.docx》由会员分享,可在线阅读,更多相关《微机原理字符串动画显示.docx(25页珍藏版)》请在冰点文库上搜索。
微机原理字符串动画显示
微机原理课设报告
学生姓名:
常卫洪学号:
130704101
专业班级:
电子科学与技术131班
课程名称:
微型计算机原理及应用技术
学年学期:
2015-2016学年第1学期
指导教师:
赵艳
2015年12月
课程设计成绩评定表
学生姓名
常卫洪
学号
130704101
成绩
专业班级
电科131
起止时间
2015.12.20至2015.12.29
设计题目
字符串动画显示
指
导
教
师
评
语
课程设计态度:
端正□较端正□一般□较差□
课程设计纪律:
好□较好□一般□较差□
课程设计出勤情况:
好□较好□一般□较差□
课程设计任务完成情况:
优秀□好□一般□较差□
课程设计报告完成情况:
优秀□好□一般□较差□
动手能力:
强□较强□一般□较差□
团队精神:
好□较好□一般□较差□
创新意识:
强□较强□一般□较差□
指导教师:
年月日
一、设计目的--------------------------------------------4
二、设计任务与要求-------------------------------------4
三、小组分工--------------------------------------------4
四、实现方法--------------------------------------------4
五、功能效果展示---------------------------------------11
六、改进以及及建意-------------------------------------13
七、心得体会---------------------------------------------14
八、参考资料--------------------------------------------14
九、附源程序--------------------------------------------14
一、设计目的:
1、掌握汇编语言,会利用汇编语言编写一定功能的程序;
2、熟悉DOS环境以及在DOS下会调试编写好的汇编程序;
3、熟悉常用的DOS功能;
4、小组合作完成设计题目。
二、设计任务与要求
设计内容要求:
1、菜单
内容包括:
①输入字符串;②字符串动画显示;③退出。
2、输入字符串
选择该项后,可以输入一个字符串。
该字符串即为动画显示时所显示的字符串。
3、字符串动画显示
所示字符串在一矩形框内一半从左另一半从右向中间移动,当两半相遇时又分别向两边移动,直至遇到两侧的边框双重新向中间移动,重复上述过程直至按任意键,则停止字符串动画显示返回到主菜单。
4、在主菜单中选择退出项,则结束程序返回DOS。
3、进度及分工安排
1.进度安排
序号
设计内容
时间
1
查阅资料、确定设计思路
3天
2
设计实现、编写程序
3天
3
调试
1天
4
考核设计、写设计报告
2天
2.分工安排
序号
工作内容
成员
1
确定设计思路,画流程图
陈继贤
2
编写字符串移动程序段
张恒刘阳
3
编写菜单项,矩形框程序段
常卫洪陈继贤
4
程序汇总,调试
张恒田淑乾
4、实现方法
4.1MASM编译开发环境实现
MASM是微软公司开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,支持80x86汇编以及Win32Asm是Windows下开发汇编的利器。
它与windows平台的磨合程度非常好,但是在其他平台上就有所限制,使用MASM的开发人员必须在windows下进行开发。
MASM版本至今在不断的更新,目前的最新版本为10.0,推荐使用新版本进行开发。
MASM5.0是最常用的汇编连接软件其简单操作为输入asm文件将其连接为obj文件用link得到exe文件。
4.2算法实现
软中断:
DOS功能调用编写的程序中INT10H和INT21H软中断的应用。
如下表:
INT10H
功能号
功能
入口参数
出口参数
00H
设置显示模式
AL=0380*25彩色文本方式
无
0EH
显示字符
AL=字符
字符显示在屏幕上
INT21H
功能号
功能
入口参数
出口参数
09H
显示字符串
DS:
DX=缓冲区
0AH
输入字符串
DS:
DX=缓冲区
01H
键盘输入字符
AL=输入字符
INT16H
功能号
功能
入口参数
出口参数
00H
从键盘读字符
AL=字符码
AH=扫描码
矩形框代码:
186竖框编写 187右上角编写
188右下角编写 200左下角编写
201左上角编写 205横框编写
总体流程:
设置三个选项分别对应选项标号。
将键盘输入的标号与1、2、3相比较以确定不同的程序块调用接口。
“1”输入字符串,即进入过程一;“2”动画显示所要求的字符串,即调用过程二;“3”返回DOS系统,即调用EXIT标号。
AL=2?
AL=3?
输出提示符
输入字符串以回车结束
输出矩形框并保持框内无字符数秒
输出提示符
输入字符
输出提示符
返回DOS
R?
Q?
开始
输出主菜单
输入字符(数字:
1、2、3)存AL
AL=1?
Y
N
N
Y
Y
Y
N
Y
N
4.3流程图
:
延时几秒,直到判断出矩形框完全出现
4.4部分程序
1.菜单程序
MENUDB5DUP(0AH)
DB31DUP(''),'MAINMENU',0DH,0AH
DB25DUP(''),201,21DUP(205),187,0DH,0AH
DB25DUP(''),186,'1.INPUTASTRING...',186,0DH,0AH
DB25DUP(''),186,'2.DISPLAYMODEL...',186,0DH,0AH
DB25DUP(''),186,'3.RETURNTODOS...',186,0DH,0AH
DB25DUP(''),200,21DUP(205),188,0DH,0AH
DB28DUP(''),'CHOICE(1,2,3):
$'
MESGDB0DH,0AH,0DH,0AH,9,'PRESSANYKEYTOEXIT...$'
CNT1DW0;前导空格长度
CNT2DW0;左半字符串长度
CNT3DW0;中间空格长度
CNT4DW0;右半字符串长度
CNT5DW0;末尾空格长度
LEFTDW0
STRDB21
DB0
BUFDB0DH,20DUP(0)
2.矩形框程序
LINE:
;矩形框
MOVDI,(18*80+10)*2
MOVAL,201;左上角
MOVAH,3;矩形框颜色
STOSW
MOVCX,60-2
MOVAL,'*';横框
REPSTOSW
MOVAL,187;右上角
STOSW
ADDDI,20*2
MOVAL,'|';竖框
STOSW
MOVLEFT,DI
MOVCX,60-2
MOVAL,20H;空格
REPSTOSW
MOVAL,'|';竖框
STOSW
ADDDI,20*2
MOVAL,200;左下角
STOSW
MOVCX,60-2
MOVAL,'*';横框
REPSTOSW
MOVAL,188;右下角
STOSW
RET
3.字符串移动程序
LEADX,MENU;MENU文件的主菜单将MENU的首地址给DX
MOVAH,9
INT21H
;显示字符串,DS:
DX串地址,即MENU,画出方框图
INPUT:
MOVAH,0
INT16H
;从键盘读一字符
CMPAL,'1';召唤第一步,输入一个字符串
JNZCP2结果不为零跳转及ZF=0
CALLSUB01;输入一个字符串
JMPINPUT
CP2:
CMPAL,'2';召唤第二步,字符串左右移动
JNZCP3
CALLSUB02;字符串左右移动
JMPAGAIN;返回到主菜单
CP3:
CMPAL,'3';返回DOS
JNZINPUT
LEADX,MESG
MOVAH,9
INT21H
MOVAH,1
INT21H
;接受字符
MOVAH,4CH
INT21H
;结束
DELAYPROC
PUSHCX
PUSHDX;保护现场
MOVDX,1000;第二轮循环次数
D1:
MOVCX,0FFFFH;第一轮循环次数
LOOP$
;若CX不等于零,跳转至当前代码地址的指令($=该指令在该代码段的偏移地址)
DECDX
JNZD1
POPDX
POPCX;现场还原
RET
DELAYENDP
SUB01:
MOVAX,0E0DH;0DH为本行开头,0EH输出
INT10H
MOVAL,0AH;0AH为下一行输出
INT10H
LEADX,STR;DX输入字符缓冲区首地址
MOVAH,0AH
INT21H;输入一个字符串中断
MOVAX,0E0AH;换行
INT10H
RET
SUB02:
CMPSTR+1,2;系统键入的字符个数
JNBY2
JMPQUIT
Y2:
CALLLINE;画矩形框
MOVDL,60-2;框内长度
MOVAL,STR+1;字符长度
SUBDL,AL
MOVDH,0;DH清零
MOVCNT3,DX
MOVBL,AL
INCAL
SHRAL,1;AL+1/2
CBW
MOVCNT2,AX;左半边
SUBBL,AL
MOVBH,0
MOVCNT4,BX;右半边
MOVBL,41
Y3:
MOVBP,ES
PUSHDS
POPES
MOVDI,1000H
MOVCX,CNT1
JCXZU1
MOVAL,20H
REPSTOSB
U1:
LEASI,BUF;
MOVCX,CNT2;
REPMOVSB;
MOVCX,CNT3
JCXZU2
MOVAL,20H
REPSTOSB
U2:
MOVCX,CNT4
REPMOVSB
MOVCX,CNT5
JCXZU3
MOVAL,20H
REPSTOSB
U3:
SHOW:
MOVES,BP
INCBL
MOVAH,BL;设置形式白底黑字
MOVSI,1000H
MOVDI,LEFT
MOVCX,60-2
PPP:
LODSB
STOSW
LOOPPPP
MOVAH,1
INT16H
JNZSSS;按任意键,返回主菜单
CALLDELAY
CMPCNT3,0
JNZKK1
HERE:
MOVAL,1000B
XORBYTEPTR[KK1+1],AL
XORBYTEPTR[KK1+5],AL
XORBYTEPTR[KK1+9],AL
XORBYTEPTR[KK2-3],AL
KK1:
INCCNT1
INCCNT5
DECCNT3
CMPCNT3,0
JZKK2
DECCNT3
KK2:
CMPCNT1,0
JZHERE
JMPY3
SSS:
MOVSTR+1,0
QUIT:
LEASI,CNT1
XORAX,AX
MOVCX,5
KK3:
MOV[SI],AX
INCSI
INCSI
LOOPKK3
XORDI,DI
MOVCX,80*25
MOVAX,720H
REPSTOSW;清全屏
RET
5、功能效果展示
1.调试
程序调试,是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。
Debug是调试汇编语言程序的工具,它不仅能跟踪程序的运行,还可以显示修改内存与寄存器内容,以便在调试程序中检查程序,找错、改错。
2.编译成功
3.连接成功
4.进入程序主界面
5.开始校验
6.退出程序
六、改进意见及建议
本程序虽然已经完成了课程设计的全部要求,但是仍有不足之处,因为时间紧张和知识缺乏,所以程序不是很好。
例如:
有些程序可以很简单的完成,但是由于知识的问题只能很繁琐。
有很多限制,比如,限制字符串长度。
。
。
应该不能限制字符串长度。
七、心得体会
经过一周的课程设计练习,对计算机的语言和编程有了一定的了解和掌握,和一定的动手能力。
特别明白了凡事要注重细节,细节很重要。
稍有不慎程序就会出现错误。
比如:
少打一个空格或一个逗号或打错一个字母就不能运行。
本次课程设计使用了汇编语言中的INT10H,INT21H和INT1CH三个软中断服务程序。
INT10H是BIOS对屏幕及显示器所提供的服务程序,INT21H是DOSX系统功能的调用。
在本次课程设计是,我编写菜单程序和矩形框程序段。
从图书管理找了一本书,看了DOS和BIOS的很多指令,也让我收益匪浅。
通过本次课程设计,我将我以前学过的一些指令的运用更加的深刻,还有一些以前没学过的指令。
对于如何运用masm软件,比在微机原理实验时有了更深的理解。
就算一个字母输入错误都会导致最后程序运行不出来,更加锻炼了我的细心和认真。
遇到问题时,通过自己上网查资料,查课本,锻炼了自己动手的能力。
这也让我越来越深的认识到,不管以后工作还是学习都要仔细认真,查阅资料。
学习的过程大体就是:
先大体弄懂要学的那些知识,然后是自己进行练习,通过练习发现问题,然后是解决问题,这个自学的过程如此反复,每进行一次锻炼,自己的能力得到一次提升,进而一次次提高自己。
实践与理论相结合,才能更好的理解所学知识,今后我将努力将基础知识掌握牢固,争取在下一次课程设计中能够改善这次的不足,做出更好的设计,提高自己的能力。
多多动手,多多练习,理论联系实际,才能真正学会,学懂,学通,融会贯通。
最后,感谢指导老师和同组同学,他们在我完成这项课程设计中起到关键的作用,对微机原理这门课程有了更深刻的认识。
也正是全组同学的分工合作,全心配合,才能完成这项任务。
这次学习的过程也将对我今后的工作和学习起到指导作用。
八、参考资料
《微型计算机原理及应用技术》第2版机械工业出版社
九、附源程序
初始化程序:
CODESEGMENT
ASSUMECS:
CODE,DS:
CODE
START:
MOVAX,CODE
MOVDS,AX
MOVAX,0B800H
;0B800H是文本模式下显存起始地址;
;0A000H是图形模式下显存起始地址;
;起始地址之后的一段内存数据决定了界面上显示的文字、图形、前背景色
MOVES,AX
CLD
AGAIN:
MOVAX,3
INT10H
;设置显示器模式为80×2516色
LEADX,MENU;MENU文件的主菜单将MENU的首地址给DX
MOVAH,9
INT21H
;显示字符串,DS:
DX串地址,即MENU,画出方框图
INPUT:
MOVAH,1
INT21h
;从键盘读一字符
CMPAL,'1';召唤第一步,输入一个字符串
JNECP2;结果不为零跳转及ZF=0
CALLSUB01;输入一个字符串
JMPINPUT
CP2:
CMPAL,'2';召唤第二步,字符串左右移动
JNZCP3
CALLSUB02;字符串左右移动
JMPAGAIN;返回到主菜单
CP3:
CMPAL,'3';返回DOS
JNZINPUT
LEADX,MESG
MOVAH,9
INT21H
MOVAH,1
INT21H
;接受字符
MOVAH,4CH
INT21H
;结束
DELAYPROC
PUSHCX
PUSHDX;保护现场
MOVDX,0100H;第二轮循环次数
D1:
MOVCX,08FFH;第一轮循环次数
LOOP$
;若CX不等于零,跳转至当前代码地址的指令($=该指令在该代码段的偏移地址)
DECDX
JNZD1
POPDX
POPCX;现场还原
RET
DELAYENDP
SUB01:
MOVAX,02H;0DH为本行开头,02H输出
INT21H
MOVDL,0AH;0AH为下一行输出
INT21H
LEADX,STR1;DX输入字符缓冲区首地址
MOVAH,0AH
INT21H;输入一个字符串中断
MOVAH,02H;0DH为本行开头,02H输出
MOVDL,0DH
INT21H
MOVDL,0AH;0AH为下一行输出
INT21H
;RET
SUB02:
CMPSTR+1,2;系统键入的字符个数
JNBY2
JMPQUIT
Y2:
CALLLINE;画矩形框
MOVDL,60-2;框内长度
MOVAL,STR1+1;字符长度
SUBDL,AL
MOVDH,0;DH清零
MOVCNT3,DX
MOVBL,AL
INCAL
SHRAL,1;AL+1/2
CBW
MOVCNT2,AX;左半边
SUBBL,AL
MOVBH,0
MOVCNT4,BX;右半边
MOVBL,41
Y3:
MOVBP,ES
PUSHDS
POPES
MOVDI,1000H
MOVCX,CNT1
JCXZU1
MOVAL,20H
REPSTOSB
U1:
LEASI,BUF;
MOVCX,CNT2;
REPMOVSB;
MOVCX,CNT3
JCXZU2
MOVAL,20H
REPSTOSB
U2:
MOVCX,CNT4
REPMOVSB
MOVCX,CNT5
JCXZU3
MOVAL,20H
REPSTOSB
U3:
SHOW:
MOVES,BP
INCBL
MOVAH,BL;设置形式白底黑字
MOVSI,1000H
MOVDI,LEFT
MOVCX,60-2
PPP:
LODSB
STOSW
LOOPPPP
MOVAH,1
INT16H
JNZSSS;按任意键,返回主菜单
CALLDELAY
CMPCNT3,0
JNZKK1
HERE:
MOVAL,1000B
XORBYTEPTR[KK1+1],AL
XORBYTEPTR[KK1+5],AL
XORBYTEPTR[KK1+9],AL
XORBYTEPTR[KK2-3],AL
KK1:
INCCNT1
INCCNT5
DECCNT3
CMPCNT3,0
JZKK2
DECCNT3
KK2:
CMPCNT1,0
JZHERE
JMPY3
SSS:
MOVSTR+1,0
QUIT:
LEASI,CNT1
XORAX,AX
MOVCX,5
KK3:
MOV[SI],AX
INCSI
INCSI
LOOPKK3
XORDI,DI
MOVCX,80*25
MOVAX,720H
REPSTOSW;清全屏
JMPAGAIN
LINE:
;矩形框
MOVDI,(18*80+10)*2
MOVAL,201;左上角
MOVAH,3;矩形框颜色
STOSW
MOVCX,60-2
MOVAL,'*';横框
REPSTOSW
MOVAL,187;右上角
STOSW
ADDDI,20*2
MOVAL,'|';竖框
STOSW
MOVLEFT,DI
MOVCX,60-2
MOVAL,20H;空格
REPSTOSW
MOVAL,'|';竖框
STOSW
ADDDI,20*2
MOVAL,200;左下角
STOSW
MOVCX,60-2
MOVAL,'*';横框
REPSTOSW
MOVAL,188;右下角
STOSW
RET
MENUDB5DUP(0AH)
DB31DUP(''),'MAINMENU',0DH,0AH
DB25DUP(''),201,21DUP(205),187,0DH,0AH
DB25DUP(''),186,'1.INPUTASTRING...',186,0DH,0AH
DB25DUP(''),186,'2.DISPLAYMODEL...',186,0DH,0AH
DB25DUP(''),186,'3.RETURNTODOS...',186,0DH,0AH
DB25DUP(''),200,21DUP(205),188,0DH,0AH
DB28DUP(''),'CHOICE(1,2,3):
$'
MESGDB0DH,0AH,0DH,0AH,9,'PRESSANYKEYTOEXIT...$'
CNT1DW0;前导空格长度
CNT2DW0;左半字符串长度
CNT3DW0;中间空格长度
CNT4DW0;右半字符串长度
CNT5DW0;末尾空格长度
LEFTDW0
STRDB21
DB0
BUFDB0DH,20DUP(0)
CODEENDS
ENDSTART