武汉理工大学《微机原理与通信接口》课程设计说明书
3.设计关键问题
在打字练习汇编语言程序设计中,主要有三个问题,分别为输入和输出问题、输入字符串时间的计算、正确率的判断。
3.1输入输出
3.1.1 输出显示信息
输出字符串,主要是利用DOS的9号功能调用。
当开始打字练习时,要输出提示信息说明打字练习时的规则,其程序为:
message db 0ah,0dh, 'Welcome to WUHAN UUIVERSITY, Please type 10 letters, and
you must input 10 right words, then press any key to practice the next one '
db 0ah,0dh, 'if you want to quit, press 1 ',0ah,0dh,'$'
lea dx,message
mov ah,9 int 21h
显示信息输出后,要显示预先存在缓冲区的三组字符串,显示字符串用DOS9号调用,
其程序为:
str1 db 0ah,0dh,'wuhanunive' db 0dh,0ah,'$' str2 db 0ah,0dh,'hubeichina' db 0ah,0dh,'$'
str3 db 0ah,0dh,'qmpzwmoxid' db 0ah,0dh,'$' address dw str1,str2,str3
mov dx,offset address[si]
mov ah,9
int 21h
10
武汉理工大学《微机原理与通信接口》课程设计说明书
只有当输入的字符串中的十个字符全部正确时,则显示进入下一字符串的练习并输出鼓励语,其程序为:
et db 0dh,0ah,'Congratulations, Well done!',0ah,0dh,'$' mov dx,offset et
mov ah,09h int 21h
当要显示输入字符串所用的时间以及显示输入字符串个数时,可以采用单个字符的输出,但是为了在屏幕上看起来直观,就把要显示的时间和正确个数的十位和个位分别存在缓冲区,并把缓冲区的内容采用9号调用输出在屏幕上,其程序为: (1) 显示输入字符所用的时间的程序 time db 2 dup(?),'$'
mov time[0],ah ;输入字符串所用时间的十位送入
time[0]
mov time[1],al ;输入字符串所用时间的个位送入time[1]
mov dx,offset time ;显示time中的内容 mov ah,9 int 21h
(2) 显示输入字符串正确个数的程序为: num db 2 dup(?),'$'
mov num[0],bh ;输入字符串正确个数的十位送入num[0]
mov num[1],bl ;输入字符串正确个数的个位送入num[1]
mov dx,offset num ;显示num中的内容 mov ah,9 int 21h
11
武汉理工大学《微机原理与通信接口》课程设计说明书
3.1.2 输入十个字符
当屏幕显示出要练习字符串时,就要输入十个字符存到指定的缓冲区中,使用DOS 1号功能调用,其功能是输入单个字符,输出参数是AL=输入字符的ASCII码,循环十次,将十个字符存入指定的缓冲区buff中,其程序为:
buff db 15 dup(?)
mov cx,10 ;cx=10,控制循环次数 mov bx,0 again:
mov ah,1 ;输入单个字符 int 21h
mov buff[bx],al ;将输入的字符存到指定的缓冲区 inc bx loop again
3.2 输入字符串所用时间计算
对输入字符串时间的计算,需要知道输入字符串前的时间和输入字符串后的时间,
将两者相减,即得输入字符串所用的时间。
具体为:当显示第一串字符串后,调用DOS 的2CH号功能读取系统时间,读取完系
统时间后,系统时间的时、分和秒分别存在寄存器CH、CL、DH中。并将CL和DH的内容保存到minutes和second中,以便计算输入字符串所用时间用;第一次读取系统时间后,开始输入10个字符,当输入字符结束后,再次读取系统时间,首先第二次的分钟数减去第一次的分钟数,如果结果大于零,则用第二次的秒数减去第一次的秒数,所得的结果转化称ASCII码显示在屏幕上,即为输入字符串所用的时间。如果第二次的分钟数减去第一次的分钟数的结果小于零,则第二次的秒数加上60后,再减去第一次的分钟数,所得结果妆化称ASCII码后显示在屏幕上,则为输入字符串所用的时间。
计算输入字符串所用的时间,其程序为:
12
武汉理工大学《微机原理与通信接口》课程设计说明书
time1 db 'the time you have spent is:','$' time2 db 'second','$' time db 2 dup(?)
mov ah,2ch ;读取系统时间,时分秒分别存在CH CL DH
int 21h
mov minute,cl ;保存第一次系统时间的分和秒 mov second,dh
mov ah,2ch int 21h
sub cl,minute mov minute,cl cmp dh,second jb a2 jmp gettime a2: add dh,60 dec minute gettime: sub dh,second mov second,dh lea dx,time1 mov ah,09h int 21h
call timechange
mov time[0],ah mov time[1],al
mov dx,offset time ; mov ah,9 int 21h
;读取系统时间
;计算输入字符串所用时间 ;调用timedchange 显示输入10个字符所用时间 13
武汉理工大学《微机原理与通信接口》课程设计说明书
lea dx,time2 mov ah,09h int 21h
3.3 正确率判断
正确率的判断前提是,首先要有比较的对象,题目中给定的字符串,其次要有练习者输入的字符串,并且要存到指定的即缓冲区,然后,用两个寄存器分别指向要比较和被比较字符串的首地址,首先比较第一个字符是不是相等,如果相等,计数寄存器加一,两指针寄存器各自加一,开始下一轮比较,知道十次比较结束,将计数寄存器的内容转化称ASCII码输出,结果即为输入字符的正确数。 其程序如下所示: judge proc near
push cx push dx xor al,al
lop: mov bx,offset address[si] ;bx指向address[si]的首地址 add bx,2
mov di,offset buff ;di指向buff的首地址 mov cx,0bh
lp2: mov dl,[bx] ;看[bx]和[di]的内容是否相同 cmp dl,[di] jnz next1
inc al ;计数寄存器加一 next1: inc bx inc di loop lp2 cbw mov cl,10
14
;保护现场