我的课程设计~
时间:2011-06-23
来源:互联网
题目七:打字计时程序
功能描述:
在键盘上练习打字并统计时间和准确率(含分别统计打字时正确及错误字符的个数)。每次打字之前,屏幕上出现一个例句,然后按照例句打字。当输入“Esc”键后,以退出程序,并显示所花费的时间。
功能描述:
在键盘上练习打字并统计时间和准确率(含分别统计打字时正确及错误字符的个数)。每次打字之前,屏幕上出现一个例句,然后按照例句打字。当输入“Esc”键后,以退出程序,并显示所花费的时间。
作者: s_evener 发布时间: 2011-06-23
DATAS SEGMENT
string0 DB " ** welcome to my asm **",0dh,0ah
DB " ",0dh,0ah
DB "********************************************************************************",0dh,0ah
DB " ",0dh,0ah
string1 DB " There are some practices,if you choice one,the practice will begin",0dh,0ah
string2 DB " **please practice typing**",0dh,0ah
DB " ",0dh,0ah,'$'
string3 DB " 1:There is no such thing as darkness,only a failure to see.",0dh,0AH,'$'
string4 DB " 2:The man who has made up his mind to win will never say Impossible ",0dh,0ah,'$'
string5 DB " 3:Miracles sometimes occur, but one has to work terribly for them. ",0dh,0ah,'$'
string6 DB " 4:Don't cry because it is over, smile because it happened. ",0dh,0ah,'$'
string7 DB " 5:Time is a bird for ever on the wing. ",0dh,0ah,'$'
string8 DB " input the number your choice:1 2 3 4 5",0dh,0ah,'$'
string9 DB 0dh,0ah," the number you wrong is:",'$'
string10 DB 0dh,0ah," the number you right is:",'$'
string11 DB 0dh,0ah," the time your wested is:",'$'
string12 DB 0dh,0ah," do you want to continue(anykey) or return DOS(ESC)",'$'
string13 DB 0dh,0ah," the total number is:",'$'
hou DB 0 ;定义小时
min DB 0 ;分钟
sec DB 0 ;秒
num DB 0 ;选择的号
wrong DB 0
right DB 0
total db 0
number DW 13d
DATAs ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AH,0FH;取当前显示模式
INT 10H
MOV AH,0 ;设置显示模式: 0 为黑白文本
INT 10h
;---------------------
string0 DB " ** welcome to my asm **",0dh,0ah
DB " ",0dh,0ah
DB "********************************************************************************",0dh,0ah
DB " ",0dh,0ah
string1 DB " There are some practices,if you choice one,the practice will begin",0dh,0ah
string2 DB " **please practice typing**",0dh,0ah
DB " ",0dh,0ah,'$'
string3 DB " 1:There is no such thing as darkness,only a failure to see.",0dh,0AH,'$'
string4 DB " 2:The man who has made up his mind to win will never say Impossible ",0dh,0ah,'$'
string5 DB " 3:Miracles sometimes occur, but one has to work terribly for them. ",0dh,0ah,'$'
string6 DB " 4:Don't cry because it is over, smile because it happened. ",0dh,0ah,'$'
string7 DB " 5:Time is a bird for ever on the wing. ",0dh,0ah,'$'
string8 DB " input the number your choice:1 2 3 4 5",0dh,0ah,'$'
string9 DB 0dh,0ah," the number you wrong is:",'$'
string10 DB 0dh,0ah," the number you right is:",'$'
string11 DB 0dh,0ah," the time your wested is:",'$'
string12 DB 0dh,0ah," do you want to continue(anykey) or return DOS(ESC)",'$'
string13 DB 0dh,0ah," the total number is:",'$'
hou DB 0 ;定义小时
min DB 0 ;分钟
sec DB 0 ;秒
num DB 0 ;选择的号
wrong DB 0
right DB 0
total db 0
number DW 13d
DATAs ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AH,0FH;取当前显示模式
INT 10H
MOV AH,0 ;设置显示模式: 0 为黑白文本
INT 10h
;---------------------
作者: s_evener 发布时间: 2011-06-23
jiemian:
MOV DX,OFFSET string0 ;取string0的偏移地址 到string2的$结束
MOV AH,09h ; 输出
INT 21h
;-------------------输出字符串
MOV DX,OFFSET string3
MOV AH,09h
INT 21h
;-------------------输出字符串
MOV DX,OFFSET string4
MOV AH,09h
INT 21h
;-------------------输出字符串
MOV DX,OFFSET string5
MOV AH,09h
INT 21h
;-------------------输出字符串
MOV DX,OFFSET string6
MOV AH,09h
INT 21h
;-------------------输出字符串
MOV DX,OFFSET string7
MOV AH,09h
INT 21h
INput:
MOV DX,OFFSET string8
MOV AH,09h
INT 21h
MOV AH,01h ;输入数字1,2,3,4,5
INT 21h
MOV num,AL ;输入的数放在AL中
CALL CLEAR_SCREEN ;清屏
;--------------第一次系统时间调用
MOV AH,2ch
INT 21h
MOV hou,CH
MOV min,CL
MOV sec,DH
MOV AH,02H
;------------------------
MOV AL,num
CMP AL,31h
JE DIsp1
CMP AL,32h
JE DIsp2
CMP AL,33h
JE DIsp3
CMP AL,34h
JE DIsp4
CMP AL,35h
JE DIsp5
JMP INput
;------------------
DIsp1: MOV DX,OFFSET string3
MOV BX,DX ;首地址DX给BX (CMP AL,[BX+12])
JMP start1
DIsp2: MOV DX,OFFSET string4
MOV BX,DX
JMP start1
DIsp3: MOV DX,OFFSET string5
MOV BX,DX
JMP start1
DIsp4: MOV DX,OFFSET string6
MOV BX,DX
JMP start1
DIsp5: MOV DX,OFFSET string7
MOV BX,DX
JMP start1
;------------------
start1: MOV AH,09h ;输出要打的字符串
INT 21h
MOV wrong,0 ;将wrong置0
MOV right,0 ;将right置0
JMP stringtest
;————————---
stringtest:
MOV AH,01h;输入一个字符
INT 21h
inc total ;总个数自加一
CMP AL,[BX+12] ;比较对应的字符
JNZ wrong1 ;不相等跳到
JZ right1
;-----------------------
wrong1: INC wrong
JMP next
right1: INC right
JMP next
;----------------------
next: CMP AL,1bh ;esc键
JE done ;跳到结束界面
CMP AL,0dh ;回车
JE timetest ;跳到统计子程序
INC BX ;刚给BX赋DX即字符串首地址,自加一(CMP AL,[BX+12])
JMP stringtest ;循环,输入下一个字符
;------------------
timetest:
;--- 输出打字的总个数---------
MOV DX,OFFSET string13 ;输出“the total number”
MOV AH,09h
INT 21h
CALL totalnumber ;调用子程序
;-----输出打错字的个数----
MOV DX,OFFSET string9
MOV AH,09h
INT 21h
CALL wrongnumber
;------输出打对字的个数-----
MOV DX,OFFSET string10
MOV AH,09h
INT 21h
CALL rightnumber
;=============================第二次系统时间调用
MOV DX,OFFSET string11
MOV AH,09h
INT 21h
CALL timeout
;------------------
MOV DX,OFFSET string12;输出结束语句
MOV AH,09h
INT 21h
MOV AH,01h;输入一字符判断是enter还是esc
INT 21h
CMP AL,1bh;esc键
JE done
MOV AH,01h
CMP AL,0dh;回车
mov total,0
JE clear
;------------------
MOV AH,01h
INT 21h
;--------------------
;在屏幕上显示"BYE"
done:
MOV AH,0FH;取当前显示模式
INT 10H
MOV AH,0 ;设置显示模式: 0
INT 10H
MOV Dx,OFFSET BYE;输出第一个bye
MOV AH,09h
INT 21h
MOV Dx,OFFSET BYE;输出第二个bye
MOV AH,09h
INT 21h
MOV AH,4ch
INT 21h
;------------------
clear: MOV AH,0FH;取当前显示模式
INT 10H
MOV AH,0 ;设置显示模式: 0
INT 10H
JMP jiemian
;---------------
bindec PROC ;时间二进制码转ASCII函数
PUSH AX
PUSH CX
PUSH DX
MOV DX,0
MOV CX,10d
DIV CX
MOV BX,DX
MOV DX,AX
OR DX,0030h
MOV AH,02h
INT 21h
MOV DX,BX
OR DX,0030h
MOV AH,02h
INT 21h
POP DX
POP CX
POP AX
RET
bindec ENDP
;-------------------
timeout PROC ;输出所用时间
PUSH AX
PUSH CX
PUSH DX
MOV AH,2ch ;调用中断,读取系统时间
INT 21h
SUB DH,sec
SBB CL,min
SBB CH,hou
MOV AL,CH ;转换成ASCII码
CBW
CALL bindec
MOV DL,':'
MOV AH,02h
INT 21h
MOV AL,CL
CBW
CALL bindec
MOV DL,':'
MOV AH,02h
INT 21h
MOV AL,DH
CBW
CALL bindec
POP DX
POP CX
POP AX
RET
timeout ENDP
;-----------------
wrongnumber PROC ;输出错误的个数
PUSH AX
PUSH CX
PUSH DX
MOV BL,10
DEC wrong
MOV AL,wrong
CBW
DIV BL
MOV BH,AH
MOV BL,AL
OR BH,30h
OR BL,30h
MOV AH,02h
MOV DL,BL
INT 21h
MOV DL,BH
INT 21h
POP DX
POP CX
POP AX
RET
wrongnumber ENDP
;----------------------
rightnumber PROC ;输出正确的个数
PUSH AX
PUSH CX
PUSH DX
MOV BL,10
MOV AL,right
CBW
DIV BL
MOV BH,AH
MOV BL,AL
OR BH,30h
OR BL,30h
MOV AH,02h
MOV DL,BL
INT 21h
MOV DL,BH
INT 21h
POP DX
POP CX
POP AX
RET
rightnumber ENDP
;-------------------
totalnumber PROC ;输出总个数
PUSH AX
PUSH CX
PUSH DX
MOV BL,10
DEC total
MOV AL,total
CBW
DIV BL
MOV BH,AH
MOV BL,AL
OR BH,30h
OR BL,30h
MOV AH,02h
MOV DL,BL
INT 21h
MOV DL,BH
INT 21h
POP DX
POP CX
POP AX
RET
totalnumber ENDP
;清屏子程序定义
CLEAR_SCREEN PROC NEAR
MOV AH,2 ;设置光标位置
MOV BH,0 ;页号
MOV DX,0 ;DH为右下角行,DL为右下角列
INT 10H
MOV AH,6 ;屏幕初始化
MOV AL,0 ;全屏幕为空白
MOV BH,7 ;黑底白字
MOV CX,0 ;CH为坐上角行,CL为左上角列
MOV DH,24 ;结束行
MOV DL,79 ;结束列
INT 10H
RET
CLEAR_SCREEN ENDP
CODES ENDS
END START
问题好多~
MOV DX,OFFSET string0 ;取string0的偏移地址 到string2的$结束
MOV AH,09h ; 输出
INT 21h
;-------------------输出字符串
MOV DX,OFFSET string3
MOV AH,09h
INT 21h
;-------------------输出字符串
MOV DX,OFFSET string4
MOV AH,09h
INT 21h
;-------------------输出字符串
MOV DX,OFFSET string5
MOV AH,09h
INT 21h
;-------------------输出字符串
MOV DX,OFFSET string6
MOV AH,09h
INT 21h
;-------------------输出字符串
MOV DX,OFFSET string7
MOV AH,09h
INT 21h
INput:
MOV DX,OFFSET string8
MOV AH,09h
INT 21h
MOV AH,01h ;输入数字1,2,3,4,5
INT 21h
MOV num,AL ;输入的数放在AL中
CALL CLEAR_SCREEN ;清屏
;--------------第一次系统时间调用
MOV AH,2ch
INT 21h
MOV hou,CH
MOV min,CL
MOV sec,DH
MOV AH,02H
;------------------------
MOV AL,num
CMP AL,31h
JE DIsp1
CMP AL,32h
JE DIsp2
CMP AL,33h
JE DIsp3
CMP AL,34h
JE DIsp4
CMP AL,35h
JE DIsp5
JMP INput
;------------------
DIsp1: MOV DX,OFFSET string3
MOV BX,DX ;首地址DX给BX (CMP AL,[BX+12])
JMP start1
DIsp2: MOV DX,OFFSET string4
MOV BX,DX
JMP start1
DIsp3: MOV DX,OFFSET string5
MOV BX,DX
JMP start1
DIsp4: MOV DX,OFFSET string6
MOV BX,DX
JMP start1
DIsp5: MOV DX,OFFSET string7
MOV BX,DX
JMP start1
;------------------
start1: MOV AH,09h ;输出要打的字符串
INT 21h
MOV wrong,0 ;将wrong置0
MOV right,0 ;将right置0
JMP stringtest
;————————---
stringtest:
MOV AH,01h;输入一个字符
INT 21h
inc total ;总个数自加一
CMP AL,[BX+12] ;比较对应的字符
JNZ wrong1 ;不相等跳到
JZ right1
;-----------------------
wrong1: INC wrong
JMP next
right1: INC right
JMP next
;----------------------
next: CMP AL,1bh ;esc键
JE done ;跳到结束界面
CMP AL,0dh ;回车
JE timetest ;跳到统计子程序
INC BX ;刚给BX赋DX即字符串首地址,自加一(CMP AL,[BX+12])
JMP stringtest ;循环,输入下一个字符
;------------------
timetest:
;--- 输出打字的总个数---------
MOV DX,OFFSET string13 ;输出“the total number”
MOV AH,09h
INT 21h
CALL totalnumber ;调用子程序
;-----输出打错字的个数----
MOV DX,OFFSET string9
MOV AH,09h
INT 21h
CALL wrongnumber
;------输出打对字的个数-----
MOV DX,OFFSET string10
MOV AH,09h
INT 21h
CALL rightnumber
;=============================第二次系统时间调用
MOV DX,OFFSET string11
MOV AH,09h
INT 21h
CALL timeout
;------------------
MOV DX,OFFSET string12;输出结束语句
MOV AH,09h
INT 21h
MOV AH,01h;输入一字符判断是enter还是esc
INT 21h
CMP AL,1bh;esc键
JE done
MOV AH,01h
CMP AL,0dh;回车
mov total,0
JE clear
;------------------
MOV AH,01h
INT 21h
;--------------------
;在屏幕上显示"BYE"
done:
MOV AH,0FH;取当前显示模式
INT 10H
MOV AH,0 ;设置显示模式: 0
INT 10H
MOV Dx,OFFSET BYE;输出第一个bye
MOV AH,09h
INT 21h
MOV Dx,OFFSET BYE;输出第二个bye
MOV AH,09h
INT 21h
MOV AH,4ch
INT 21h
;------------------
clear: MOV AH,0FH;取当前显示模式
INT 10H
MOV AH,0 ;设置显示模式: 0
INT 10H
JMP jiemian
;---------------
bindec PROC ;时间二进制码转ASCII函数
PUSH AX
PUSH CX
PUSH DX
MOV DX,0
MOV CX,10d
DIV CX
MOV BX,DX
MOV DX,AX
OR DX,0030h
MOV AH,02h
INT 21h
MOV DX,BX
OR DX,0030h
MOV AH,02h
INT 21h
POP DX
POP CX
POP AX
RET
bindec ENDP
;-------------------
timeout PROC ;输出所用时间
PUSH AX
PUSH CX
PUSH DX
MOV AH,2ch ;调用中断,读取系统时间
INT 21h
SUB DH,sec
SBB CL,min
SBB CH,hou
MOV AL,CH ;转换成ASCII码
CBW
CALL bindec
MOV DL,':'
MOV AH,02h
INT 21h
MOV AL,CL
CBW
CALL bindec
MOV DL,':'
MOV AH,02h
INT 21h
MOV AL,DH
CBW
CALL bindec
POP DX
POP CX
POP AX
RET
timeout ENDP
;-----------------
wrongnumber PROC ;输出错误的个数
PUSH AX
PUSH CX
PUSH DX
MOV BL,10
DEC wrong
MOV AL,wrong
CBW
DIV BL
MOV BH,AH
MOV BL,AL
OR BH,30h
OR BL,30h
MOV AH,02h
MOV DL,BL
INT 21h
MOV DL,BH
INT 21h
POP DX
POP CX
POP AX
RET
wrongnumber ENDP
;----------------------
rightnumber PROC ;输出正确的个数
PUSH AX
PUSH CX
PUSH DX
MOV BL,10
MOV AL,right
CBW
DIV BL
MOV BH,AH
MOV BL,AL
OR BH,30h
OR BL,30h
MOV AH,02h
MOV DL,BL
INT 21h
MOV DL,BH
INT 21h
POP DX
POP CX
POP AX
RET
rightnumber ENDP
;-------------------
totalnumber PROC ;输出总个数
PUSH AX
PUSH CX
PUSH DX
MOV BL,10
DEC total
MOV AL,total
CBW
DIV BL
MOV BH,AH
MOV BL,AL
OR BH,30h
OR BL,30h
MOV AH,02h
MOV DL,BL
INT 21h
MOV DL,BH
INT 21h
POP DX
POP CX
POP AX
RET
totalnumber ENDP
;清屏子程序定义
CLEAR_SCREEN PROC NEAR
MOV AH,2 ;设置光标位置
MOV BH,0 ;页号
MOV DX,0 ;DH为右下角行,DL为右下角列
INT 10H
MOV AH,6 ;屏幕初始化
MOV AL,0 ;全屏幕为空白
MOV BH,7 ;黑底白字
MOV CX,0 ;CH为坐上角行,CL为左上角列
MOV DH,24 ;结束行
MOV DL,79 ;结束列
INT 10H
RET
CLEAR_SCREEN ENDP
CODES ENDS
END START
问题好多~
作者: s_evener 发布时间: 2011-06-23
额。。。代码好长 计时出问题了 还有错误统计也有问题。。。焦头烂额 不敢改了~越改越悲催,求高手
作者: s_evener 发布时间: 2011-06-23
楼主的程序好长。
作者: haojiahuo50401 发布时间: 2011-06-23
所以没勇气改了~
作者: s_evener 发布时间: 2011-06-23
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28