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

📄 dazhijishi123.asm

📁 自己用汇编语言编写的打字计时程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;**************定义常用字符的ASC码*************
CR	= 0DH      ;回车键的ASCLL码
LF	= 0AH	   ;换行键的ASCLL码
ESCKG	= 1BH      ;ESC键的ASCLL码
JIESHU  = '$'      ;定义"$"为字符串结束符
;**************下面为宏定义*******************
;******定义宏移动光标到指定位置*******
MOVTO MACRO ROW,LIE 
	PUSH AX
	PUSH DX
	MOV AH, 2
	MOV DH, ROW    ;行
        MOV DL, LIE    ;列 
	INT 10H
	POP DX
	POP AX
	ENDM
 ;********定义宏输出指示符*******
GUANGBIAO MACRO   
	PUSH AX
	PUSH BX
	PUSH CX
	MOV CX, 1
        MOV AH, 9   
        MOV AL,'_'
        MOV BL, 0FH
        INT 10H
        POP CX
        POP BX
        POP AX
        ENDM
;******乘以10的宏*********
X10	MACRO X     
	 MOV AX,X
	MOV BX,10
	 MUL BX
	ENDM
;*******定义宏来在指定位置输出msg的内容*****
DISPLAYMSG MACRO MSG,ATTR,ROW,LIE	
	LOCAL COME,EXITOP  ;声明COME,EXIT为本地宏变量
	PUSH AX            ;别的宏不能调用
	PUSH BX
	PUSH CX
	PUSH DX
	PUSH DI
	MOV DH, ROW
	MOV DL, LIE
	 MOV BH, 0
        MOV BL, ATTR
        MOV DI, 0
COME:
	MOV AH, 02H               ;置光标位置
	INT 10H
	
	MOV AL, MSG[DI]
	CMP AL, JIESHU
	JZ EXITOP                 ;遇到"$"则转到EXITOP
        MOV AH, 09H
        MOV CX, 1
        INT 10H
        INC DI
        INC DL
        JMP COME
EXITOP:
        POP DI
        POP DX
        POP CX
        POP BX
        POP AX
        ENDM
;******定义宏显示出al中的内容*******
PRINT MACRO COLOR,ROW,LIE  
	PUSH BX
	PUSH CX
	MOV AH, 02H   ;设置光标的位置
	MOV BH,0	
	MOV DL,LIE
	MOV DH,ROW
	INT 10H
        MOV CX,1
	MOV AH,09H    ;写字符到光标处
	MOV BH,0	
	MOV BL,COLOR	
	INT 10H
        POP CX 
        POP BX
ENDM
;******************数据段定义******************
DATA SEGMENT 
MYNAME0  DB '           *                                          *                   ',JIESHU
MYNAME1  DB '********  ************     ********  ********    *    *    *  *******     ',JIESHU 
MYNAME2  DB '**    *  *     *    *      *     *   *      *    *    *    *  *     *     ',JIESHU
MYNAME3  DB '* *  *         *   *       *    *    *      *    ***********  *     *     ',JIESHU                 
MYNAME4  DB '*  *          *            *      *  *      *    **********   *     *     ',JIESHU                      
MYNAME5  DB '* *  *       * *           ********* ********             *   *     *     ',JIESHU         
MYNAME6  DB '*     *     *    *         *         *      *    **********   *     *     ',JIESHU                         
MYNAME7  DB '********   *        *      *         *      *    *           *       *  * ',JIESHU                     
MYNAME8  DB '         *            *    *         ********    ********** *         **  ',JIESHU 
FILENAME        DB '1.TXT',0
RIGHTMSG	DB 'RATE: 00.00%$'
TIME		DB 'THE TOTALTIME: 00:00:00$'
WELCOMEWORD	DB '>>>>>>WELCOME TO USE THIS PROGRAM<<<<<<',JIESHU
MADEBY	 DB '-----DESIGNED BY OUYANGKAI (2003090240320)-----',JIESHU
MSG1     DB '******PRESS "ENTER" TO START!********$'
MSG2     DB '*********PRESS " ESC" TO OUT THE PROGRAM!**********$'
MSG3     DB '>>>>>>>>PRESS ANY KEY TO EXIT TO DOS<<<<<<<<$'
MSG4     DB '>>>>>>>>THANK YOU FOR USEING THIS PROGRAM<<<<<<<<$'
ALLRIGHTMSG DB 'RATE: 1 0 0%$'
HANDLE		DW ?		;保存文件名
ARRAY		LABEL BYTE;使同一个内存地址可用不同类型的符号表示
                          ;用LABEL定义的符号不占用任何内存空间。
