📄 dazhijishi123.asm
字号:
;**************定义常用字符的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 + -