您好,欢迎访问三七文档
实训一光标漫游⒈问题在25行80列的显示屏内,通过按键“→、←、↑、↓”来改变光标的位置,如按“→”键则光标往右侧走一列,按“↑”键则光标往上走一行的位置,最终通过“Esc”结束程序。⒉边界问题要处理好特殊情况:①光标在第一行,再按“↑”键时;②光标在第一列,再按“←”键时;③光标在第25行,再按“↓”键时;④光标在第80列,再按“→”键时。⒊边界问题处理采用折返的方式:①光标在第1行,再按“↑”键时进到第25行;②光标在第1列,再按“←”键时进到第80行;③光标在第25行,再按“↓”键时进到第1行;④光标在第80列,再按“→”键时时进到第1列。⒋实验基础①读键:用int16h的0号功能调用掌握扫描码和字符码的区别Movah,0Int16h;返回AH=扫描码,AL=字符码②定位光标:用int10h的2号③清屏:用int10h的6号(或7号)功能调用MOVAH,6MOVBH,04hMOVAL,0MOVCX,0MOVDX,184fhINT10h④相关键的扫描码和字符码EnterKeyEQU1c0dhEscKeyEQU010bhUpCursorEQU4800hLeftCursorEQU4b00hRightCursorEQU4d00hDownCursorEQU5000h5.算法do{定位光标读键if(al==特殊键){if(ah==左光标键)修正列值}elseif(ah==右光标键){修正列值}elseif(ah==上光标键){修正行值}elseif(ah==下光标键){修正行值}}}while(al!=Esc)6.实验步骤运行“光标漫游示例.EXE”了解需求。①编一小程序获得特殊键“→、←、↑、↓”“Esc、回车”等的扫描码和Asc码值,并记录以备后用;②写出光标漫游的算法(保存,用类自然语言描述,用word,与同学、老师讨论算法的可行性与正确性);③在②初步正确的基础上,编写汇编语言源程序;④如发现算法问题,用调试器调试;7.要点光标如何根据所按的键跟随?折返如何处理?x=(x+1)%25;8.该实验与大实验的关联性请大家体会主菜单“实验蓝本.exe”的处理过程。附件:实验报告内容①问题②设计要点及算法③源程序④运行结果⑤使用调试器状况和经验总结⑥使用体会和总结实训一光标漫游改进根据跳跃表法(另称跳转表,教材p180)来改进光标漫游程序。键:“→、←、↑、↓”、“Esc”、“Enter”、“ALT_X”(退出循环)。其中对“Esc”、“Enter”键暂不做任何处理。1.掌握跳转表的原理MenuJmpTbldwEnterkey,IsEnterKeydwEscKey,IsESCKeydwUpCursor,IsUpCursordwLeftCursor,IsLeftCursordwRightCursor,IsRightCursordwDownCursor,IsDownCursor上述跳转表共6项,每项为:键值(扫描码+字符码)、处理的入口地址2.掌握跳转表的总控程序(入口地址为标号)……ContinueReadKey:……MOVBX,offsetMenuJmpTblMOVCX,6YesNoKeyEqual:cmpax,[bx]jeIsKeyEqualaddbx,4loopYesNoKeyEqualjmpContinueReadKeyIsKeyEqual:movbx,[bx+2]jmpbx……IsEnterKey:…..IsESCKey:…..3.掌握跳转表的总控程序(入口地址为子程序)……ContinueReadKey:……MOVBX,offsetMenuJmpTblMOVCX,6YesNoKeyEqual:cmpax,[bx]jeIsKeyEqualaddbx,4loopYesNoKeyEqualjmpContinueReadKeyIsKeyEqual:movbx,[bx+2]callbxjmpContinueReadKey……IsEnterKeyproc……;不能用无条件转移指令等跳出子程序retIsEnterKeyendp…..IsESCKeyproc…..实训二色彩处理及方框显示⒈问题在显示屏显示各种形状的方框(大小不一)。┬──┬┌───┐││││└──┘└───┘等实验中可用1,2,3,4,…,9,0等来代替,如:122222223455555556455555556455555556788888889⒉实验基础①注意颜色查看conio.c中的函数:颜色名称值颜色名称值BLACK0DARKGRAY8BLUE1LIGHTBLUE9GREEN2LIGHTGREEN10CYAN3LIGHTCYAN11RED4LIGHTRED12MAGENTA5LIGHTMAGENTA13BROWN6YELLOW14LIGHTGRAY7WHITE15⒊实验步骤①编写小程序,用int10h的0eh功能来显示字符串;②写出显示方框的算法(注意模块化);③在②初步正确的基础上,编写汇编语言源程序;④如发现算法问题,用调试器调试;④完成本实验的实验报告。4.算法ShowBox(左上角坐标,右下角坐标,方框串,颜色){//显示第一行//for显示中间行//显示最后一行}ShowALineOfBox(左上角坐标,宽度,方框子串,颜色){//定位光标//设置颜色并显示第一字符//for显示中间字符//显示最后一字符}5.实验关键先实现ShowALineOfBox子程序,编程时考虑模块化的概念,处理参数的传递方法(先采用变量或寄存器的方式来传送)。参考下列案例:boxstrdb'123'….movah,0ehmovbl,0fhmovbh,0moval,boxstrint10hmovcx,10moval,boxstr+1showrepchar:int10hloopshowrepcharmoval,boxstr+2int10h注意上述代码和算法的关系。6.直接写屏来显示的原理和方法①对显示缓冲区的简单介绍②对字符属性字节的简单介绍③一个简单的例子④直接写屏的案例movdi,0b800hmoves,dixordi,di;di=0,表示是0行0列的位置,如要显示在(5,8)的位置,di该何值?movsi,offsetboxstrmovah,0fhlodsbstoswmovcx,10lodsbrepstoswlodsbstosw7.直接写屏的方框显示算法ShowBox(左上角坐标,右下角坐标,方框串,颜色){//根据左上角坐标计算显示缓冲区地址,用子程序定义//显示第一行//for显示中间行//显示最后一行}※可用+160的方法来处理下一行的起始位置,编程时用进栈和退栈指令来保存和还原ShowALineOfBox(左上角坐标的起始地址,宽度,方框子串,颜色){//设置颜色并显示第一字符//for显示中间字符//显示最后一字符}8.参数表的标准传递方式ShowBox(左上角坐标,右下角坐标,方框串,颜色)C语言参数传递模型:把参数自右向左压入栈;在函数执行时用相应的参数数据。子程序的参数入栈:示例Movax,颜色PushaxMovax,方框串地址PushaxMovax,右下角坐标PushaxMovax,左下角坐标Pushax…showBoxproc;子程序里代码Movbp,sp;[bp+2]左下角坐标;[bp+4]右下角坐标;[bp+6]串地址;[bp+8]颜色……ret8showBoxEndp实训三主菜单的显示与选择⒈问题在屏幕上显示下列菜单,并能通过“→、←、↑、↓”来切换菜单项。如初始显示为:当按“→”键时,变成:再按“→”键时,变成:系统的先期实现按下列约定实施:“Enter”确认菜单项或弹出子菜单;“ESC”返回子菜单;“→、←”主菜单项间切换;“↑、↓”子菜单项间切换;完成上述功能后,再对相应的按键进行功能的扩展。⒉实验基础本实验是实验一加颜色处理的方法来实现,所以本次实验的基础大家都具备。运行“主菜单演示.exe”体会编程。⒊实验原理如何来实现菜单项的切换是本实验的技巧。FileEditRunCompileProjectOptionsDebugFileEditRunCompileProjectOptionsDebugFileEditRunCompileProjectOptionsDebug假定我们用一变量mi来指向当前选中的菜单,当按“→”键时,我们用“未选中的颜色”来定位重写“File”的串,使菜单变成:然后是按键处理后,mi修正为1,然后用“选中的颜色”定位重写“Edit”,变成上图的效果,实现了菜单项的动态切换。⒋实验步骤①在word上写出算法(其中主菜单的字符串数据放在数组中)。②思考……③提问④算法正确后再编写程序。⒌主菜单的显示算法FileEditRunCompileProjectOptionsDebugmi,MenuIndex的缩写FileEditRunCompileProjectOptionsDebugmi,MenuIndex的缩写FileEditRunCompileProjectOptionsDebugmi实训四菜单数据的组织⒈问题看实例“实验蓝本.exe”,思考菜单数据如何组织?数据的组织与菜单显示之间怎么关联?⒉菜单的逻辑结构图⒊数据的组织结构//菜单结构体定义MenuStrustrucSubMenuCountdb?;子菜单的数目SubMenuWidthdb?;子菜单的宽度SubMenuAddrdw?;子菜单数据结构地址MenuStrWidthdb?;菜单项字符串长度MenuStrAddrw?;菜单项的字符串地址MenuStruends⒋菜单数据的组织看“Menu2014.asm”⒌理解菜单数据组织与程序的关系⒍改进实训练三①掌握结构体变量和指针的使用;②在一循环中用结构体变量或指针来访问相关参数;③在循环中加入打印字符串语句,显示出主菜单;④加入颜色等,实现主界面。实训五菜单系统的设计整个菜单系统的设计需要进一步抽象。设计时要考虑扩展性和通用性的问题:菜单数据的改变,如我们的实例中只有3层菜单,如果把菜单数据增加到4、5等层次菜单时,你所编写的程序代码在只允许修改菜单数据,而不允许修改所有的函数的情况下,你的设计是否能达到此目标?要实现上述目标,必须对处理过程进行抽象。菜单系统总体上应该如此实施:①显示主菜单;②读键(暂定有效键为“→、←、↑、↓、Esc、Enter”);③处理有效键。④反复执行②③。特别要注意整个程序中只有一处读键的地方。由于菜单系统选择的层次性,我们必须对菜单选择的(中间)过程进行有效保存,以便回溯。如当我们进入主菜单项的“Options”→“Compiler”→“Compiler”的子菜单,当我们用“Esc”键时可以回退到“Compiler”状态,从“Compiler”还可以回退到“Options”状态。为有效管理这种选择状态,我们必须对选择状态加以保存。我们采取以下结构体来保存选择的历史信息(C语言):typedefstructMenuSelectStru{ShortIntMenuIndex,MenuTotal;//选择菜单中的哪项MenuItemStru*MenuAddr;//对应主菜单/子菜单的数据结构地址PCHAR_INFOAddrOfSaveText;//备份下拉菜单区域的空间boolPullDownMenu;//下拉菜单有否显示ShortIntleft,top,right,bottom;};也可考虑用下列历史结构:(把left,top,right,bottom内容放入AddrOfSaveText指向的空间中)HistoryStrustrucMenuIndexdb0;选择菜单中的哪项MenuTotaldb0;菜单的项数MenuAddrdw0;对应主菜单/子菜单的数据结构地址AddrOfSaveTextdw0;备份下拉菜单区域的空间PullDownMenudb0;下拉菜单有否显示HistoryStruends考虑到本实验的最大菜单级数为三级,我们可定义含3个元素的数组来保存历史的选择信息(如果
本文标题:汇编语言菜单系统
链接地址:https://www.777doc.com/doc-3392472 .html