+ -
当前位置:首页 → 问答吧 → 我的课程设计~

我的课程设计~

时间:2011-06-23

来源:互联网

题目七:打字计时程序
功能描述:
  在键盘上练习打字并统计时间和准确率(含分别统计打字时正确及错误字符的个数)。每次打字之前,屏幕上出现一个例句,然后按照例句打字。当输入“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  
  ;---------------------

作者: 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




问题好多~

作者: s_evener   发布时间: 2011-06-23

额。。。代码好长 计时出问题了 还有错误统计也有问题。。。焦头烂额 不敢改了~越改越悲催,求高手

作者: s_evener   发布时间: 2011-06-23

楼主的程序好长。

作者: haojiahuo50401   发布时间: 2011-06-23

所以没勇气改了~

作者: s_evener   发布时间: 2011-06-23