屏幕窗口程序的设计.docx
《屏幕窗口程序的设计.docx》由会员分享,可在线阅读,更多相关《屏幕窗口程序的设计.docx(12页珍藏版)》请在冰豆网上搜索。
屏幕窗口程序的设计
课程设计任务书
学生姓名:
专业班级:
指导教师:
工作单位:
计算机科学与技术学院
题目:
屏幕窗口程序的设计
初始条件:
理论:
学完“汇编语言程序设计”、“高级语言程序设计”和“数字逻辑”。
实践:
计算机学院科学系实验中心提供计算机和软件平台。
如果自己有计算机可以在其上进行设计。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
(1)程序应有操作提示、输入和输出,界面追求友好,最好是菜单式的界面。
(2)设计若干用例(测试数据),上机测试程序并分析(评价)所设计的程序。
(3)设计报告格式按附件要求书写。
课程设计报告书正文的内容应包括:
在正文第一行写课程设计题目;
1.需求说明(要求、功能简述)或问题描述;
2.设计说明(简要的分析与概要设计);
3.详细的算法描述;
4.源程序与执行结果(含测试方法和测试结果);
5.使用说明;
6.总结,包括设计心得(设计的特点、不足、收获与体会)和展望(该程序进一步改进扩展的设想)。
时间安排:
设计时间一周:
周1:
查阅相关资料。
周2:
系统分析,设计。
周3、4:
编程并上机调试。
周5:
撰写课程设计报告。
设计验收安排:
17周星期五8:
00起到计算机学院科学系实验中心进行上机验收。
设计报告书收取时间:
17周的星期五下午5:
00之前。
指导教师签名:
2011年12月25日
系主任(或责任教师)签名:
2011年12月25日
屏幕窗口程序的设计
1问题描述
在屏幕上开出三个窗口,它们的行列坐标如图所示:
(5,10)(5,50)
(15,30)(15,70)
(18,15)
(22,65)
光标首先定位在右窗口最下面一行的行首(15,50),如从键盘输入字符,则显示在右窗口,同时也显示在下窗口的最下面一行。
若需要将字符显示于左窗口,则先按下
←键,接着再从键盘输入字符,字符就会从左窗口的最下行开始显示,同时下窗口也显示左窗口的内容。
如若再按下→键,输入字符就会接在先前输入的字符之后显示出来。
当一行字符显示满后(左右窗口一行显示20个字符,下窗口一行显示50个字符),窗口自动向上卷动一行,输入字符继续显示于最低一行,窗口最高一行向上卷动后消失。
编写屏幕窗口程序时,要求将一些功能程序段定义成宏指令,如:
①scroll——向上卷动
②clear——清屏
③get_char——接收输入字符,并判断是否是ESCape、←或→键,然后转到相应的入口处理
④display——在屏幕上显示字符
⑤pos_curse——光标定位
2设计分析
2.1问题分析
(1)宏指令能表示一段具有独立功能的程序代码。
宏指令定义的格式如下:
宏指令名MACRO[哑元表]
︙;实现某种功能的程序段
ENDM
如把上卷全屏幕或部分屏幕(窗口)的功能定义成一条宏指令scroll,其形式为:
scrollmacroulrow,ulcol,lrrow,lrcol,att
movah,06h
moval,1
movch,ulrow
movcl,ulcol
movdh,lrrow
movdl,lrcol
movbh,att
int10h
endm
如此定义之后,在程序中可直接应用宏指令scroll,同时可赋予不同的参数而对不同的窗口进行上卷操作。
如程序中需对右窗口上卷一行时调用宏指令:
scroll5,50,15,70,70h
(2)在数据段中设置6个变量lx,ly,rx,ry,dwx和dwy,它们分别用来记录左窗口、右窗口和下窗口的当前光标位置,以保证在返回本窗口显示字符时,能够接着前一次显示的字符窜之后继续显示。
(3)在窗口中每显示一个字符,都要修改光标的列变量,同时判断是否超出本窗口的边界,如没有超出可继续接收并显示字符,如意超出边界,则需要上卷一行,同时把光标重新定位在本窗口底行的行首。
(4)一个字符无论在左窗口显示还是在右窗口显示,它同时还在下窗口中显示,因此要注意保存显示字符。
2.2程序中使用的功能调用
INT10H:
02H功能:
用文本坐标设置光标位置
入口参数:
AH=02H
BH=页号
DH/DL=行/列
出口参数:
无
03H功能:
在文本坐标下,读光标各种信息
入口参数:
AH=03H
BH=页号
出口参数:
CH=光标起始行
CL=光标结束行
DH/DL=行/列
06H功能:
屏幕初始化或上卷
入口参数:
AH=06H
AL=0初始化窗口
AL=上卷行数
BH=卷入行属性
CH/CL=左上角行/列号
DH/DL=右下角行/列
出口参数:
无
0EH功能:
显示字符(光标前移)
入口参数:
AH=0EH
AL=字符
BH=页码
BL=前景色
出口参数:
无
INT16H:
00H功能:
从键盘读字符
入口参数:
AH=00H
出口参数:
AH=扫描码
AL=字符码
3算法描述
3.1算法流程图
算法流程图
3.2算法简述
(1)如上算法流程图所示,窗口初始化时,光标在右窗口,对输入字符进行判断:
若为←键,则光标调整至左窗口;若为→键,则光标调整至右窗口;若为ESC键,则退出程序;否者,按如下规则显示:
(2)若光标当前位置在右窗口,读取光标位置,在当前位置显示输入字符,修改光标列变量,并将ax进栈,保存当前输入的字符;判断光标列变量是否越界(d=70),越界则将窗口上卷一行,并将光标置为最底行行首(修改d=50);然后跳转至步骤(4)。
(3)若光标当前位置在左窗口,读取光标位置,在当前位置显示输入字符,修改光标列变量,并将ax进栈,保存当前输入的字符;判断光标列变量是否越界(b=30),越界则将窗口上卷一行,并将光标置为最底行行首(修改b=10);然后跳转至步骤(4)。
(4)在下窗口显示时,首先将ax出栈,ax中保存的是当前输入的字符;将dx进栈,由于dx中保存的是当前光标在左(右)窗口中的位置,以保证在返回本窗口显示字符时,能够接着前一次显示的字符窜之后继续显示。
然后读取下窗口光标位置,显示字符,修改光标列变量并判断是否越界(f=65)。
越界,则修改f=15,并将窗口上卷一行,重置下窗口中光标位置。
将dx出栈,并置光标位置,使光标位于左(右)窗口中前次显示字符之后的位置,然后跳转至步骤
(1)。
4源程序与执行结果
4.1源程序及其说明
scrollmacroulrow,ulcol,lrrow,lrcol,att;卷屏宏
movah,06h
moval,1
movch,ulrow
movcl,ulcol
movdh,lrrow
movdl,lrcol
movbh,att
int10h
endm
clearmacroulrow,ulcol,lrrow,lrcol,att;清屏宏,初始化窗口
movah,06h
moval,0
movch,ulrow
movcl,ulcol
movdh,lrrow
movdl,lrcol
movbh,att
int10h
endm
pos_cursemacrox,y;光标定位宏定义
movbh,0
movah,02h
movdh,x
movdl,y
int10h
endm
displaymacro;显示字符宏定义
movah,0eh
int10h
endm
;a,b,c,d,e,f分别保存下一个字符在左、右、下三个窗口应显示的位置
get_charmacroa,b,c,d,e,f;接收输入字符宏定义
localagain,left,right,go,continue,continue1
again:
movah,00h;从键盘读该字符,al:
字符码,ah:
扫描码
int16h
cmpah,01h;若为ESC,退出程序
jeexit
cmpah,4bh;若为←键,则跳转到左窗口
jeleft
cmpah,4dh;若为→键,则跳转到左窗口
jeright
movah,03h;读取光标位置,dh/dl=行/列
int10h
cmpdl,40;判断光标是在左窗口还是右窗口
jlgo
pos_cursec,d;读取右窗口光标位置
display;显示字符
incd;列变量d+1
pos_cursec,d;重设光标位置
pushax;保存当前输入字符
cmpd,70;判断是否越界
jnecontinue
movd,50;越界,则重置列变量d
scroll5,50,15,70,1fh;右窗口上卷一行
pos_cursec,d;重置光标位置
jmpcontinue
go:
pos_cursea,b;读取左窗口光标位置
display;显示字符
incb;列变量b+1
pos_cursea,b;重设光标位置
pushax;保存当前输入字符
cmpb,30;判断是否越界
jnecontinue
movb,10;越界,则重置列变量d
scroll5,10,15,30,1fh;左窗口上卷一行
pos_cursea,b;重置光标位置
continue:
popax;取出当前输入字符
pushdx;保存左(右)窗口光标位置
pos_cursee,f;读取下窗口字符显示位置
display;显示字符
incf;列变量f+1
cmpf,65;判断是否越界
jnecontinue1
movf,15;越界,则重置f
scroll18,15,22,65,1fh;下窗口上卷一行
pos_cursee,f;将下个字符输入位置设置在底行行首
continue1:
popdx;取出保存的左(右)窗口光标坐标
movah,2h;置光标位置
int10h
jmpagain
left:
pos_cursea,b;将光标跳转至左窗口
jmpagain
right:
pos_cursec,d;将光标跳转至右窗口
jmpagain
endm
datassegment
lxdb15;初始时刻左窗口光标位置(lx,ly)
lydb10
rxdb15;初始时刻右窗口光标位置(rx,ry)
rydb50
dwxdb22;初始时刻下窗口光标位置(dwx,dwy)
dwydb15
bufdb'Pleaseinputthechar!
Youcanpress←or→tochangebetweenleft-windowsandright-windows.Ifyouwanttoexit,youcanpressEsc.Nowpressanykeytoseetheresult!
$'
datasends
codessegment
assumecs:
codes,ds:
datas
start:
movax,datas
movds,ax
leadx,[buf]
movah,9
int21h
clear5,10,15,30,1fh;初始化左窗口
clear5,50,15,70,1fh;初始化右窗口
clear18,15,22,65,1fh;初始化下窗口
pos_curserx,ry;程序开始时光标位置
get_charlx,ly,rx,ry,dwx,dwy
exit:
movah,4ch
int21h
codesends
endstart
4.2调试方法
根据算法流程图编写好程序后,运行时存在许多问题,举例如下:
(1)初始时刻光标位置不在右窗口中,经查看INT10H中AH=2功能,未设定页号而导致错误,添加BH=0后,光标位于右窗口内;
(2)窗口显示区域与窗口设定的大小不一致(如下图所示),当输入较多字符后,窗口会逐渐显示完全。
经查阅书籍资料发现,INT10H中AH=6功能中,当AL=1时,表示上卷行数;当AL=0时,表示初始化窗口。
而在程序设计中未初始化窗口,故导致上述情况的发生,经修改,添加了clear宏定义来完成窗口的初始化;
(3)输入字符后,光标会自动在左右窗口中跳转,并且在跳转时会有特殊字符出现(如上图所示),经查程序,再一次输入中左右窗口仅有一个作为输入窗口,而在程序中,执行完右窗口的操作后,没有执行jmpcontinue语句跳转至下窗口操作,而是顺次执行了左窗口的操作,导致了逻辑错误,经修改后,没有特殊字符出现。
但是还是没有解决光标的自动跳转的问题,经查,将dx进、出栈操作放置错了位置,导致没能实现预期的效果,修改后解决了这个问题。
然而光标的位置仅在当前显示字符下方,只有在边界处才在跳转至底行行首,检查程序发现,修改了光标列变量后没有执行pos_cursec,d(a,b)操作,使得光标没有后移,修改程序之后,解决了问题。
4.3运行结果
经反复调试、修改程序,最终程序能过顺利运行,运行结果如下所示:
经验证,上述结果正确,实现所要求的功能。
5总结与体会
5.1课程设计总结
此次课程设计做起来并不简单。
首先从题目阅读上来看,虽然设计要求很简单明了,但屏幕窗口的程序设计还是第一次遇到,显得很生疏;其次,查阅了一些资料,大致了解了所要使用的指令,但这些指令并非学习过程中用到过的,许多指令功能不清楚,需要一点一点地查阅,还要从众多指令中选择正确的指令实现要求的功能,在相关指令使用过程中还要注意其使用方法;在程序编写过程中,使用到了多个寄存器,在程序执行过程中,寄存器中的值会发生变化,有些值需要保存,有些值需要根据条件做适当更改,都需要严格控制;在条件判断、程序跳转时,在何时执行哪段程序,及执行后跳转到哪条指令,在逻辑上都要十分清晰,且在实现时要注意条件控制。
5.2学习体会
经过此次的程序设计,我学到了很多。
这次程序设计所使用的指令功能调用与平时使用的不一样,但这并不是我们放弃不做的理由,反而是我们应该寻求方法解决问题的动力。
我们以学习的知识有限,遇到的问题却是多种多样的,我们不能保证所有的知识都学习过了,但我们能够在日常的学习过程中学会如何去学习,掌握学习的方法。
有了较强的学习能力,才能在遇到新问题、新事物时,能够有效的学习相关知识,也才能有效的解决问题。
本科生课程设计成绩评定表
班级:
姓名:
学号:
序号
评分项目
满分
实得分
1
学习态度认真、遵守纪律
10
2
设计分析合理性
10
3
设计方案正确性、可行性、创造性
20
4
设计结果正确性
40
5
设计报告的规范性
10
6
设计验收
10
总得分/等级
评语:
注:
最终成绩以五级分制记。
优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
201年月日