COUNT		DW 0		
LINELENGTH	DW 0
FILELENGTH	DW 0
RIGHTWORD	DW 0		;正确字符数
TOTALWORD	DW 0		;用户打字总数
STARTROW	DB 5		;定义作为显示文本里面文字的开始行
CONTRAST	DB 71h		;作为中间量和实时钟的秒数对比
SEC		DW 0		;秒
MIN		DW 0		;分
HOUR		DW 0		;时
CORRECT		DW 4 DUP(0)	;指定百分比为4位有效数字
BUF		DB 128 DUP(?)	;缓冲区,存放读到的文字
BYE0  DB '   __________   _            _   ___________   ',JIESHU
BYE1  DB '  /  ______  |  \ \         / / / __________|  ',JIESHU
BYE2  DB '  | /      | |   \ \       / /  | |            ',JIESHU
BYE3  DB '  | |      / |    \ \     / /   | |            ',JIESHU
BYE4  DB '  | |_____/ /      \ \   / /    | |_______     ',JIESHU
BYE5  DB '  |        /        \ \ / /     |  _______|    ',JIESHU
BYE6  DB '  |  _____ \         \   /      | |            ',JIESHU
BYE7  DB '  | |     | \        |   |      | |            ',JIESHU
BYE8  DB '  | |     |  |       |   |      | |            ',JIESHU
BYE9  DB '  | \_____|  |       |   |      | |_________            ',JIESHU
BYE10 DB '  \__________|       |___|      \___________|  ',JIESHU
DATA ENDS
;********************堆栈段定义***************************
STACK SEGMENT PARA STACK 'STACK'  
DB 256 DUP(?)
STACK ENDS
;****************下面为主程序************
CODE SEGMENT  
        ASSUME DS:DATA,CS:CODE,SS:STACK
MAIN	PROC FAR
START:
        PUSH DS
	MOV AX,0
	PUSH AX
        MOV AX,DATA
	MOV DS,AX
  
	MOV AH,0
	MOV AL,11h   ;定义显示方式,全屏
	INT 10H       
	
	CALL WELCOME
   CLS:
        CALL JIEMIAN
	
	    
	MOV DX,OFFSET FILENAME
	MOV AH,3DH;AL=0为读文件,AH=3DH是功能号
	MOV AL,0
	INT 21H
	MOV HANDLE,AX

AG:
	MOV BX,HANDLE	
	MOV AH,42H    ;移动文件指针的中断
	MOV AL,0      ;定义为从文件头移动
	MOV CX,0      ;CX:DX为位移量 
	MOV DX,FILELENGTH  ;文件长度传给DX
	INT 21H

	MOV BX,HANDLE
	LEA DX,BUF
	MOV CX,50	;读文件里的字节数为50
	MOV AH,3FH
	INT 21H
	
	MOV BX,AX	;AX=实际读到的字符数
	MOV BUF[BX],JIESHU ;在读到文字最后添加"$"符
	MOV BX,0
CREND:			
	CMP BUF[BX],CR     ;检测文本里的回车键
	JZ CHANGCR
	CMP BUF[BX],JIESHU  ;检测文本里的"$"
	JZ ALL
	INC BX
	LOOP CREND
	JMP ALL
