打字练习程序
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
3)、当按结束,可显示出练习输入的时间,并且能显示出正确率。
4)、要求界面美观。
2、功能设计:
2.1、功能模块:
1)主程序模块-----主要是随机产生字符并将字符送入缓冲区,通过调用其他子程序和宏设置窗口、字符总数和正确个数,并实现打字练习功能,计算出正确率及打字输入的总时间。
打字结果计算与显示模块( UseTimeAndOut,true_rate_out):主要计算打字输入所用的总时间及打字正确率并输出总时间和打字正确率。
3.2、各功能模块及流程图
输出正确率模块计算打字时间并输出模块
数据打印输出模块
记录当前时间和改变字符颜色模块
正确个数及已打个数模块
3.3重点难点及解决办法:
学习了汇编语言,对汇编语言的的一些基本指令有所理解。刚开始看到这个题目的时候,我感觉这个题目还是很简单的,在数据区直接存放一串字符,接着输入字符与已有字符做比较,记录正确个数和总的字符个数,然后二者一除就得到正确率了,至于打字时间就是取两次系统时间,结束和开始时间相减便得到了。当我着手做时我才发现这并不是我想象的那样。我遇到的问题是怎么才能在屏幕上正确的显示信息,当要在屏幕上显示 ‘12:21:23’这些时我不知道该怎么解决了。我最终的解决办法是将字符拆开一个一个输出。在本程序中已知字符串我采用了随机产生,在随机产生时我遇到的问题是产生的字符由于程序运行时间太短而都是同一字符,后来我通过向同学请教,采用延时的办法解决了这个问题。
信息科学与技术学院
微机原理与接口技术课程设计
课题名称:打 字 练 习 程 序
学生姓名:魏爱英
学号:2007081852
专业、年级:计科07-1
指导教师:农峰
时间:2009.9
1、题目及要求:
1.1、题目:打字练习程序
1.2、要求:
1)、缓冲区中预放了一些字母
2)、运行时,可按照屏幕上显示的字母输入练习
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 ;开窗口,做菜单
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
4、总结:
程序设计是一门很注重理论和实践相结合的科目,要求我们在掌握了课本理论知识后灵活应用于实践之中。通过不断的实践了解自己在学习中的知识的欠缺和动手能力的不足,进而通过思考和查阅资料自主完成课题实践。通过这次的课题实践让我深刻的明白了基础理论的重要性。编程过程中的有些错误并非什么难解之处,相反,正是某些基础细节的错误理解导致了编程中的错漏。因此,在今后的学习中,我会更加注重牢固基础知识,提高编程速度,减少出错率。
设置字符颜色模块(change_char_color):主要设置打字时缓冲区字符和打字区字符的颜色,包括错误时字符的颜色显示。
字符满行处理模块(manhang):主要功能是当字符输入满行时进行换行。
输出模块(OutTime,btod_out):输出程序运行时的时间。
统计模块(TONGJI):统计字符个数和正确个数并记录时间。
cd8 db '***Typewrite practising***$'
data ends
code segment
assume ds:data,cs:code
start:
mov ax,data
mov ds,ax
; **************************************************
在这次的实践课题的完成过程中,虽然遇到些小的问题,但是,通过查阅书本资料和请教同学都已克服。由于,此次的课题与某些学习中的实践有些相似之处,所以,课题完成的比较顺利。通过完成接口的有关课题,也进一步培养了我的动手实践能力,并且对于我的之前所学的知识有所巩固和提高。
5、参考文献:
[1]《IBM-PC汇编语言程序设计》沈美明清华大学出版社2001年8月第2版
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
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 ;取系统时间
;**************************************************
gbdw MACRO bh1,dh1,dl1 ;设置光标位置
push ax
push bx
push cx
push dx
mov bh,bh1 ;显示页号
mov dh,dh1 ;行
mov dl,dl1 ;列
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 ;输出上面提示语句
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
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
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
;**************************************************
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 ;读光标位置
2)宏的作用:
清屏(qp):用于清屏,产生不同颜色、不同大小的窗口。
设置光标位置(gbdw):用于移动光标位置,以便按要求输出。
读光标位置(dugb):用于读取当前光标位置。