打字练习程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
hm MACRO hzd,hsr ;一行是否输满并进行相应操作
push ax
push bx
push cx
push dx
mov ax,hsr
cmp ax,0
jz exit1
mov dx,0
cwd
mov bx,hzd
div bx
cmp dx,0
jz ln
jmp exit1
ln: mov mhbz,1
exit1: pop dx
push ax ;寄存器压栈
push bx
push cx
push dx
mov ah,9h ;在光标位置显示字符和字符属性
mov al,zf ;AL字符ASCII码
mov bh,0 ;显示页号
mov bl,ys ;设置字符属性
mov cx,1 ;字符重复个数
int 10h
mov ah,03h ;读光标位置
4、总结:
程序设计是一门很注重理论和实践相结合的科目,要求我们在掌握了课本理论知识后灵活应用于实践之中。通过不断的实践了解自己在学习中的知识的欠缺和动手能力的不足,进而通过思考和查阅资料自主完成课题实践。通过这次的课题实践让我深刻的明白了基础理论的重要性。编程过程中的有些错误并非什么难解之处,相反,正是某些基础细节的错误理解导致了编程中的错漏。因此,在今后的学习中,我会更加注重牢固基础知识,提高编程速度,减少出错率。
3)、当按结束,可显示出练习输入的时间,并且能显示出正确率。
4)、要求界面美观。
2、功能设计:
2.1、功能模块:
1)主程序模块-----主要是随机产生字符并将字符送入缓冲区,通过调用其他子程序和宏设置窗口、字符总数和正确个数,并实现打字练习功能,计算出正确率及打字输入的总时间。
打字结果计算与显示模块( UseTimeAndOut,true_rate_out):主要计算打字输入所用的总时间及打字正确率并输出总时间和打字正确率。
在这次的实践课题的完成过程中,虽然遇到些小的问题,但是,通过查阅书本资料和请教同学都已克服。由于,此次的课题与某些学习中的实践有些相似之处,所以,课题完成的比较顺利。通过完成接口的有关课题,也进一步培养了我的动手实践能力,并且对于我的之前所学的知识有所巩固和提高。
5、参考文献:
[1]《IBM-PC汇编语言程序设计》沈美明清华大学出版社2001年8月第2版
信息科学与技术学院
微机原理与接口技术课程设计
课题名称:打 字 练 习 程 序
学生姓名:魏爱英
学号:2007081852
专业、年级:计科07-1
指导教师:农峰
时间:2009.9
1、题目及要求:
1.1、题目:打字练习程序
1.2、要求:
1)、缓冲区中预放了一些字母
2)、运行时,可按照屏幕上显示的字母输入练习
mov bp,di
CALL change_char_color ;改变字符颜色
; **************************************************
typeinput: ;输入字符开始打字
dugb 0
mov ah,01
int 21h
2)宏的作用:
清屏(qp):用于清屏,产生不同颜色、不同大小的窗口。
设置光标位置(gbdw):用于移动光标位置,以便按要求输出。
读光标位置(dugb):用于读取当前光标位置。
提示(tishi)用于输出提示语句。
2.2、功能图:
3、详细设计:
3.1、设计方法:
该课程设计只是应用了些简单的函数调用,中断,宏调用。其中随机产生字符的实现是通过调用中断(ah=2ch,int 10)取系统时间的1/100来得到一组随机数,把这些随机数当做指针,然后取指针对应的字符表中相应的字符,来得到一串字符。在把结果显示到屏幕上时将数据拆分后输出到屏幕上。如‘123’在屏幕上显示时必须一个一个输出,还有在输出小数点时也采取了相应的办法。在计算时间上记录系统在打字开始和结束时的时间,然后相减得到。在打字时通过比较记录正确个数,最终除以总个数得到正确率。在打字过程中还通过设置字符属性来区分正确和错误字符的不同。
qp 0,25h,0,20,2,60
mov ah,09h
lea dx,cd8
int 21h
gbdw 0,2,24
mov ah,09h
lea dx,cd7
int 21h
; **************************************************
gbdw 0,5,36
mov di,0
lea dx,addrr
int 21h
pop dx
pop ax
ENDM
; **************************************************
data segment
buf db 400 dup('$')
jbzf db 'abcdefghijklmnopqrstuvwxyz0123456789$' ;基本字符
mov ah,02h ;
mov dl,08h ;退格
int 21h
zfys zf,ys
ENDM
;**************************************************
qp MACRO al1,bh1,ch1,cl1,dh1,dl1;清屏窗口
push ax
push bx
push cx
jbzf1 db 400 dup('$')
Sum dw 0 ;总字符个数
zqgs dw 0 ;正确字符个数
mhzfs dw 0 ;满行的字符数
LineAct dw 0 ;当前行字符数
mhbz db 0 ; 1满行,0未满
gbattr db 2 dup(0) ;存放字符所在行列
Sumtime db 3 dup(0)
pop cx
pop bx
pop ax
ENDM
;**************************************************
tishi MACRO row,col,addrr ;输出提示语句
push ax
push dx
gbdw 0,row,col;设置光标位置
mov ah,09h
push dx
mov al,al1 ;上卷行数
mov bh,bh1 ;卷入行属性
mov ch,ch1 ;左上角行数
mov cl,cl1 ;左上角列数
mov dh,dh1 ;左下角行数
mov dl,dl1 ;左下角列数
mov ah,06h
int 10h
pop dx
pop cx
pop bx
pop ax
ENDM
设置字符颜色模块(change_char_color):主要设置打字时缓冲区字符和打字区字符的颜色,包括错误时字符的颜色显示。
字符满行处理模块(manhang):主要功能是当字符输入满行时进行换行。
输出模块(OutTime,btod_out):输出程序运行时的时间。
统计模块(TONGJI):统计字符个数和正确个数并记录时间。
mov di,0 ;随机产生字符
mov bx,65
zifu: mov ah,2ch
int 21h
mov al,dl
cbw
mov si,ax
cmp si,35
ja zifu
mov al,jbzf[si]
mov buf[di],al
inc di
dec bx
push di
push si
mov di,100h ;//延时
[2]《IBM-PC汇编语言程序设计例题习题集》沈美明清华大学出版社1991年6月第1版
[3]《微机系统和接口应用技术》朱世鸿著清华大学出版社2006年9月第1版
6、附:源程序
;**************************************************
zfys MACRO zf,ys
mov ah,2 ;置光标位置
int 10h
pop dx
pop cx
pop bx
Βιβλιοθήκη Baidupop ax
ENDM
; **************************************************
dugb MACRO bh1 ;读光标位置
push ax
push bx
push cx
push dx
;**************************************************
gbdw MACRO bh1,dh1,dl1 ;设置光标位置
push ax
push bx
push cx
push dx
mov bh,bh1 ;显示页号
mov dh,dh1 ;行
mov dl,dl1 ;列
mov cx,0ffffh
AD: mov dl,buf[di] ;装载字符
cmp dl,'$'
jz A2
push dx
mov bp,di
CALL manhang
pop dx
mov ah,02h ;输出预存在缓存区的字符
int 21h
inc di
loop AD
A2: mov ah,2ch ;取系统时间
int 21h
mov Sumtime[0],ch
mov Sumtime[1],cl
mov Sumtime[2],dh
gbdw 0,13,36
CALL TONGJI
mov cx,0ffffh
mov di,0h
AS: cmp buf[di],'$'
jnz hh
jmp qq
hh: mov bp,di
CALL manhang
mov bh,bh1 ;显示页号
mov ah,03h ;读光标位置
int 10h
mov gbattr[0],dh ;记录光标行
mov gbattr[1],dl ;记录光标列
pop dx
pop cx
pop bx
pop ax
ENDM
;**************************************************
3.2、各功能模块及流程图
输出正确率模块计算打字时间并输出模块
数据打印输出模块
记录当前时间和改变字符颜色模块
正确个数及已打个数模块
3.3重点难点及解决办法:
学习了汇编语言,对汇编语言的的一些基本指令有所理解。刚开始看到这个题目的时候,我感觉这个题目还是很简单的,在数据区直接存放一串字符,接着输入字符与已有字符做比较,记录正确个数和总的字符个数,然后二者一除就得到正确率了,至于打字时间就是取两次系统时间,结束和开始时间相减便得到了。当我着手做时我才发现这并不是我想象的那样。我遇到的问题是怎么才能在屏幕上正确的显示信息,当要在屏幕上显示 ‘12:21:23’这些时我不知道该怎么解决了。我最终的解决办法是将字符拆开一个一个输出。在本程序中已知字符串我采用了随机产生,在随机产生时我遇到的问题是产生的字符由于程序运行时间太短而都是同一字符,后来我通过向同学请教,采用延时的办法解决了这个问题。
qp 0,50h,4,14,22,34
qp 0,50h,4,36,22,64
qp 0,25H,12,36,12,64
;qp 0,07,8,16,17,63
qp 0,57,10,16,20,32
; **************************************************
gbdw 0,0,30 ;输出上面提示语句
mov bh,0 ;显示页号
int 10h
mov ah,02 ;置光标位置
inc dl ;列
int 10h
pop dx ;寄存器出栈
pop cx
pop bx
pop ax
ENDM
;**************************************************
backzifu MACRO zf,ys
Aa1: mov si,0ff00h
Aa2: dec si
jnz Aa2
dec di
jnz Aa1
pop si
pop di
cmp bx,0
jnz zifu
; **************************************************
qp 0,30h,0,10,23,69 ;开窗口,做菜单
temp db 5 dup(0)
cd1 db 'Sumtime:$'
cd2 db 'Rate:$'
cd3 db 'all time:$'
cd4 db 'all letters:$'
cd5 db 'true Rate:$'
cd6 db 'any key to end!$'
cd7 db 'Quit by pressing an key printed Q!$'
cd8 db '***Typewrite practising***$'
data ends
code segment
assume ds:data,cs:code
start:
mov ax,data
mov ds,ax
; **************************************************
push ax
push bx
push cx
push dx
mov ax,hsr
cmp ax,0
jz exit1
mov dx,0
cwd
mov bx,hzd
div bx
cmp dx,0
jz ln
jmp exit1
ln: mov mhbz,1
exit1: pop dx
push ax ;寄存器压栈
push bx
push cx
push dx
mov ah,9h ;在光标位置显示字符和字符属性
mov al,zf ;AL字符ASCII码
mov bh,0 ;显示页号
mov bl,ys ;设置字符属性
mov cx,1 ;字符重复个数
int 10h
mov ah,03h ;读光标位置
4、总结:
程序设计是一门很注重理论和实践相结合的科目,要求我们在掌握了课本理论知识后灵活应用于实践之中。通过不断的实践了解自己在学习中的知识的欠缺和动手能力的不足,进而通过思考和查阅资料自主完成课题实践。通过这次的课题实践让我深刻的明白了基础理论的重要性。编程过程中的有些错误并非什么难解之处,相反,正是某些基础细节的错误理解导致了编程中的错漏。因此,在今后的学习中,我会更加注重牢固基础知识,提高编程速度,减少出错率。
3)、当按结束,可显示出练习输入的时间,并且能显示出正确率。
4)、要求界面美观。
2、功能设计:
2.1、功能模块:
1)主程序模块-----主要是随机产生字符并将字符送入缓冲区,通过调用其他子程序和宏设置窗口、字符总数和正确个数,并实现打字练习功能,计算出正确率及打字输入的总时间。
打字结果计算与显示模块( UseTimeAndOut,true_rate_out):主要计算打字输入所用的总时间及打字正确率并输出总时间和打字正确率。
在这次的实践课题的完成过程中,虽然遇到些小的问题,但是,通过查阅书本资料和请教同学都已克服。由于,此次的课题与某些学习中的实践有些相似之处,所以,课题完成的比较顺利。通过完成接口的有关课题,也进一步培养了我的动手实践能力,并且对于我的之前所学的知识有所巩固和提高。
5、参考文献:
[1]《IBM-PC汇编语言程序设计》沈美明清华大学出版社2001年8月第2版
信息科学与技术学院
微机原理与接口技术课程设计
课题名称:打 字 练 习 程 序
学生姓名:魏爱英
学号:2007081852
专业、年级:计科07-1
指导教师:农峰
时间:2009.9
1、题目及要求:
1.1、题目:打字练习程序
1.2、要求:
1)、缓冲区中预放了一些字母
2)、运行时,可按照屏幕上显示的字母输入练习
mov bp,di
CALL change_char_color ;改变字符颜色
; **************************************************
typeinput: ;输入字符开始打字
dugb 0
mov ah,01
int 21h
2)宏的作用:
清屏(qp):用于清屏,产生不同颜色、不同大小的窗口。
设置光标位置(gbdw):用于移动光标位置,以便按要求输出。
读光标位置(dugb):用于读取当前光标位置。
提示(tishi)用于输出提示语句。
2.2、功能图:
3、详细设计:
3.1、设计方法:
该课程设计只是应用了些简单的函数调用,中断,宏调用。其中随机产生字符的实现是通过调用中断(ah=2ch,int 10)取系统时间的1/100来得到一组随机数,把这些随机数当做指针,然后取指针对应的字符表中相应的字符,来得到一串字符。在把结果显示到屏幕上时将数据拆分后输出到屏幕上。如‘123’在屏幕上显示时必须一个一个输出,还有在输出小数点时也采取了相应的办法。在计算时间上记录系统在打字开始和结束时的时间,然后相减得到。在打字时通过比较记录正确个数,最终除以总个数得到正确率。在打字过程中还通过设置字符属性来区分正确和错误字符的不同。
qp 0,25h,0,20,2,60
mov ah,09h
lea dx,cd8
int 21h
gbdw 0,2,24
mov ah,09h
lea dx,cd7
int 21h
; **************************************************
gbdw 0,5,36
mov di,0
lea dx,addrr
int 21h
pop dx
pop ax
ENDM
; **************************************************
data segment
buf db 400 dup('$')
jbzf db 'abcdefghijklmnopqrstuvwxyz0123456789$' ;基本字符
mov ah,02h ;
mov dl,08h ;退格
int 21h
zfys zf,ys
ENDM
;**************************************************
qp MACRO al1,bh1,ch1,cl1,dh1,dl1;清屏窗口
push ax
push bx
push cx
jbzf1 db 400 dup('$')
Sum dw 0 ;总字符个数
zqgs dw 0 ;正确字符个数
mhzfs dw 0 ;满行的字符数
LineAct dw 0 ;当前行字符数
mhbz db 0 ; 1满行,0未满
gbattr db 2 dup(0) ;存放字符所在行列
Sumtime db 3 dup(0)
pop cx
pop bx
pop ax
ENDM
;**************************************************
tishi MACRO row,col,addrr ;输出提示语句
push ax
push dx
gbdw 0,row,col;设置光标位置
mov ah,09h
push dx
mov al,al1 ;上卷行数
mov bh,bh1 ;卷入行属性
mov ch,ch1 ;左上角行数
mov cl,cl1 ;左上角列数
mov dh,dh1 ;左下角行数
mov dl,dl1 ;左下角列数
mov ah,06h
int 10h
pop dx
pop cx
pop bx
pop ax
ENDM
设置字符颜色模块(change_char_color):主要设置打字时缓冲区字符和打字区字符的颜色,包括错误时字符的颜色显示。
字符满行处理模块(manhang):主要功能是当字符输入满行时进行换行。
输出模块(OutTime,btod_out):输出程序运行时的时间。
统计模块(TONGJI):统计字符个数和正确个数并记录时间。
mov di,0 ;随机产生字符
mov bx,65
zifu: mov ah,2ch
int 21h
mov al,dl
cbw
mov si,ax
cmp si,35
ja zifu
mov al,jbzf[si]
mov buf[di],al
inc di
dec bx
push di
push si
mov di,100h ;//延时
[2]《IBM-PC汇编语言程序设计例题习题集》沈美明清华大学出版社1991年6月第1版
[3]《微机系统和接口应用技术》朱世鸿著清华大学出版社2006年9月第1版
6、附:源程序
;**************************************************
zfys MACRO zf,ys
mov ah,2 ;置光标位置
int 10h
pop dx
pop cx
pop bx
Βιβλιοθήκη Baidupop ax
ENDM
; **************************************************
dugb MACRO bh1 ;读光标位置
push ax
push bx
push cx
push dx
;**************************************************
gbdw MACRO bh1,dh1,dl1 ;设置光标位置
push ax
push bx
push cx
push dx
mov bh,bh1 ;显示页号
mov dh,dh1 ;行
mov dl,dl1 ;列
mov cx,0ffffh
AD: mov dl,buf[di] ;装载字符
cmp dl,'$'
jz A2
push dx
mov bp,di
CALL manhang
pop dx
mov ah,02h ;输出预存在缓存区的字符
int 21h
inc di
loop AD
A2: mov ah,2ch ;取系统时间
int 21h
mov Sumtime[0],ch
mov Sumtime[1],cl
mov Sumtime[2],dh
gbdw 0,13,36
CALL TONGJI
mov cx,0ffffh
mov di,0h
AS: cmp buf[di],'$'
jnz hh
jmp qq
hh: mov bp,di
CALL manhang
mov bh,bh1 ;显示页号
mov ah,03h ;读光标位置
int 10h
mov gbattr[0],dh ;记录光标行
mov gbattr[1],dl ;记录光标列
pop dx
pop cx
pop bx
pop ax
ENDM
;**************************************************
3.2、各功能模块及流程图
输出正确率模块计算打字时间并输出模块
数据打印输出模块
记录当前时间和改变字符颜色模块
正确个数及已打个数模块
3.3重点难点及解决办法:
学习了汇编语言,对汇编语言的的一些基本指令有所理解。刚开始看到这个题目的时候,我感觉这个题目还是很简单的,在数据区直接存放一串字符,接着输入字符与已有字符做比较,记录正确个数和总的字符个数,然后二者一除就得到正确率了,至于打字时间就是取两次系统时间,结束和开始时间相减便得到了。当我着手做时我才发现这并不是我想象的那样。我遇到的问题是怎么才能在屏幕上正确的显示信息,当要在屏幕上显示 ‘12:21:23’这些时我不知道该怎么解决了。我最终的解决办法是将字符拆开一个一个输出。在本程序中已知字符串我采用了随机产生,在随机产生时我遇到的问题是产生的字符由于程序运行时间太短而都是同一字符,后来我通过向同学请教,采用延时的办法解决了这个问题。
qp 0,50h,4,14,22,34
qp 0,50h,4,36,22,64
qp 0,25H,12,36,12,64
;qp 0,07,8,16,17,63
qp 0,57,10,16,20,32
; **************************************************
gbdw 0,0,30 ;输出上面提示语句
mov bh,0 ;显示页号
int 10h
mov ah,02 ;置光标位置
inc dl ;列
int 10h
pop dx ;寄存器出栈
pop cx
pop bx
pop ax
ENDM
;**************************************************
backzifu MACRO zf,ys
Aa1: mov si,0ff00h
Aa2: dec si
jnz Aa2
dec di
jnz Aa1
pop si
pop di
cmp bx,0
jnz zifu
; **************************************************
qp 0,30h,0,10,23,69 ;开窗口,做菜单
temp db 5 dup(0)
cd1 db 'Sumtime:$'
cd2 db 'Rate:$'
cd3 db 'all time:$'
cd4 db 'all letters:$'
cd5 db 'true Rate:$'
cd6 db 'any key to end!$'
cd7 db 'Quit by pressing an key printed Q!$'
cd8 db '***Typewrite practising***$'
data ends
code segment
assume ds:data,cs:code
start:
mov ax,data
mov ds,ax
; **************************************************