📄 dazhijishi123.asm
字号:
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 + -