摘 要
汇编语言(Assembly Language)是面向机器的程序设计语言,汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。在汇编语言中,用助记符(Mnemonic)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。因此汇编语言亦称为符号语言。
关键字:汇编语言、程序设计、助记符
目录
摘 要 0
目录 1
前 言 2
第1章 系统分析 3
第2章 系统总体设计 4
2.1 打字程序包括以下五个子程序: 4
2.2 算法的整体设计思路 4
2.3 程序的主要特点 4
第3章 详细设计 5
3. 1主界面伪代码 5
3. 2等级界面伪代码 5
3.3游戏界面伪代码 6
3. 4清屏子程序设计 6
3.5密码程序设计 7
3.6宏代码 8
3.6.1在指定位置显示彩色字符串 8
3.6.2显示背景 9
3.6.3画横向边框的宏 9
3.6.4画竖边框的宏 10
3.7功能的进一步完善 11
3.7.1完善代码一 11
3.7.2完善代码二 12
3.7.3完善代码三 12
第4章 软件使用说明书 14
4.1密码界面图: 14
4.2主界面图: 14
4.3等级选择界面: 14
4.4游戏界面: 15
参考文献 17
致谢 18
源代码: 19
前 言
随着计算机的不断更新发展,计算机在各个领域的应用越来越多,更多的软件开发人员和相关技术人员在程序设计的过程中应用汇编程序或编制汇编语言。而汇编语言作为计算机专业大学生必修课,每个作为本专业的学生对汇编的理解和学习就显得尤为重要。汇编语言是计算机能够提供用户使用的最快而又最好最有效的与言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言。因而,对程序的空间和时间要求很高的场合,汇编语言的应用就显得必不可少了,一些直接控制硬件的应用场合,则更是非用汇编语言不可了。
《打字游戏程序设计》课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化和提高。因此,要求我们能综合应用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验的基本技能方面上进行一次全面的训练。通过具体的问题分析、设计、调试、运行程序。在实际问题中锻炼提高自己,增加了对本门课程内容的理解,锻炼了动手能力。就这个程序具体而言:调用宏,显示背景和主界面,通过选择不同的选项,可以进入不同的界面;采用BIOS功能的中断,可以在任何时候退出当前所在的界面并通过选择进入其他的界面。这个程序最终通过菜单所提示的信息选取所要进入的界面,获得所要的功能。
第1章 系统分析
要求完成一个打字练习程序,即在规定的时间内按下屏幕上显示的字母,字母就消失,否则字母一直移动到屏幕底端。
流程图
本次程序开始是一个主界面,在主界面上包括四个选项,第一个选项是进入打字子程序,第二个是选择进入等级设置子程序,第三个是进入帮助子程序,第四个是退出主界面,以下是程序的主流程图:
第2章 系统总体设计
2.1 打字程序包括以下五个子程序:
(1)主界面的显示模块;
(2)打字练习模块;
(3)设置速度模块;
(4)密码模块;
(5)清屏模块。
其中的打字练习模块又分为以下三个子程序:
(a)游戏界面模
(b)功能模块
2.2 算法的整体设计思路
此程序涉及到宏和I/O中断的调用,通过对宏的定义和使用以及对I/O中断的使用,实现程序的相应功能。利用宏,实现各个界面的显示,采用中断,实现各个子程序的相互转换。其中最主要的是打字程序:运行程序,打字界面中出现由26个字母组成的乱序行,这时其中会有任一字母落下,在键盘上输入该字母,字母消失,分数值加1,否则字母一直移动到屏幕底端,然后消失,生命值减1。当生命值减为零且未在字母下落到屏幕底端之前输入该下落字母时,打字练习结束,显示结束界面。
2.3 程序的主要特点
本程序最大的特点就是具有较好的人机交互功能。在主界面中,用户可以选择不同的游戏等级,他们能够根据自己的实际打字速度,选择相匹配的等级进行打字练习。如果用户对我们设计的程序有不明白的地方,可以选择帮助进行求解,并能与我们联系,讨论程序的不足,寻求改进,或者分享程序中的精妙之处。此外,根据用户的打字情况我们会给予他们相应的分数和生命数。
第3章 详细设计
3. 1主界面伪代码
系统的主界面主要是显示欢迎语,制作人,时间,速度选择等主界面信息。方便用户了解信息并进行选择操作。用户密码为“111111”。在用户输入正确的密码之后即可进入游戏进入下一选择菜单。
STR1 DB ' Welcome to play chars',0AH,0DH, '$'
STR2 DB ' Made by limingming jiangsongli',0AH,0DH, ' $'
STR3 DB ' 2012/6/21 ',0AH,0DH, ' $'
STR4 DB ' Please choose speeding',0AH,0DH, ' $'
STR5 DB ' Please press Enter to cintinue... ',0AH,0DH, ' $'
STRA DB ' <------Please choose----->',0AH,0DH, '$'
STRB DB 'score: ', 'i',0AH,0DH, '$'
STRC DB 'You choose: ',0AH,0DH, '$'
STRD DB 'hqfuvodepfdjygnhtrwgaerjrklubgsnyrsbntrsbngtrdjykuahtrgregfytjgfjytjktru', '$'
STRE DB ' RIGHT: ', '$'
MES5 DB "PLEASE ENTER YOUR PASSWORD :$"
PASSWORD DB "111111"
PASSWORD1 DB 6 DUP(?)
3. 2等级界面伪代码
在主界面中选择2,进入等级界面的设置,其中有6个等级,代表不同的难易程度。用户可选则其中的任意一个级别,按Enter键表示确定并返回主界面,若用户输入的错误的等级,则一直等待,直到输入了正确的等级。
以下是等级界面的伪代码:
STR7 DB ' speed 1',0AH,0DH, ' $'
STR8 DB ' speed 2',0AH,0DH, '$'
STR9 DB ' speed 3',0AH,0DH, '$'
STR0 DB ' Select the number among 1-3',0AH,0DH, '$'
3.3游戏界面伪代码
此伪代码显示的是进入打字界面的提示信息:
ST1 DB ' RIGHT: Pause',0AH,0DH, '$'
ST2 DB ' E : Quit',0AH,0DH, '$'
ST8 DB ' Esc: Back',0AH,0DH, '$'
ST3 DB ' Function Meun',0AH,0DH, '$'
ST4 DB ' please input... ',0AH,0DH, '$'
ST5 DB ' SPACE: Continue',0AH,0DH, '$'
ST6 DB ' Thank You ! ',0AH,0DH, '$'
ST10 DB ' ',0AH,0DH, '$'
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
ST9 DB ' VREY GOOD ! ',0AH,0DH, '$'
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
3. 4清屏子程序设计
BIOS功能调用中的INT 10H功能6能使屏幕内容上卷指定的行,这个功能需要设置4个参数,分别代表清屏区域的左上角的坐标和右下角的坐标。如果屏幕的其实行列不为(0,0)结束的行列不为(24,79),则屏幕上只有指定的一部分具有上卷的功能,这个屏幕伤的部分区域叫做窗口(window)像这样的窗口可以在屏幕上设置多个,这些窗口都可以独立使用。如果上卷超过指定窗口的顶部,这些行的内容就消失,出现在窗口底部的新行被填为空格,其属性用BH寄存器决定。
如果AL=0,则实现完成的工作是清楚屏幕的功能,它将按AL中的BH字符使指定的窗口为空白。
以下是清除全屏幕的子程序:
CLEAR PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,6
MOV AL,0 ;blank screen
MOV BH,7
MOV CH,0 ;左上角行号
MOV CL,0 ;左上角列号
MOV DH,24 ;右下角行号
MOV DL,79 ;右下角列号
INT 10H ;屏幕初始化或上卷
MOV DX,0 ;行列号都为0
MOV AH,2
INT 10H ;置光标位置
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
; DIS5 25D,10100100B ;置背景色 背景 蓝 前景红
DIS5 25D,11110100B ;置背景色 背景白色 前景红
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
DIS3
RET
CLEAR ENDP
3.5密码程序设计
DIS1 MES5,5,15
LEA BX,PASSWORD1
MOV CX,6
INPUT:
MOV AH,07H
INT 21H
MOV [BX],AL
INC BX
MOV AH,02H
MOV DL,'*'
INT 21H
LOOP INPUT
CONTIUN:
MOV AH,07H
INT 21H
CMP AL,0DH
JNE CONTIUN
MOV CX,6
LEA SI,PASSWORD
LEA DI,PASSWORD1
CHECK:
MOV AL,[SI]
CMP AL,[DI]
JNE START
INC SI
INC DI
LOOP CHECK
3.6宏代码
3.6.1在指定位置显示彩色字符串
;=========================================================
DIS1 MACRO STRING1,Y,M
MOV AH,2
MOV BH,0 ;页号
MOV DH,Y ;行标
MOV DL,M ;列标
INT 10H ;置光标位置
MOV AH,09H
MOV DX,SEG STRING1
MOV DS,DX
MOV DX,OFFSET STRING1
INT 21H ;显示字符串
ENDM
;========================================================
3.6.2显示背景
;============================================================
DIS5 MACRO S1,S2
DIS2
MOV AH,6
MOV AL,0 ;blank screen
MOV AL,s1 ;上卷25行
MOV BH,s2 ;绿色背景 红色前景
MOV CH,0
MOV CL,0
MOV DH,0
MOV DL,80
INT 10H ;屏幕初始化或上卷
DIS3
ENDM
;===============================================================
3.6.3画横向边框的宏
;===============================================================
DIS6 MACRO Z1,Z2,Z3,Z4
LOCAL C5 ; LOCAL为重复定义的定义符
DIS2
MOV CX,Z1 ;循环次数
MOV DL,Z2 ;列
C5: MOV AH,2
MOV BH,Z3 ;页号
MOV DH,Z4 ;行
INT 10H ;置光标位置
PUSH DX
MOV DL,2AH
INT 21H ;输出‘*’
POP DX
INC DL ;列 ++
LOOP C5
DIS3
ENDM
;===============================================================
3.6.4画竖边框的宏
;===================================================================
DIS7 MACRO Q1,Q2,Q3,Q4
LOCAL F1 ; LOCAL为重复定义的定义符
DIS2
MOV CX,Q4
MOV DH,Q1 ;行
F1: MOV AH,2
MOV BH,Q2
MOV DL,Q3 ;列
INT 10H ;置光标位置
MOV DL,2AH
INT 21H
INC DH
LOOP F1
DIS3
ENDM
;=======================================================================
3.7功能的进一步完善
3.7.1完善代码一
修改界面背景属性
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;DIS5 25D,10100100B ;置背景色 背景 蓝 前景红
DIS5 25D,01001111B ;置背景色 背景 红 前景白
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
闪烁 | 背景 | 背景 | 背景 | 亮度 | 前景 | 前景 | 前景 |
;============================================================
;显示背景
DIS5 MACRO S1,S2
DIS2
MOV AH,6
MOV AL,0 ;blank screen
MOV AL,s1 ;上卷25行
MOV BH,s2 ;绿色背景 红色前景
MOV CH,0
MOV CL,0
MOV DH,0
MOV DL,80
INT 10H ;屏幕初始化或上卷
DIS3
ENDM
;===============================================================
3.7.2完善代码二
击中下落字母后,使其显示不同的颜色
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
MOV AH,2
MOV BH,0
INT 10H
PUSH ax
PUSH bx
mov ah ,9
mov bh ,0
mov cx,1
mov al,[si]
mov bl,00101111B ;字母击中后显示白色
INT 10H
pop ax
pop bx
call SLEEP1
MOV AH,2
MOV BH,0
PUSH DX
MOV DL,' '
MOV AH,02H
INT 21H ;显示空格 覆盖字母
INT 10H ;置光标位置
POP DX
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
3.7.3完善代码三
当游戏分数达到某一数值时,显示“Very Good!”
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
ST9 DB ' VREY GOOD ! ',0AH,0DH, '$'
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
CMP AL,30 ;击中30次显示
jnz T
DIS1 ST9 20,60 ;显示“VERY GOOD”
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
第4章 软件使用说明书
4.1密码界面图:
运行程序,将会出现以上界面,这个功能是通过字符串的一个一个的比较实现的,输入错误后,要重新输入,直到输入正确的密码。
4.2主界面图:
输入密码后,进入主界面;
第一行是密码行;
第二行是欢迎语句;
第三行是组员名字;
第四行是演示代码的时间;
第五行是提示语句。
4.3等级选择界面:
按ENTER键后,进入等级选择界面这是一个等级选择界面,有三个等级进行选择,分别代表不同的速度,速度一次递增,只能输入1-3,直到输入正确才能开始游戏。
4.4游戏界面:
选择等级后,进入游戏界面;
界面的左边是功能菜单,可以进行功能的选择,暂停(空格键),退出(E),返回
主界面(Esc);
界面的中间是游戏区,当用击中下落的字母后,字母会变为白色,并有声音发出,表示用户击中字母;
界面的右边是记分功能,可以显示用户的当前分数。
第5章 课程设计总结
汇编语言(Assembly Language)是面向机器的程序设计语言。
汇编语言比机器语言易于读写、易于调试和修改,同时也具有机器语言执行速度快,占内存空间少等优点,但在编写复杂程序时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不同机型之间移植。是能完成一定任务的机器指令的集合。 常说汇编语言过时,是低级语言,并不是说汇编语言要被弃之,相反,汇编语言仍然是程序员必须了解的语言,在某些行业与领域,汇编是必不可少的,非它不可适用。复习了一遍,加深了我的印象,通过设计,我深刻认识到一个清晰明朗的流程图对程序的设计是十分重要的。
通过编写程序,不仅使我所学汇编语言的知识更加巩固,而且可以使理论与实践相结合,更好的掌握所学到的知识。在编写程序的时候我也发现了自己很多的不足之处,例如在课堂上学的理论知识有的时候很难把它应用到实际程序中,看似一个简单的功能模块往往需要很多知识的融合。
通过这次课程设计让我跟具体的了解了汇编语言的用途以及他的特点,这样有利于在今后的实践中更好的去应用汇编语言解决问题,同时通过这次的课程设计也体现出了我的在汇编方面的一些基础知识的不足。由于对汇编语言的一些基本知识的掌握不足,程序中还存在或多或少的缺陷和不足,有一些的基本功能在逻辑上还存在一些的小问题,但是不会影响基本的使用。
参考文献
1 王爽.汇编语言(第二版).清华大学出版社, 2008。
2 沈美明,温冬婵.IBM-PC汇编语言程序设计(第二版).清华大学出版社, 2001。
3 [美]Kip R.Irvine著,温玉洁,等译.Intel汇编语言程序设计(第五版).电子工业出版社, 2007。
4 钱晓捷.汇编语言程序设计(第二版). 电子工业出版社, 2003。
5 罗云彬.Windows环境下32位汇编语言程序设计(第二版).电子工业出版社, 2006。
6 Windows API函数参考手册.人民邮电出版社, 2002。
致谢
在本次课程设计中,我从指导老师身上学到了很多东西。在此过程中我了解到了程序编写的博大精深,体会到编制程序的无穷乐趣。在小组合作的过程中,集思广益,团结互助,体会到了合作的重要性。这段时间的学习我看到了老师无私的奉献,也看到了老师不辞辛苦的来回奔波,还看到了同学们浓厚的学习兴趣。我们组内每位成员都认真积极的投入到讨论、设计中,各司其职 ,互相帮助,取长补短。最后在大家的一致努力下完成了此次的课程设计。在这里,感谢老师,感谢我们的每一位小组成员做出的努力。
源代码:
;============================================================
;\\\\\\
;两排斜杠中间为 提问 修改部分
;\\\\\\
;=========================================================
;在指定位置显示彩色字符串
DIS1 MACRO STRING1,Y,M
MOV AH,2
MOV BH,0 ;页号
MOV DH,Y ;行标
MOV DL,M ;列标
INT 10H ;置光标位置
MOV AH,09H
MOV DX,SEG STRING1
MOV DS,DX
MOV DX,OFFSET STRING1
INT 21H ;显示字符串
ENDM
;========================================================
;宏进栈
DIS2 MACRO
PUSH AX
PUSH BX
PUSH CX
PUSH DX
ENDM
;==========================================================
;宏出栈
DIS3 MACRO
POP DX
POP CX
POP BX
POP AX
ENDM
;============================================================
;显示背景
DIS5 MACRO S1,S2
DIS2
MOV AH,6
MOV AL,0 ;blank screen
MOV AL,s1 ;上卷25行
MOV BH,s2 ;绿色背景 红色前景
MOV CH,0
MOV CL,0
MOV DH,0
MOV DL,80
INT 10H ;屏幕初始化或上卷
DIS3
ENDM
;===============================================================
;画横向边框的宏
DIS6 MACRO Z1,Z2,Z3,Z4
LOCAL C5 ; LOCAL为重复定义的定义符
DIS2
MOV CX,Z1 ;循环次数
MOV DL,Z2 ;列
C5: MOV AH,2
MOV BH,Z3 ;页号
MOV DH,Z4 ;行
INT 10H ;置光标位置
PUSH DX
MOV DL,2AH
INT 21H ;输出‘*’
POP DX
INC DL ;列 ++
LOOP C5
DIS3
ENDM
;===================================================================
;画竖边框的宏
DIS7 MACRO Q1,Q2,Q3,Q4
LOCAL F1 ; LOCAL为重复定义的定义符
DIS2
MOV CX,Q4
MOV DH,Q1 ;行
F1: MOV AH,2
MOV BH,Q2
MOV DL,Q3 ;列
INT 10H ;置光标位置
MOV DL,2AH
INT 21H
INC DH
LOOP F1
DIS3
ENDM
;=======================================================================
DATAS SEGMENT
STR1 DB ' Welcome to play chars',0AH,0DH, '$'
STR2 DB ' Made by limingming jiangsongli',0AH,0DH, ' $'
STR3 DB ' 2012/6/21 ',0AH,0DH, ' $'
STR4 DB ' Please choose speeding',0AH,0DH, ' $'
STR5 DB ' Please press Enter to cintinue... ',0AH,0DH, ' $'
STR7 DB ' speed 1',0AH,0DH, ' $'
STR8 DB ' speed 2',0AH,0DH, '$'
STR9 DB ' speed 3',0AH,0DH, '$'
STR0 DB ' Select the number among 1-3',0AH,0DH, '$'
STRA DB ' <------Please choose----->',0AH,0DH, '$'
STRB DB 'score: ', 'i',0AH,0DH, '$'
STRC DB 'You choose: ',0AH,0DH, '$'
STRD DB 'hqfuvodepfdjygnhtrwgaerjrklubgsnyrsbntrsbngtrdjykuahtrgregfytjgfjytjktru', '$'
STRE DB ' RIGHT: ', '$'
MES5 DB "PLEASE ENTER YOUR PASSWORD :$"
PASSWORD DB "111111"
PASSWORD1 DB 6 DUP(?)
ST1 DB ' RIGHT: Pause',0AH,0DH, '$'
ST2 DB ' E : Quit',0AH,0DH, '$'
ST8 DB ' Esc: Back',0AH,0DH, '$'
ST3 DB ' Function Meun',0AH,0DH, '$'
ST4 DB ' please input... ',0AH,0DH, '$'
ST5 DB ' SPACE: Continue',0AH,0DH, '$'
ST6 DB ' Thank You ! ',0AH,0DH, '$'
ST10 DB ' ',0AH,0DH, '$'
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
ST9 DB ' VREY GOOD ! ',0AH,0DH, '$'
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
LENTH EQU $-STRD ;STRD的长度
M DB 0
N DB ?
A DB 0 ;速度1选择标志
B DB 0 ;速度2选择标志
V DB 0 ;速度3选择标志
DATAS ENDS
;===================================================================
STACK1 SEGMENT STACK
DB 100 DUP (?)
STACK1 ENDS
;===================================================================
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACK1
START:
MOV AX,DATAS
MOV DS,AX
CALL CLEAR ;调用清屏函数,清除dos界面
;==================================================================
;输入密码
DIS1 MES5,5,15
LEA BX,PASSWORD1
MOV CX,6
INPUT:
MOV AH,07H
INT 21H
MOV [BX],AL
INC BX
MOV AH,02H
MOV DL,'*'
INT 21H
LOOP INPUT
CONTIUN:
MOV AH,07H
INT 21H
CMP AL,0DH
JNE CONTIUN
MOV CX,6
LEA SI,PASSWORD
LEA DI,PASSWORD1
CHECK:
MOV AL,[SI]
CMP AL,[DI]
JNE START
INC SI
INC DI
LOOP CHECK
;====================================================================
CALL DISPLAY1 ;显示主欢迎界面
AG: MOV A,0
MOV B,0
MOV V,0 ;只相应的速度标志为0
TH2: MOV AH,7
INT 21H ;无回显 键盘输入字符
CMP AL,0DH ;如果是回车,则继续
JNE TH2 ;否则继续输入
;第二屏
TH1: CALL CLEAR ;调用清屏函数
DIS6 80,0,0,0 ;第一行 ‘*’
DIS6 79,0,0,24 ;最后一行 ‘*’ 79
DIS7 1,0,0,23 ;左
DIS7 1,0,79,23 ;右
DIS1 STR4,10,25 ;宏调用显示欢迎界面及速度选择项
DIS1 STR7,12,30
DIS1 STR8,14,30
DIS1 STR9,16,30
DIS1 STR0,20,16
THD: MOV AH,7
INT 21H ;无回显 键盘输入字符
CMP AL,31H ;判断是否为1
JNE MODIFYA
JMP THB ;是则转 ,JMP实现间接跳转
MODIFYA:
CMP AL,32H ;判断是否为2
JNE MODIFYB
JMP THC ;是则转
MODIFYB:
CMP AL,33H ;判断是否为3
JNE THD ;不是则 重新输入
MOV V,1 ;速度3被选中的标志
JMP THA
THB:
MOV A,1 ;速度1被选中的标志
JMP THA
THC:
MOV B,1 ;速度2被选中的标志
THA:
CALL CLEAR ;调用清屏函数
CALL PAINT ;调用函数画游戏边框
CALL FALL ;调用下落函数
JMP AG ; ESC 回到主界面
;===================================================================
;显示功能菜单函数
DISPLAY1 PROC NEAR
DIS1 STR1,10,25
DIS1 STR2,13,8
DIS1 STR3,16,31
DIS1 STR5,21,19
DIS6 80,0,0,0 ;第一行 ‘*’
DIS6 79,0,0,24 ;最后一行 ‘*’ 79
DIS7 1,0,0,23 ;左
DIS7 1,0,79,23 ;右
RET
DISPLAY1 ENDP
;==========================================================================
;清屏函数,清除整个屏幕
CLEAR PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,6
MOV AL,0 ;blank screen
MOV BH,7
MOV CH,0 ;左上角行号
MOV CL,0 ;左上角列号
MOV DH,24 ;右下角行号
MOV DL,79 ;右下角列号
INT 10H ;屏幕初始化或上卷
MOV DX,0 ;行列号都为0
MOV AH,2
INT 10H ;置光标位置
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
; DIS5 25D,10100100B ;置背景色 背景 蓝 前景红
DIS5 25D,01001111B ;置背景色 背景白色 前景红
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
DIS3
RET
CLEAR ENDP
;==========================================================================
;下落函数,核心子函数
FALL PROC NEAR
LEA SI,STRD ;传递将要下落的字母子串
T1: INC SI ;加1以便寻找下一个字母
CALL RANDOM ;获得随机数函数
MOV DL,AH ;获得随机数AH
ADD DL,26 ;下落框起始列 DL+26 下落的起始位置
MOV DH,1 ;行
MOV CX,23 ;计数
AGA: MOV AH,2
MOV BH,0
INT 10H ;置光标位置
MOV AL,[SI] ;取下落字符
PUSH DX
MOV DL,AL
MOV AH,02H
INT 21H ;显示DL中的字符串 [SI] 字母开始出现
POP DX
PUSH AX ;AX,CX进栈,以防干扰
PUSH CX
MOV CX,0 ;隐藏字母后面的光标
MOV AH,1
OR CH,00010000B
INT 10H ;置光标类型
POP CX
POP AX
CALL SP_ADJ
MOV AH,2
MOV BH,0
INT 10H ;置光标位置
PUSH DX
MOV DL,' '
MOV AH,02H
INT 21H ;显示空格 覆盖字母
INT 10H ;置光标位置
POP DX
SUB AL,AL
PUSH DX
MOV AH,6
MOV DL,0FFH ;表示要 输入
INT 21H ;直接控制台I/O AL= 输入字符
POP DX
CMP AL,0 ;判断是否输入
JZ T0 ;没有
CMP AL,[SI] ;判断是否等于下落的字母 第一次比较
JE T7 ;等于下落的字母,则下落下一个字母
JNE X1
T7: INC M
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
MOV AH,2
MOV BH,0
INT 10H
PUSH ax
PUSH bx
mov ah ,9
mov bh ,0
mov cx,1
mov al,[si]
mov bl,00101111B ;字母击中后显示白色
INT 10H
pop ax
pop bx
call SLEEP1
MOV AH,2
MOV BH,0
PUSH DX
MOV DL,' '
MOV AH,02H
INT 21H ;显示空格 覆盖字母
INT 10H ;置光标位置
POP DX
CALL POINT
CALL BELL
JMP T1
X1: CMP AL,20H ; 空格键 第二次比较
JE TA ;暂停
JNE T3
TA: CALL PAUSE
T3: CMP AL,45H ; E 退出 第三次比较
JNE T0
CALL EXIT
T0: CMP AL,1BH ; ESC 返回主菜单 第四次比较
JNE T12
CALL CLEAR
CALL DISPLAY1
JMP T4
T12: INC DH ;行 ++ 字母 在 下落
SUB CX,1 ;CX=23 初始值
JZ MODIFYC
JMP AGA
MODIFYC: JMP T1 ;新字母 下落
T4: RET
FALL ENDP
;==================================================================
;时间延迟函数及速度1函数
SLEEP1 PROC
PUSH CX
MOV CX,550D
LOOP1:
PUSH CX
MOV CX,550D
LOOP2:
PUSH CX
MOV CX,550D
LOOP3:
NOP ;运行该指令时单片机什么都不做,但是会占用一个指令的时间
NOP
LOOP LOOP3
POP CX
LOOP LOOP2
POP CX
LOOP LOOP1
POP CX
RET
SLEEP1 ENDP
;========================================================
;时间延迟函数及速度2函数
SLEEP2 PROC
PUSH CX
MOV CX,400D
LOOP4:
PUSH CX
MOV CX,400D
LOOP5:
PUSH CX
MOV CX,400D
LOOP6:
NOP
NOP
LOOP LOOP6
POP CX
LOOP LOOP5
POP CX
LOOP LOOP4
POP CX
RET
SLEEP2 ENDP
;=======================================================
;时间延迟函数及速度3函数
SLEEP3 PROC
PUSH CX
MOV CX,280D
LOOP7:
PUSH CX
MOV CX,280D
LOOP8:
PUSH CX
MOV CX,280D
LOOP9:
NOP
NOP
LOOP LOOP9
POP CX
LOOP LOOP8
POP CX
LOOP LOOP7
POP CX
RET
SLEEP3 ENDP
;=========================================================
;速度选择函数
SP_ADJ PROC
CMP A,1
JE S1
CMP B,1
JE S2
CMP V,1
CALL SLEEP3
JMP S3
S1: CALL SLEEP1
JMP S3
S2: CALL SLEEP2
S3: RET
SP_ADJ ENDP
;========================================================
;画游戏边框
PAINT PROC NEAR
DIS2
DIS6 80,0,0,0 ;宏调用画上边框
DIS7 0,0,55,25 ;宏调用画右1边框
DIS7 0,0,56,25 ;宏调用画右2边框
DIS7 0,0,79,24 ;宏调用画右3边框
DIS7 0,0,0,25 ;宏调用画左1边框
DIS7 0,0,24,25 ;宏调用画左2边框
DIS7 0,0,25,25 ;宏调用画左3边框
DIS6 79,0,0,24 ;宏调用画下边框
DIS1 ST3,6,3
DIS1 ST1,9,5
DIS1 ST5,11,5
DIS1 ST2,13,5
DIS1 ST4,17,3
DIS1 STRE,11,60
DIS1 ST8,15,5 ;显示字符串
DIS2
MOV AH,6
MOV AL,0
MOV AL,23D
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
; MOV BH,01001110B ;红色背景 黄色前景
MOV BH,000100000B ;绿色背景 黑色前景
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
MOV CH,1 ;从左上第1行
MOV CL,26 ;从左上第26列
MOV DH,1 ;从右上第1行
MOV DL,54 ;从右上第54列
INT 10H ;置主游戏屏界面颜色
DIS3
DIS3
RET
PAINT ENDP
;==========================================================
;表示击中的函数
BELL PROC NEAR
PUSH DX
PUSH AX
PUSH CX
MOV DX,60000D ;turn on/of 60000d times
IN AL,61H
AND AL,11111100B ;置 最后2位 为0
SOUND: XOR AL,2 ; 0 1 交替 变化 发出 声音
OUT 61H,AL
MOV CX,9FH ;value of wait
WAIT1:
LOOP WAIT1
DEC DX
JNE SOUND
POP CX
POP AX
POP DX
RET
BELL ENDP
;===============================================
;打印实际得分
POINT PROC NEAR
DIS2
MOV AH,2
MOV BH,0
MOV DH,11
MOV DL,67
INT 10H ;置光标位置 计分的 位置
MOV AL,M
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
CMP AL,30 ;击中30次显示
jnz T
DIS1 ST9 20,60 ;显示“VERY GOOD”
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
T: CMP AL,10
JAE X9
ADD AL,30H
MOV DL,AL
MOV AH,02H ;显示得分 一位
INT 21H
JMP X10
X9:
MOV AL,M
MOV AH,0
MOV DL,10
DIV DL
PUSH AX
MOV AH,2
MOV BH,0
MOV DH,11
MOV DL,67
INT 10H ;打印十位
ADD AL,'0'
MOV DL,AL
INT 21H
POP AX
MOV AL,AH
MOV AH,2
MOV DH,11
MOV DL,68
INT 10H
ADD AL,'0'
MOV DL,AL
INT 21H
X10: DIS3
RET
POINT ENDP
;===============================================================
;暂停函数
PAUSE PROC NEAR
DIS2
P1: MOV AH,07H
INT 21H ;无显示输入 已暂停 输入空格继续游戏
CMP AL,20H ;判断是否是继续 空格
JNE P1 ;不是则跳转
DIS3
RET
PAUSE ENDP
;=========================================================
;退出函数
EXIT PROC NEAR
DIS2
CALL CLEAR ;调用清屏函数
DIS5 25,00001110B
DIS1 ST6,12,30
DIS1 ST10,24,1
MOV AH,4CH
INT 21H ;返回DOS 界面
DIS3
RET
EXIT ENDP
;==================================================================
;取随机数
RANDOM PROC NEAR
PUSH CX
PUSH DX
MOV AH,2CH
INT 21H ;取系统时间 DH:秒 DL: 1/100秒
ADD DH,DL
MOV AL,DH
MOV AH,0
MOV DL,26 ;26个字母 故模26
DIV DL ;AX / DL 余数在 AH
POP DX
POP CX
RET
RANDOM ENDP
;=======================================================================
CODES ENDS
END START
本文来源:https://www.2haoxitong.net/k/doc/0d96633358fb770bf78a55f5.html
文档为doc格式