CHANGCR:                ;遇到回车时把$传给回车处
	MOV BUF[BX],JIESHU
ALL:
	MOV LINELENGTH,BX
	ADD BX,2
	ADD FILELENGTH,BX
        DISPLAYMSG BUF,0FH,STARTROW,14  ;在(5,14)输出文本字符
	INC STARTROW       ;输出后增加两行,下次输出就在第7行输出   
	INC STARTROW
	CALL INPUTCHAR     ;调用等待用户输入的子程序
	JMP AG

 QUIT:                     ;退出程序
	MOV BX,HANDLE
	MOV AH,3EH	   ;关闭文本文件
	MOV BL,0AH
	MOV DL,18
	INT 21H
;**************退出界面******************        
	CALL CLS_SCREEN    ;调用清屏子程序
SHOWBYE:                   ;在屏幕上显示"BYE"	
	DISPLAYMSG BYE0,BL,6,DL
	DISPLAYMSG BYE1,BL,6+1,DL
	DISPLAYMSG BYE2,BL,6+2,DL
	DISPLAYMSG BYE3,BL,6+3,DL
	DISPLAYMSG BYE4,BL,6+4,DL
	DISPLAYMSG BYE5,BL,6+5,DL
	DISPLAYMSG BYE6,BL,6+6,DL
	DISPLAYMSG BYE7,BL,6+7,DL
	DISPLAYMSG BYE8,BL,6+8,DL
	DISPLAYMSG BYE9,BL,6+9,DL
	DISPLAYMSG BYE10,BL,6+10,DL
	
	DISPLAYMSG MSG4,0BH,3,15
	DISPLAYMSG MSG3,0BH,22,18
	MOV AH,1        ;判断键盘有无输入
	INT 16H
	JZ SHOWBYE      ;无输入则继续显示退出界面
	CALL CLS_SCREEN ;返回DOS前先清屏
	MOV AH,4CH      ;返回DOS
	INT 21H
        RET
MAIN    ENDP
;*****************键盘输入的子程序********************
INPUTCHAR PROC FAR  
BEGIN:
	CALL DISPLAYTIME ;调用显示时间子程序
	MOV AH,1         ;判断有没键盘输入
	INT 16H
	JZ  BEGIN
TH:     MOV AH,0   ;读键盘中断
	INT 16H
	
	CMP AL,ESCKG  ;检测esc键,相同则退出
	JZ QUIT

	CMP AL,CR     ;检测回车键,相同则换行
	JZ NEXTLINE
DELETE:              
	CMP AL,08H    ;检测退格键
	JZ DELETE_G
        JMP HA
DELETE_G:
	DEC TOTALWORD ;总数减一
	DEC COUNT     
	DEC DL        
	MOVTO DH,DL   ;光标前进一列
	PRINT ' ', DH,DL  ;要删除的地方输出空格" ".
	dec DL
	MOVTO DH, DL
	GUANGBIAO     ;输出光标"_"
        ADD DL,1
	MOVTO DH, DL  
	MOV AH, 08H   ;调用读当前光标位置的字符,属性中断
	INT 10H
	CMP AH, 0aH  ;出口参数中ah=字符属性,如果删除的字符颜色为正确
	JNZ DEL      ;字符的颜色则正确字符数和总字符数都减一
	DEC RIGHTWORD;如果颜色为错误的颜色,则只要总字符数加一 
DEL:
	MOV AL,' '
	PRINT 07,DH,DL
	JMP TH
 
  HA:   INC TOTALWORD  ;当有输入时总数加一
	CALL ISRIGHT   ;并调用检测输入是否正确子程序
	INC COUNT
	CALL CORRECTRATE  ;调用正确百分率子程序
	MOV BX,COUNT
	CMP BX,LINELENGTH  ;当输入的字符和上面一行

⌨️ 快捷键说明

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