武汉理工 打字练习汇编语言程序设计 2013版

武汉理工大学《微机原理与通信接口》课程设计说明书

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

;保护现场

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4