资源描述
课程设计
~ 第二学期
设计题目 打字练习程序
院(系) 计算机科学与信息工程
专 业 计算机科学与技术
班 级 091041b1 学号
学生姓名 王涛
设计时间 6 月 20 日—— 年 6 月 24日
指引教师 蒯锐
提交日期 6月24日
上海应用技术学院课程设计任务书
课程名称
汇编语言课程设计
课程代码
B704207
设计题目
打字练习程序
题目序号
设计时间
6月 20日—— 6月 24日
系(院)
计算机科学与信息工程
专业
计算机科学与技术
班级
091041b1
一、课程设计任务(条件)、详细技术参数(指标)
本课程设计是《80X86汇编语言程序设计》课程后继教学环节,通过对一种较大型、综合性应用程序进行阅读、修改、添加功能等工作,使学生对汇编语言程序设计有更进一步结识,提高阅读理解复杂程序能力和程序设计能力。
依照所给“typetest.asm”应用程序框架,在此基本上修改和添加功能。
基本任务:
1认真阅读“typetest.asm”源程序,理解程序每一条指令在程序中作用。绘制程序流程图(简略总图,各模块详细流程图),给程序中核心语句(后跟分号)作注释。设立输入界面,顾客输入密码后才干进入主菜单 ;
2. 修改主菜单,在主菜单上显示当天日期 ;
3. 修改主菜单,增长可供顾客选取难度级别选项。
4. 为顾客打分,对的输入字母使用时间越少,得分越高。
5. 修改程序,在屏幕右上角显示顾客得分、已输入字母数、对的数。
6. 将程序中“置光标位置”程序段落用宏调用完毕,添加“置光标位置”宏定义。
扩展任务:
7. 设立限定期间,到达该时间,顾客尚未得到规定分数时,游戏停止。
8. 到达限定期间,顾客得分达到预设值时,自动提高难度级别,屏幕变色。
9. 修改程序,底行笑脸字母消失后,不再在该列下落字母(提示:设立数组记录笑脸字母存在与否)。笑脸字母所有消失后,游戏停止,显示告别画面,显示顾客成绩。其她任务:
自行设计新功能。
二、对课程设计成果规定(涉及课程设计阐明书、图纸、图表、实物等软硬件规定)
(1) 分析原“typetest.asm”程序构造:画出主程序粗略流程图和各个模块详细流程图,每个功能模块用文字阐明她们功能(与相应流程图放在一起);
(2) 对你已经实现功能(修改、新编写)做详细阐明,并附上流程图及程序清单(修改/增长指令请使用大写字母,以示区别);
(3) 自己对该“打字练习程序”进一步设想;
(4) 对于有设想但最后未实现功能大体编程思路阐述;
(5) 阐述在设计过程中遇到并且对你具备启发性问题。
(6) 禁止抄袭,发现雷同,双方扣分。
三、课程设计工作进度筹划:
周一:教师布置任务,解说本课设模块。学生细读原始源程序,在重要行添加注解。
周二:画出主程序粗略流程图和各个模块详细流程图,开始基本任务。
周三~周四:设计程序及调试程序。同步着手写报告。
周五:完毕设计,提交报告,接受教师考核。
四、重要参照资料
[1] 杨文显,宓双,胡建人.新编汇编语言程序设计,清华大学出版社,
[2] 朱玉龙,任文览等.汇编语言程序设计,清华大学出版社,
[3] [美]Kip R.Irvine. 电子工业出版社,
指引教师(签名):蒯锐 教研室主任(签名):杨晶鑫
6 月 20 日 6 月 20 日
目录
~ 第二学期·········································1
1.概述···························································5
1.1基本功能··················································5
1.2扩展功能··················································6
2.详细设计阐明···················································7
2.1分析原“typetest.asm”程序构造····························8
2.1已经实现功能(修改、新编写)阐明····················9
3. 对该“打字练习程序”进一步设想······························10
3.1 ·························································11
3.2··························································12
3.3··························································12
4. 课程设计总结··················································13
5. 软件使用阐明··················································13
6.附录(参照文献,原代码)·······································14
6.1参照文献····················································14
6.2 源代码·····················································15
1 概述
本课程设计是《80X86汇编语言程序设计》课程后继教学环节,通过对一种较大型、综合性应用程序进行阅读、修改、添加功能等工作,使学生对汇编语言程序设计有更进一步结识,提高阅读理解复杂程序能力和程序设计能力基本功能
1.1基本功能
(1) 设立输入界面,顾客输入密码后才干进入主菜单
(2) 修改主菜单,在主菜单上显示当天日期。
(3) 修改主菜单,增长可供顾客选取难度级别选项。
(4) 为顾客打分,对的输入字母使用时间越少,得分越高。
(5) 修改程序,在屏幕右上角显示顾客得分、已输入字母数、对的数。
(6) 将程序中“置光标位置”程序段落用宏调用完毕,添加“置光标位置”宏定义。
1.2拓展功能
1. 设立限定期间,到达该时间,顾客尚未得到规定分数时,游戏停止。
2. 到达限定期间,顾客得分达到预设值时,自动提高难度级别,屏幕变色。
3. 修改程序,底行笑脸字母消失后,不再在该列下落字母(提示:设立数组记录笑脸字母存在与否)。笑脸字母所有消失后,游戏停止,显示告别画面,显示顾客成绩。其她任务:
2 详细设计阐明
2.1 分析原“typetest.asm”程序构造
2.1.1.一方面在typetest.asm中定义了四个宏调用程序
(1)方框宏定义
(2)清屏宏定义
(3)菜单显示宏定义
(4)设立光标位置宏定义
2.1.2 data数据段定义:涉及所有显示字幕定义。
2.1.3 各宏定义函数调用以及对各个子函数调用。
2.1.4 程序重要流程图
方框宏定义
清屏宏定义
菜单显示宏定义
设立光标位置宏定义
Data数据段定义:
date db 0ah,0dh, "Date:$"
mes0 db 0ah,0dh, "(1)Press Enter key to continue.......$"
mes1 db 0ah,0dh, "(2)When a letter is dropping,please hit it!$"
mes2 db 0ah,0dh, "(3)Press space key to pause!$"
mes3 db 0ah,0dh, "(4)Press ESC key to return main interface!$"
mes4 db 0ah,0dh, "(5)Press letter 'E' to exit!$"
mes5 DB 'please enter your password :$'
mes6 db 0ah,0dh, "1: < fast >$"
开始
顾客输入密码
判断密码
进入主菜单
返回
不对的
密码对的
拟定后进入
选取需要练习速度选项
1.fast
2.veryfast
3.slow
4.veryslow
选取需要速度选项
开始练习打字游戏
计算打字对的数
依照对的数计算出应得分数
显示顾客所得分数,然后退出练习界面
2.2 已经实现功能(修改、新编写)阐明
2.2.1本程序已实现了基本功能:
(7) 设立输入界面,顾客输入密码后才干进入主菜单;
(8) 修改主菜单,在主菜单上显示当天日期;
(9) 修改主菜单,增长可供顾客选取难度级别选项;
(10) 为顾客打分,对的输入字母使用时间越少,得分越高;
(11) 修改程序,在屏幕右上角显示顾客得分、已输入字母数、对的数;
(12) 将程序中“置光标位置”程序段落用宏调用完毕,添加“置光标位置”宏定义;
2.2.2本程序扩展功能:
(1) 修改了主界面背景颜色以及字体颜色,对某些重要提示信息进行了某些优化。
(2) 增长了一键显示顾客得分记录功能,只要顾客在主界面上输入“C”,就可以显示出来顾客得分记录
3 对“打字练习程序”进一步设想
3.1 可以让每次浮现字母都变得有逻辑性,就像打中文时候那种逻辑性,还可以增长英语之类打字练习。
3.2 可以变化每一种字母在掉落时候颜色。让每一种字母不同步刻颜色都由电脑随机产生。
3.3 在打字练习过程中还可以有某些恰当声音来配合着练习进行,这样话效果和顾客体验都会有更进一步提高。
4 课程设计总结
4.1 通过这次课程设计让我跟详细理解了汇编语言用途以及她特点,这样有助于在此后实践中更好去应用汇编语言解决问题,同步通过这次课程设计也体现出了我在汇编方面某些基本知识局限性。由于对汇编语言某些基本知识掌握局限性,程序中还存在或多或少缺陷和局限性,有某些基本功能在逻辑上还存在某些小问题,但是不会影响基本使用。
5 软件使用阐明
由于系统版本不同缘故,在程序汇编链接时候会停滞一部,但只要在敲一下回车在进入一次就好了。诸多时候在进入时输入密码后需要按回车才干跳转到主界面。
6 附录(参照文献,原代码)
参照文献
[1] 杨文显,宓双,胡建人.新编汇编语言程序设计,清华大学出版社,
[2] 朱玉龙,任文览等.汇编语言程序设计,清华大学出版社,
[3] [美]Kip R.Irvine. 电子工业出版社,
原代码
; Assembly program for test your type skills
; Writed by in 06/24/
; Modified by Mi shuang in 06/06/
;------------------------------------------------
include ylib.h
Init_boarder macro row,col,char,dhdl,count;
Local ll
mov cx,count
mov dh,row
mov dl,col
ll:mov ah,02h
mov bh,00h
int 10h
push cx
mov ah,0ah
mov al,char
mov bh,00h
mov cx,01h
int 10h
pop cx
inc dhdl
loop ll
endm
;---------------------------------------------------
clear_screen macro top,left,bottom,right,col ;清屏宏定义
mov ah,06h
mov al,00h
mov bh,col
mov ch,top
mov cl,left
mov dh,bottom
mov dl,right
int 10h
mov ah,02h
mov bh,00h
mov dh,00h
mov dl,00h
int 10h
endm
;----------------------------------------------------------
SETCUSOR MACRO PAGE,ROW,COLUMN ;设立光标位置
MOV AH,02H
MOV BH,PAGE
MOV DL,COLUMN
MOV DH,ROW
INT 10H
ENDM
;----------------------------------------------------
menu macro row,col,text ;菜单显示宏定义
mov ah,02h
mov bh,024h
mov dh,row
mov dl,col
int 10h
mov ah,09h
lea dx,text
int 21h
endm
;======================================================
Data segment
kaishi db 0ah,0dh, " welcome to play the game !$"
year dw ?
month db ?
day db ?
date db 0ah,0dh, "Date:$"
mes0 db 0ah,0dh, "(1)Press Enter key to continue.......$"
mes1 db 0ah,0dh, "(2)When a letter is dropping,please hit it!$"
mes2 db 0ah,0dh, "(3)Press space key to pause!$"
mes3 db 0ah,0dh, "(4)Press ESC key to return main interface!$"
mes4 db 0ah,0dh, "(5)Press letter 'E' to exit!$"
mes5 DB 'please enter your password :$'
mes6 db 0ah,0dh, "1: < fast >$"
mes7 db 0ah,0dh, "2: < veryfast>$"
mes8 db 0ah,0dh, "3: < slow >$"
mess8 db 0ah,0dh, "4: < veryslow>$"
mes9 db 'please choose the speed you want:$'
mes10 db "The game is over!$"
mes15 db "Do you want to continue ? Yes(1)/No(0):$"
mes11 db "your time:$"
mes12 db "right keys:$"
mes13 db "Your score:$"
mes14 db "you have input:$"
mes20 db "hi guy good job!$"
mes21 db 0ah,0dh, "(6)press 'c'to check your records!$"
mes22 db "these records:$"
col db 00h,24h,0fdh,0dh ;颜色
numb1 dw ? ;已输入字母个数
numb dw ? ;输入对的字母个数
score dw ? ;每轮游戏分数
TIME DW ?
sum dw ? ;所有字母下落行数和
sum1 dw ?
game_time dw ? ;记录游戏次数
scores dw 4 dup(?) ;记录游戏分数
password db "111111"
password1 db 6 dup(?)
GRADE DW ?
Speed dw 1000H,300h,5000h,8000h
yanchi dw 0f00h,3fffh,1fffh
Letters db "jwmilzoeucgpravskntxhdyqfb"
db "iytpkwnxlsvxrmofzhgaebudjq"
db "nwimzoexrphysfqtvdcgljukda"
Present_position db 1
db 0
Data ends
;=========================================================
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov es,ax
new:
clear_screen 0,0,24,79,0f4h
SETcusor 0,10,30
LEA DX,MES5
MOV AH,09H
INT 21H
;----------------------------------------------------------------------------------------------
SETCUSOR 0,11,61
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 new
inc si
inc di
loop check ;密码输入及判断与否对的
;--------------------------------------------------------------------------------------
start1:
clear_screen 0d,0d,24d,79d,07h
mov grade,0
mov numb,0
mov numb1,0
mov sum,0
mov score,0
mov cx,1000h ;隐藏光标
mov ah,01h
int 10h
clear_screen 0d,0d,24d,79d,1eh ;清屏
Init_boarder 0d,0d,'*',dl,80d
Init_boarder 24d,0d,'*',dl,80d
Init_boarder 0d,0d,'*',dh,25d
Init_boarder 0d,79d,'*',dh,25d ;初始化边框
menu 3d,20d,kaishi; ;显示菜单
menu 7d,15d,date
push dx ;显示当天时间
mov ah,2ah
int 21h
mov year,cx
mov month,dh
mov day,dl
mov dx,-1
mov ax,year
call writedec
mov ah,0
mov al,month
call writedec
mov dx,-1
mov al,day
call writedec
pop dx
menu 09d,15d,mes0
menu 11d,15d,mes1
menu 13d,15d,mes2
menu 15d,15d,mes3
menu 17d,15d,mes4
menu 29d,15d,mes21
;-----------------------------------------------------------------------------------------
mov ah,02h ;设立光标位置
mov bh,00h
mov dh,22d
mov dl,33d
int 10h
keyin:
mov ah,07h ;从键盘输入命令字符,无回显
int 21h
cmp al,0dh
je begin
cmp al,'E'
je exit
cmp al,'c' ;输入‘c'查询分数记录
je search
jmp keyin
search :
push dx
clear_screen 0,0,24,79,1eh
menu 5d,20d,mes22
mov cx,4
lea si,scores
next33:
mov ah,02h
mov dl," "
int 21h
mov dx,-1
mov ax,[si]
call writedec
add si,2
loop next33
pop dx
exit:
mov ax,4c00h
int 21h
;--------------------------------------------------------------------------------------
begin:
clear_screen 0,0,24,79,0f6h
menu 6d,28d,mes6
menu 9d,28d,mes7
menu 13d,28d,mes8
menu 15d,28d,mess8
SETcusor 0,17,28
lea dx,mes9
call readdec
cmp ax,2 ;选取游戏级别
je done
cmp ax,1
je done
cmp ax,3
je done
cmp ax,4
;jne begin
jmp done
higher: ;难度增长时升级
push bx
MOV BX,game_time
DEC BX
SHL BX,1
mov si,score
mov scores[bx],si
mov numb,0
mov numb1,0
mov score,0
mov sum,0
mov sum1,0
mov bx,grade
clear_screen 00d,00d,24d,79d,col[bx]
pop bx
inc grade
cmp grade,3
ja ok1
jmp ten
ok1:
jmp ok2
;------------------------------------------------------------------------------------------
done:
MOV GRADE,AX
clear_screen 00d,00d,24d,79d,1eh ;清屏
ten:
Init_boarder 00d,00d,'*',dl,80d
Init_boarder 24d,00d,'*',dl,80d
Init_boarder 00d,00d,'*',dh,25d
Init_boarder 00d,79d,'*',dh,25d ;初始化边框
clear_screen 02d,02d,23d,78d,1eh ;清屏(边框还存在)
Init_boarder 23d,01d,01h,dl,78d; 在倒数第二行显示一行笑脸
SETCUSOR 0,01,8
lea dx,mes14
mov ax,numb1
call writedec
SETCUSOR 0,01,35
lea dx,mes12
mov ax,numb
call writedec
SETCUSOR 0,01,55
lea dx,mes13
mov ax,score
call writedec ;显示已输击字母数,对的字母数和分数
;----------------------------------------------------------------------------------------
mov ah,02h
mov bh,00h
mov dh,02h
mov dl,02h
int 10h ;将光标设立在第一行第一列
mov cx,78
lea si,letters
nextletter:mov ah,02h ;显示字母
mov dl,[si]
int 21h
inc si
loop nextletter
;-----------------------------------------------------------------------------------------
start_game: ;游戏开始
mov time,0
mov ah,2ch
int 21h ;取系统时间,返回一种0—99数,在dl里
inc dl
cmp dl,78
jna sg1
sub dl,78
sg1:
mov present_position,dl
lea di,letters
add di,word ptr present_position ;di指向即将掉落字母
dec di
mov dl,present_position
mov ah,02h
mov bh,00h
mov dh,02h
int 10h ;将光标设立在第一行和当前列位置
mov cx,20d ;总共有20行是空
;-----------------------------------------------------------------------------------------
nextrow:
push cx
MOV BX,GRADE
DEC BX
SHL BX,1
mov cx,speed[bx]
wait_for_key:
push cx
mov cx,yanchi[bx];延迟
delay:loop delay
push dx
mov ah,06h ;从键盘输入字符
mov dl,0ffh
int 21h
pop dx
jz pass ;zf=1表达没有输入字符,zf=0表达有字符输入
cmp al,1bh ;如果键入ESC,则返回主菜单
je to_start
cmp al," " ;如果键入SPACE,则游戏暂停
jne pass0
jmp pause
ok2:
jmp ok3
midstep:
jmp nextrow
;------------------------------------------------------------------------------------------
pause:
push dx ;暂停解决
mov ah,06h
mov dl,0ffh
int 21h
pop dx
cmp al," "
jne pause
je pass
jmp pass0
to_start:
jmp start1
;----------------------------------------------------------------------------------------
pass0:
inc numb1
push dx
push ax
SETCUSOR 0,01,8
lea dx,mes14
mov ax,numb1
call writedec
pop ax
pop dx
SETCUSOR 0,dh,dl
cmp al,[di] ;输入字母对的!则字母消失
je disappear
jmp pass
high1:
jmp higher
kk3:
jmp to_start
;--------------------------------------------------------------------------------------
pass:
pop cx
LOOP wait_for_key
down:
inc time
inc sum
mov ah,0ah ;在当前光标位置写空格
mov al," "
mov bh,00h
mov cx,01h
int 10h
inc dh
mov ah,02h ;变化光标位置
mov bh,00h
int 10h
mov ah,0ah ;在当前光标位置写字母
mov al,[di]
mov bh,00h
mov cx,01h
int 10h
pop cx
loop midstep ;下一行
;-------------------------------------------------------------------------------------------
letter_over:
mov ah,0ah
mov al," "
mov bh,00h
mov cx,01h
int 10h
inc dh ;将光标设立在最后一行
mov ah,02h
mov bh,00h
int 10h
mov ah,0ah ;最后行笑脸消失
mov al," "
mov bh,00h
mov cx,01h
int 10h
jmp next_letter
jmp disappear
jmp disappear
ok3:
jmp ok4
kk2:
jmp kk3
disappear: ;击中字母后输出空
pop cx
pop cx
mov ah,0ah
mov al," "
mov bh,00h
mov cx,01h
int 10h
inc numb
push bx
push dx
push ax
push di
SETCUSOR 0,01,35
lea dx,mes12
mov ax,numb
call writedec ;重新显示对的字母数
SETCUSOR 0,01,55
mov si,numb
mov bx,time
neg bx
add bx,21
add sum1,bx
pop bx
add si,sum1
mov score,si
lea dx,mes13
mov ax,score
call writedec ;计算分数并输出
pop di
pop ax
pop dx
pop bx
jmp next_letter
ok4: jmp ok
kk11:
jmp kk2 ;
next_letter:mov ah,02h ;将光标重新设回
mov bh,00h
mov dh,02h
mov dl,present_position
int 10h
jmp high4
high3: jmp high1
high4:
mov al,[di] ;浮
展开阅读全文