📄 math.asm
字号:
ShowMess mess14
mov dx,20000 ;延时
h11:
mov cx,20000
h22:
loop h22
dec dx
jnz h11
clear 0,14,20,14,55,74h
clear 0,12,41,12,45,71h ;清除错误结果
SetGb 12,41
jmp nexttry
fail2:
inc NNum
inc YNum ;只能是下一次做对了
SetGb 14,22
ShowMess mess15
mov dx,20000 ;延时
i11:
mov cx,20000
i22:
loop i22
dec dx
jnz i11
clear 0,14,20,14,55,74h
clear 0,12,41,12,45,71h ;清除错误结果
SetGb 12,41
jmp nexttry
fail3:
inc NNum
inc YNum ;只能是下一次做对了
SetGb 14,35
ShowMess mess16
mov dx,40000 ;延时
j11:
mov cx,20000
j22:
loop j22
dec dx
jnz j11
clear 0,14,20,14,55,74h
nextmess:
mov NNum,1
clear 0,14,20,14,55,74h
SetGb 14,30
ShowMess mess6 ;输出错误提示
SetGb 15,30
ShowMess mess7
;显示正确答案
MOV BX,RESULT
CALL BINDEC
JP1:
mov YNum,1
SetGb 16,30
ShowMess mess3 ;显示每道题所用时间
CALL DISPTIME
CALL CRLF
CALL CRLF
mov dx,40000 ;延时
f11:
mov cx,20000
f22:
loop f22
dec dx
jnz f11
clear 0,14,20,16,55,74h
INC W
INC SI
DEC total ;计数器减1,进入下一次循环
JNE begi
jmp next12
begi:
jmp BEGIN1
next12:
MOV X10,10 ;计算总分
MOV AL,first
MOV AH,0 ;每一题十分
MUL X10
ADD sum,AX
MOV X8,8 ;计算总分
MOV AL,second
MOV AH,0 ;每一题八分
MUL X8
ADD sum,AX
MOV X5,5 ;计算总分
MOV AL,third
MOV AH,0 ;每一题五分
MUL X5
ADD sum,AX
clear 0,8,13,19,65,76h
SetGb 10,33
ShowMess mess9
SetGb 12,25
ShowMess mess8 ;输出总分提示
mov bx,sum ;输出总分
CALL BINDEC ;
mov dx,40000 ;延时
f211:
mov cx,20000
f222:
loop f222
dec dx
jnz f211
clear 0,8,13,19,65,76h
SetGb 12,25
ShowMess mess13
SetGb 14,35
CALL RETURN ;询问是否再作一遍试题
CLI ;恢复原中断
PUSH DS
MOV DX,SAVE_LC
MOV AX,SAVE_LC+2
MOV DS,AX
MOV AL,1CH
MOV AH,25H
INT 21H
POP DS
STI
BEGIN1:
JMP begin
exit:
mov ah,4ch
int 21h
;***************
;随机函数
;***************
RAND PROC NEAR ;产生随机数子程序
PUSH CX
PUSH DX
PUSH AX
STI ;置中断允许
MOV AH,0 ;读时钟计数器值
INT 1AH
MOV AX,DX
AND AH,3 ;清高6位
MOV DL,41 ;除41,产生0~40余数
DIV DL
MOV BL,AH ;余数存BX,作随机数
POP AX
POP DX
POP CX
RET
RAND ENDP
;**********************
;二进制转换为十进制数函数1
;**********************
BINDEC PROC NEAR ;输出两位十进制数
PUSH BX
PUSH CX
MOV CX,10 ;除以10
CALL DECDIV
MOV CX,1 ;除以1
CALL DECDIV
POP CX
POP BX
RET
BINDEC ENDP
;***********************
;二进制转换为十进制数函数2
;***********************
DECDIV PROC NEAR ;二进制-->十进制(一位数)子程序
MOV AX,BX ;BX->AX,(DX,AX)作被除数,商->AX
MOV DX,0 ;DX清0,余数->DX
DIV CX ;CX存转换量级
MOV BX,DX
MOV DL,AL
ADD DL,30H
MOV AH,02 ;调用DOS(21H)2号功能
INT 21H
RET
DECDIV ENDP
;*********************
;十进制转换为二进制数函数
;*********************
DECBIN PROC NEAR ;十进制-->二进制子程序
MOV BX,0
NEWCHAR:
MOV AH,1 ;键盘输入
INT 21H ;调用DOS(21H)1号功能
MOV DL,AL
SUB AL,30H ;ASCⅡ码-->二进制
JL ret2 ;是否<0
CMP AL,9
JG EXIT ;是否>9
CBW
XCHG AX,BX ;交换AX,BX
MOV CX,10
MUL CX
XCHG AX,BX
ADD BX,AX
JMP NEWCHAR
ret2:
RET
DECBIN ENDP
;**************
;回车换行
;**************
CRLF PROC NEAR ;回车换行子程序
MOV DL,0AH ;换行
MOV AH,02
INT 21H
MOV DL,0DH ;回车
MOV AH,02
INT 21H
RET
CRLF ENDP
;************
;评语函数
;************
VALUE PROC NEAR ;输出评语子程序
CALL BINDEC
VALUE ENDP
;***************
;循环演练试题子程序
;***************
RETURN PROC NEAR
MOV AH,01
INT 21H
CMP AL,'Y' ;输入Y或Y,再来一次
JE START1
CMP AL,'y'
JE START1
CMP AL,'N' ;输入N或N,及其他字符均返回
JE RET01
CMP AL,'n'
JE RET01
RET01:
jmp exit
ret
START1:
JMP start
RETURN ENDP
;***********
;输出题号函数
;***********
ShowNum PROC NEAR
OutPut '(' ;输出左括号
ADD Z,1
MOV BX,Z ;输出题目序号
CALL BINDEC
OutPut ')' ;输出右括号
OutPut 20H ;输出空格
RET
ShowNum ENDP
;***************
;中断函数
;***************
CLINT PROC NEAR ;自设时间中断子过程
PUSH DS
PUSH BX
MOV BX,DATA
MOV DS,BX
LEA BX,COUNT
INC WORD PTR[BX]
CMP WORD PTR[BX],18 ;18次中断为1秒
JNE RETURN1
CALL INCT ;调用分秒转换子程序
ADJ:
CMP HOURS,12 ;处理"时"
JLE RETURN1
SUB HOURS,12
RETURN1:
POP BX
POP DS
STI
IRET
CLINT ENDP
;**************
;分秒转换子程序
;**************
INCT PROC NEAR
MOV WORD PTR[BX],0
ADD BX,2
INC WORD PTR[BX]
CMP WORD PTR[BX],60 ;60秒为1分
JNE EXIT1
CALL INCT
EXIT1:
RET
INCT ENDP
;****************
;显示计时器时间
;****************
DISPTIME PROC NEAR
MOV AX,MIN ;显示"分"
CALL BINDECCXC1
MOV BX,0
MOV AL,':'
MOV AH,0EH
INT 10H
MOV AX,SEC ;显示"秒"
CALL BINDECCXC1
MOV BX,0
MOV AL,':'
MOV AH,0EH
INT 10H
MOV BX,COUNT ;显示"毫秒"
MOV AL,55
MUL BL
CALL BINDECCXC
RET
DISPTIME ENDP
;********************
;为显示时间而服务的二进制->十进制(3位)
;********************
BINDECCXC PROC NEAR
MOV CX,100
CALL DECDIVCXC
MOV CX,10
CALL DECDIVCXC
MOV CX,1
CALL DECDIVCXC
RET
BINDECCXC ENDP
;*********************
;为显示时间而服务的二进制->十进制(2位)
;*********************
BINDECCXC1 PROC NEAR
MOV CX,10
CALL DECDIVCXC
MOV CX,1
CALL DECDIVCXC
RET
BINDECCXC1 ENDP
;**************************
;为显示时间而服务的二进制->十进制(1位)
;**************************
DECDIVCXC PROC NEAR
MOV DX,0
DIV CX
MOV BX,0
ADD AL,30H
MOV AH,0EH
INT 10H
MOV AX,DX
RET
DECDIVCXC ENDP
;******************************************************************************************
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -