⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dazhijishi123.asm

📁 自己用汇编语言编写的打字计时程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	JZ NEXTLINE        ;显示的字符数目相等时换行
	JMP BEGIN
NEXTLINE:
	MOV BX,LINELENGTH
	ADD BX,15        
	DEC STARTROW
	PRINT 0h,STARTROW,BL ;输出文本里面的下一行		
	INC STARTROW         ;重新等待用户输入
	MOV COUNT,0
	RET
INPUTCHAR ENDP
;*************显示时间子程序************
DISPLAYTIME PROC FAR  
	PUSH AX
	PUSH BX
	PUSH DX
	MOV AH,02H   ;读实时钟
	INT 1AH
	CMP DH,CONTRAST  ;让CONTRAST跟读出来的秒数比
	JZ TIMEEXIT
	MOV CONTRAST,DH  ;比完后不相同的就把DH传给中间量CONTRAST
                         ;秒数加1,一直循环
	INC SEC          ;当遇到60时进位
	CMP SEC,60
	JNZ CONTINUATE
	INC MIN
	MOV SEC,0
	CMP MIN,60
	JNZ CONTINUATE
	INC HOUR
	MOV MIN,0
CONTINUATE:
	CALL TENTOASC   ;调用10进制转换为ascll码子程序
	DISPLAYMSG TIME,0EH,20,15 ;在(20,15)位置显示时间
TIMEEXIT:
	POP DX
	POP BX
	POP AX
	RET
DISPLAYTIME ENDP
;***********判断输入是否正确的子程序******************
ISRIGHT PROC NEAR  
	MOV BX,COUNT    ;对比显示和输出的字符是否一致
	CMP AL,BUF[BX]
	JNZ WRONG       ;不一样转移到标注错误的语句
	INC RIGHTWORD   
	DEC STARTROW
	MOV BL,ARRAY
	ADD BL,14        ;显示的第一个字符定义在14列
	PRINT 0AH,STARTROW,BL  ;正确的字符显示为浅绿色
	MOV BL,ARRAY
	ADD BL,15         
	MOV AL,'_'
	PRINT 07H,STARTROW,BL  ;在要输入的字符下面打印光标号"_"
	INC STARTROW
	RET              ;当输入和显示一样时变色后返回调用
WRONG:	
	DEC STARTROW
	MOV BL,ARRAY
	ADD BL,14
	PRINT 0CH,STARTROW,BL   ;错误的字符显示淡红色
	MOV BL,ARRAY
	ADD BL,15
	MOV AL,'_'
	PRINT 07H,STARTROW,BL
	INC STARTROW
	RET                     ;当字符输入不一样时变完颜色后返回
ISRIGHT ENDP


;****************百分率子程序*****************
;正确率(**.**%)算法:正确字符数*10除以正确字符数,得到的商为2进制数,变为ascll码后作为
;正确率的最高位,然后余数*10后继续除以总数,也把商换成ascll码.循环4次输出4位有效数字
CORRECTRATE PROC NEAR   
	PUSH AX
	PUSH BX
	PUSH CX
	PUSH DX
			
	MOV CX,4   ;循环4次,得出4位有效数字
	MOV BX,0     
CLEAR:	MOV CORRECT[BX],0 ;让除出来的数分别存放在缓存区里
	ADD BX,2
	LOOP CLEAR
	
	MOV AX,RIGHTWORD
	CMP AX,TOTALWORD  ;如果正确数和总数相等则为100%
	JZ ALLRIGHT
	MOV SI,0
	MOV CX,4	
	X10 RIGHTWORD    ;正确数*10
RATELOOP:
	MOV DX,0       
	DIV  TOTALWORD   ;AX放商,DX放余数
	MOV CORRECT[SI],AX
	CMP DX,0
	JZ  ISZERO	;余数是零则跳出除法
	X10 DX          ;把余数*10继续进行除法运算,
	                ;最后得出4为有效数字
	INC SI
	INC SI          ;数字是16位.所以SI要递增两次
	LOOP RATELOOP
ISZERO:                 
	CALL TOASC      ;10进制转换为ascll码
	DISPLAYMSG RIGHTMSG,0EH,20,50  ;在(20,50)输出转为asc码后的正确率
	POP DX
	POP CX
	POP BX
	POP AX          
	RET             ;分为全对和不全对两种情况,所以要分别返回
ALLRIGHT:
	DISPLAYMSG ALLRIGHTMSG,0EH,20,50;输出全对的正确率100%
	POP DX
	POP CX
	POP BX
	POP AX
	RET
CORRECTRATE ENDP
;********将一位十进制数转换为ASCII码*********
TOASC PROC NEAR  ;一位的十进制转为asc码只要加上30H即可
	PUSH BX
	PUSH CX
	MOV CX,4
	MOV BX,0
CHANGE:
	ADD CORRECT[BX],30H  ;让除出来的商都加上30H    
	ADD BX,2             ;correct定义为字节型,所以一次递增2
	LOOP CHANGE          ;循环4次,算出4为有效数字
        
	MOV AX,CORRECT 
	MOV SI,6             ;rightmsg地址下的第6个字符
	MOV RIGHTMSG[SI],AL  ;把已经加上30H的商的第0偏移地址的数据传给rightmsg字符串第6个字符
	                     ;传给rightmsg字符串第6个字符字符串里的字符是从0开始算起的
	MOV AX,CORRECT[2]    
	MOV RIGHTMSG[SI+1],AL
	MOV RIGHTMSG[SI+2],'.';把"."传给rightmsg的第8个偏移地址数
	MOV AX,CORRECT[4]
	MOV RIGHTMSG[SI+3],AL 
	MOV AX,CORRECT[6]
	MOV RIGHTMSG[SI+4],AL
	POP BX
	POP CX
	RET
TOASC   ENDP
;******小于100的十进制数转化为ASC码****
TENTOASC PROC NEAR   
        MOV BL,10    ;要转换的数除以10分离出商和余数,分别放在AL和AH中	
	MOV AX,SEC   ;分别加上30H即转换为ASC码
	DIV BL
	ADD AL,30H   ;商转换为ascll码
	MOV SI,22    ;把指针指向time地址里面字符串的最后一个0
	MOV TIME[SI-1],AL
	ADD AH,30H   ;余数也转换为ascll码  
	MOV TIME[SI],AH  ;把秒数放在time的最后两个0的偏移地址下
	MOV BL,10    ;定义颜色
	MOV AX,MIN    ;--------------把分钟数放在第3,4个0处
	DIV BL
	ADD AL,30H
	MOV TIME[SI-4],AL
	ADD AH,30H
	MOV TIME[SI-3],AH
	MOV BL,10    
	MOV AX,HOUR   ;---------------把小时数放在第1,2个0处
	DIV BL
	ADD AL,30H   
	MOV TIME[SI-7],AL
	ADD AH,30H
	MOV TIME[SI-6],AH	
	RET
TENTOASC ENDP

;**********************输出外围框架子程序******************
KUANG PROC 
	PUSH AX
	PUSH CX
	PUSH DX
	MOV BL,9AH	
 	MOV AH, 0
 	MOV AL,3
 	INT 10H
 	MOV CX, 79  ;定义循环79次
 	MOV DH, 0
 	MOV DL, 0
AGAIN1:	            ;显示上框
	INC DL     
	
	MOV AL,'*'
	PRINT BL,DH,DL	
	LOOP AGAIN1
	
	MOV CX, 24
AGAIN2:	            ;显示右框
	INC DH
	PRINT BL,DH,DL
	LOOP AGAIN2
	
	MOV CX, 79
AGAIN3:             ;显示下框
	DEC DL
	PRINT BL,DH,DL
	LOOP AGAIN3
	
	MOV CX, 24
AGAIN4:             ;显示左框
	DEC DH
	PRINT BL,DH,DL
	LOOP AGAIN4
       
	MOV CX,79   ;重新定位光标在(18,0)
        MOV DH,18
	MOV DL,0
         MOV AL,'@'
AGAIN5:             ;在第18行显示一行"@"
        PRINT BL,DH,DL
	INC DL
	LOOP AGAIN5
        POP DX
	POP CX
	POP AX
	RET
KUANG ENDP
;*****************欢迎界面***************
WELCOME PROC FAR
        PUSH AX
        PUSH DX
        PUSH BX
        CALL KUANG
SHOW:
      DISPLAYMSG WELCOMEWORD ,0EH,3,20
      DISPLAYMSG MADEBY ,05H,5,20
      DISPLAYMSG MSG2,0AH,20,13
      DISPLAYMSG MSG1, 0AH,22,20
      MOV BL,0AH
      MOV DL,4
      DISPLAYMSG MYNAME0,BL,7,DL
      DISPLAYMSG MYNAME1,BL,8,DL
      DISPLAYMSG MYNAME2,BL,9,DL
      DISPLAYMSG MYNAME3,BL,10,DL
      DISPLAYMSG MYNAME4,BL,11,DL
      DISPLAYMSG MYNAME5,BL,12,DL
      DISPLAYMSG MYNAME6,BL,13,DL
      DISPLAYMSG MYNAME7,BL,14,DL
      DISPLAYMSG MYNAME8,BL,15,DL
      
      MOV AH,0     ;读键盘输入
      INT 16H
      CMP AL,CR    ;检测到回车时跳转到打字程序
      JZ CLS
   
      CMP AL,ESCKG ;检测为esc键时跳到程序退出
      JZ  QUIT
      JMP SHOW
      POP BX
      POP DX
      POP AX
      RET
WELCOME ENDP
;**************打字界面子程序***************
JIEMIAN PROC FAR
      CALL KUANG
      DISPLAYMSG MSG2,0AH,22,13
      DISPLAYMSG WELCOMEWORD ,0EH,1,20
      DISPLAYMSG MADEBY ,0EH,3,19
      RET
JIEMIAN ENDP
;***********清屏子程序***********
CLS_SCREEN PROC FAR

      MOV AH,15
      INT 10H
      MOV AH,0
      INT 10H
      RET
CLS_SCREEN ENDP

CODE ENDS
	END START

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -