1、接着定义我们的数据段代码。在数据段中,有我们菜单中所需要显示的提示信息,还有要显示在界面上方的字母乱序,以及给显示字母乱序所留出的数据空间。接下来就是定义堆栈段代码,为各段留下空间。再下来就是最重要的代码段,因为所有的功能都是在代码段中实现的。代码段中先实现显示主菜单、按Enter键开始程序和按E退出这几项简单的功能。接着实现显示字母乱序的功能,主要思想是将字母乱序放到之前定义的寄存器中。然后实现接受键盘所输入的内容的功能。如果输入的是Esc,则返回主菜单;如果输入的是Space,程序就暂停;如果是正确的字母,改字母就消失。消失的思想就是在当前字母位置输入空格,然后光标放到下一个下落的字母的位
2、置。11.1 原“typetest.asm”程序结构打字练习程序的主要流程如图所示。11.2 已经实现的功能(修改的、新编写的)程序结构设置输入界面, 用户输入密码后才能进入主菜单 ;id db 1,1,2,3,5,8inf db ?string db 0ah,0dh,Please enter the password(*):$string1 db 0ah,0dh,The password is wrong ,please enter the password again: lea dx,stringmov ah,09hint 21htwo:mov cx,6lea si,idagain:mov
3、 ah,01hand al,0fhcmp al,sijnz oneinc siinc bxloop againjmp exit1one:lea dx,string1jmp two修改主菜单, 在主菜单上显示当天日期 ;mov cx,6 mov bx,0 mov ah,0 mov al,9 s:push cx push ax out 70h,al in al,71h mov ah,al mov cl,4 shr ah,cl and al,00001111b add ah,30h add al,30h mov byte ptr ds:bx,ah bx+1,al pop ax cmp al,4 jn
4、a s1 jmp short s2 s1:dec al s2:cmp al,7 jne ok sub al,2 ok:add bx,3 pop cx loop s mov dx,0 mov ah,9 修改主菜单, 增加可供用户选择难度级别的选项。mes11 db Hit:mes12 db Right:mes13 db Score:mov ah, 01h cmp al, 1 je next12je next23je next3jmp keyin1next1:mov bx,9999hmov speed,bxjmp nextnext2:mov bx,5000hnext3: mov bx,2000hn
5、ext:修改程序, 在屏幕右上角显示用户得分、已输入字母数、正确数。score_display proc Init_place 00d, 65d int 10h lea dx,mes12 mov ax,score call writedec Init_place 00d, 43d lea dx,mes13 retscore_display endphit_display proc mov ah, 0ah mov al, ;将空格赋值为AL mov bh, 00h mov cx, 01h int 10h mov save,dl mov save+1,dh Init_place 00d, 55d
6、lea dx,mes11 add hit,1 mov ax,hit mov dl,save mov dh,save+1hit_display endp 将程序中的“置光标位置”程序段落用宏调用完成, 添加“置光标位置”宏定义。Init_place macro row, col;置光标位置宏定义mov ah, 02hmov bh, 00hmov dh, rowmov dl, colint 10h endm12 对该“打字练习程序”的进一步设想12.1 设置限定出错次数,到达该出错次数,游戏停止wrong db 30mes9 db Game Over!dec wrong cmp wrong,0 j
7、ne pass jmp overover: clear_screen 01d, 01d, 23d, 78d ; 清屏 menu 03d, 33d, mes9 mov ax, 4c00h ;退出程序13 课程设计总结设计体会刚拿到这个题目觉得特别难,感觉无从下手。汇编语言不同于高级语言,对于高级语言,我们心中可以有一个非常清晰的思路,在实现功能的时候非常得心应手。但汇编语言不同,它是面向机器的语言。用它编写程序时的思路应该按照机器执行程序的思路来编写,所以这个挑战对我来说非常大。在编写程序之前,首先要摒弃高级语言思路的干扰。在做准备工作的时候,我从网上找到了相关的代码,照着别人的步骤感受汇编语言
8、编写程序的思路。很多地方都不是太明白,但是通过查询课本以及上网找相关资料,还是把一些内容理解了。在编写的时候,我也是按照别人的思路,一步一步进行。很多地方看似简单,但是等到自己亲自实践的时候就编的很复杂。汇编语言的前后联系非常紧密,如果要改一点东西的话整个程序的很多地方都要重新做,可以说是牵一发而动全身。所以在编写的时候要很仔细,要记住前面已经实现了那些功能,还有那些功能要实现,这些必须记好,否则程序会出错。通过这次课程设计,我了解了汇编语言编写程序的步骤:先确定程序要实现的功能,接着定义需要的寄存器、存储器,如果需要的话还要画出流程图。然后逐个模块实现其功能。如果将模块分好了,再去实现它的功
9、能就不是那么复杂了。此次的课程设计,提高了我阅读和分析程序的能力。因为刚一拿到目标代码时,有太多的不明白,必须一行一行地分析其目的和功能。而时间又比较紧迫,所以我在比较短的时间里分析出了代码的道理。在这个过程中我的分析与模仿能力得到了提高。系统改进 本系统可以改进的地方有很多。首先我做的界面不够华丽,显得很单调。其次,字母下落的速度太单一,如果能随着玩的时间增加再加快就更好了。而且计分系统没把字母输入时间也计算在内。难度选择时候没有输入其它字符时的处理如果能加上这些功能的话那么程序的可用性以及完整性就有能上一台阶。14 软件使用说明登入密码:11235815 附录(参考文献,原代码:)1 李敬
10、兆 8086/8088和arm核汇编语言程序设计 中国科技大学出版社2 沈美明,温冬婵 编著IBMPC汇编语言程序设计(第二版) 清华大学出版社出版3 罗云彬 Windows环境下32位汇编语言程序设计 电子工业出版社4【美】Kip R.Irvine 著,温玉杰 等译Intel 汇编语言程序设计(第四版) 电子工业出版社5 吕晓庆 80386/80486系统编程实践 淅江大学出版社6 袁可风 汇编语言程序设计 江西高校出版社7 戴水贵 Windows汇编语言程序设计教程 清华大学出版社8 罗杰 INTEL86系列汇编语言程序设计 江西科学技术出版社原代码; Assembly program f
11、or test your type skills Writed by in 06/24/2003 Modified by Mi shuang in 06/06/2005 -Init_boarder macro row, col, char, dhdl, count;设置边框Local llmov cx, count ll: mov ah, 02hint 10hpush cxmov ah, 0ahmov al, charmov cx, 01hpop cxinc dhdlloop ll -clear_screen macro top, left, bottom, right; 清屏宏定义mov a
12、h, 06h mov al, 00hmov bh, 07hmov ch, topmov cl, leftmov dh, bottommov dl, rightmov dh, 00hmov dl, 00h -menu macro row, col, text; 菜单显示宏定义 mov bh, 00h mov dh, row mov dl, col int 10h mov ah, 09h lea dx, text int 21h =include ylib.hData segment db 00/00/00 00:00:00,$ZK db WELCOME TO PLAY$date db date:
13、mes0 db Press Enter key to continue.$mes1 db When a letter is dropping,please hit it!mes2 db Press space key to pause!mes3 db Press ESC key to return main interface!mes4 db Press letter E to exit!mes5 db Please choose the difficulty:mes6 db No.1 easy$mes7 db No.2 normal$mes8 db No.3 hard$mes10 db Yo
14、ur Score is:Speed dw ?Letters db jwmilzoeucgpravskntxhdyqfb db iytpkwnxlsvxrmofzhgaebudjqnwimzoexrphysfqtvdcgljukdaPresent_position db 1db 0score dw 0hit dw 0right dw 0save db ?Data ends =code segmentmain proc farassume cs: code, ds: datastart: mov ax, datamov ds, ax mov es, axmov cx, 5000hmov ah, 0
15、1hint 10h ;设置光标类型clear_screen 00d, 00d, 24d, 79d ;清屏 exit1: Init_boarder 00d, 00d, 0ah, dl, 80dInit_boarder 24d, 00d, 0ah, dl, 80dInit_boarder 00d, 00d, 0ah, dh, 25dInit_boarder 00d, 79d, 0ah, dh, 25d ;menu 05d, 15d, ZK ; 显示菜单menu 07d, 15d, dateint 21h menu 09d, 15d, mes0menu 11d, 18d, mes1menu 13d,
16、 18d, mes2menu 15d, 18d, mes3menu 17d, 15d, mes4Init_place 22d,33dkeyin: mov ah, 07h ; 从键盘输入命令字符int 21hcmp al, 0dh je begin 不等就和e做比较je exit ;如果相等则转exit jmp keyin ;不等跳转到keyinexit: mov ax, 4c00h ;begin:clear_screen 00d, 00d, 24d, 79d ; 清屏 menu 00d, 43d, mes13 menu 00d, 55d, mes11 menu 00d, 65d, mes12m
17、enu 05d, 15d, mes5 ;menu 11d, 18d, mes6menu 13d, 18d, mes7menu 15d, 18d, mes8keyin1:clear_screen 01d, 01d, 23d, 78d ;Init_boarder 23d, 01d, 01h, dl, 78d ; 设置边框Init_place 01h,01hmov cx, 78 lea si, lettersnextletter:mov ah, 02h ; 显示字母mov dl, si int 21hinc siloop nextletterstart_game: mov ah, 2ch int 2
18、1h ;调取系统时间chcldh分别存放时分秒 inc dl ;自增 cmp dl, 78 jna sg1 sub dl, 78sg1: mov present_position, dl lea di, letters add di, word ptr present_position ;将当前列数赋给di dec di ;自减 mov dl, present_position ;将当前列数赋给dl mov ah, 02h mov dh, 01h int 10h ; mov cx, 21d ;设置循环次数nextrow: push cx mov cx,speed ;设置字母下降速度wait_for_key: ; 延迟 push cx mov cx,1000 delay: loop delay push dx mov ah, 06h ; 从键盘输入字符 mov dl, 0ffh pop dx jz pass cmp al, 1bh ; 如果键入ESC,则返回主菜单 je to_start cmp al, 如果键入SPACE,则游戏暂停 jne pass0pause: push dx ; 暂停处理 mov ah, 06h将字符和空格作比较 jne pause ;不等则转换至空格 jmp passto_start: jmp exit1pass0: c
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1