📄 math.asm
字号:
;*************
;小学生算术 *
;*************
;宏定义
;>>>>>>>>>>>>清屏>>>>>>>>>>>>>>>>>
clear macro al1,ch1,cl1,dh1,dl1,bh1
push ax
push bx
push cx
push dx
mov ah,6
mov al,al1
mov ch,ch1
mov cl,cl1
mov dh,dh1
mov dl,dl1
mov bh,bh1
int 10h
pop dx
pop cx
pop bx
pop ax
endm
;>>>>>>>>>>>>>光标定位>>>>>>>>>>>>>>>>>>>>>>>>
SetGb macro dh1,dl1
push ax
push bx
push dx
mov dh,dh1
mov dl,dl1
mov bh,0
mov ah,02h
int 10h
push ax
push bx
push dx
endm
;>>>>>>>>>>>>>>>>>>提示信息>>>>>>>>>>>>>>>>>>>>>>>
ShowMess macro mess
push ax
push dx
mov ah,09
lea dx,mess
int 21h
pop dx
pop ax
endm
;>>>>>>>>>>>>输出>>>>>>>>>>>>>>>>>>>>>>>>>>
OutPut macro dl1
mov ah,02h
mov dl,dl1
int 21h
endm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据区
DATA SEGMENT
first db 0 ;一次做对的题数
second db 0 ;两次做对的题数
third db 0 ;三次做对的题数
NNum db 1 ;一道题的次数(最多三次)
YNum db 1 ;第几次做对题
sum dw 0
X10 DB ? ;10分题的个数 一次做对
X8 db ? ;8分题的个数 两次做对
X5 db ? ;5分题的个数 三次做对
Z DW ? ;当前做的题号
W DW ?
total db 0 ;题目总数
COUNT DW 0 ;计时器
SEC DW 0
MIN DW 0
HOURS DW 0
SAVE_LC DW 2 DUP(?)
DAT1 DB 11 DUP(-1)
DAT2 DB 20 DUP(?)
RESULT DW 20 DUP(?) ;结果
FLAG DW 0
Tital1 DB '********************************************************************$'
Tital2 DB '** Program of Add and Subtract between 0 and 40 **$'
Tital3 DB '** Designed by Chenglifeng **$'
Tital4 DB '** Computer 05-1 of shz University of Science & Technology **$'
Tital5 DB '********************************************************************$'
mess1 db 'Press Anter key to begin.....$'
mess2 db 'Input the number you want to do(1-9)?$'
mess3 DB 'Cost Time: $'
mess4 DB 'You are Right! $'
mess5 DB 'Your Marks will add 10!$' ;有问题
mess6 db 'You are Wrong!$'
mess7 DB 'The Right Answer is: $'
mess8 DB 'Your Marks in total are: $'
mess9 DB '^Q^ ^Q^ ^Q^ $'
mess10 DB 'Your Marks will add 8!$'
mess11 DB 'Your Marks will add 5!$'
mess12 DB 'Sorry! You are Not Passing! Come on!$'
mess13 DB 'Do you want to Test again? (Y/N) $'
mess14 db 'Try again,still have two chance $'
mess15 db 'Come on ,still have one chance$'
mess16 db 'Sorry!!!$'
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
;代码段
CODE SEGMENT
ASSUME CS:CODE, DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
clear 0,0,0,24,79,7 ;清全屏
clear 0,0,6,5,75,04h ;标题外为红色
;显示标题
SetGb 1,6
ShowMess Tital1
clear 0,2,10,2,70,01h ;文字为蓝色
SetGb 2,6
ShowMess Tital2
clear 0,3,10,3,70,01h
SetGb 3,6
ShowMess Tital3
clear 0,4,8,4,70,01h
SetGb 4,6
ShowMess Tital4
SetGb 5,6
ShowMess Tital5
;开始做题
clear 0,16,20,16,70,04h
SetGb 16, 23
ShowMess mess1
GetTwo: ;选择是否开始
SetGb 17,53
mov ah,08h
int 21h
cmp al,1bh
je exit00
cmp al,0dh
je begin0
jmp GetTwo
exit00:
jmp exit
begin0:
clear 0,7,12,20,66,7h ;操作区
clear 0,8,13,19,65,76h
SetGb 12,21 ;询问想要做题的数目
ShowMess mess2
GetNum:
SetGb 14,35 ;输入想要做题的数目(1-9)
mov ah,01h
int 21h
cmp al,1bh
je exit0
cmp al,31h
jb GetNum
cmp al,39h
ja GetNum
MOV DX,4000 ;时间延迟
aa1:
MOV CX,65535
bb1:
LOOP bb1
DEC DX
JNE aa1
clear 0,14,30,14,40,74h
jmp save
exit0:
jmp exit
save:
mov total,al ;保存题目数
sub total,30h
MOV X10,0 ;做对的题数
MOV X8,0
MOV X5,0
MOV Z,0
MOV DI,0
mov first,0
mov second,0
mov third,0
mov YNum,1
mov NNum,1
mov sum,0
MOV AH,35H ;将原中断保存在自设单元中
MOV AL,1CH
INT 21H
MOV SAVE_LC,BX
MOV SAVE_LC+2,ES
PUSH DS ;自设中断调用计数器
MOV DX,SEG CLINT
MOV DS,DX
MOV DX,OFFSET CLINT
MOV AL,1CH
MOV AH,25H
INT 21H
POP DS
IN AL,21H ;允许定时器中断
AND AL,11111110B
OUT 21H,AL
MOV W,1
MOV SI,1
begin: ;开始出题
MOV COUNT,0 ;计时器
MOV SEC,0 ;将时间各单元计数器,时,分,秒清0
MOV MIN,0
MOV HOURS,0
renew1:
MOV DI,W
CALL RAND ;第一个随机数
renew2:
CMP DAT1[DI],BL
JE renew1 ;比较随机数是否与原数组中数相等
DEC DI ;相等则再产生一个;不相等,则DI减1
JNE renew2 ;继续比较,不相等
JE next ;直至DI为0,将随机数存至相应单元
next:
MOV DAT1[SI],BL
MOV DX,4000 ;时间延迟
aa:
MOV CX,65535
bb:
LOOP bb
DEC DX
JNE aa
CALL RAND ;第二个随机数
MOV DAT2,BL ;放到数组DAT2中
MOV AL,DAT1[SI] ;将第一个随机数存放到AL中
CMP FLAG,0 ;比较FLAG值
JE ADD1 ;FLAG=0,执行加法
JNE SUB1 ;FLAG=1,执行减法
ADD1: ;计算两个随机数的和
ADD AL,DAT2
CBW ;AL-->AX
MOV RESULT,AX ;保存AX-->RESULT
JMP ADD2
SUB1:
CMP AL,DAT2
JB begin
SUB AL,DAT2 ;计算两个随机数的差
CBW ;AL-->AX
MOV RESULT,AX ;保存AX-->RESULT
JMP SUB2
ADD2:
MOV FLAG,1 ;FLAG置1,为减法作准备
clear 0,12,20,12,60,71h
SetGb 12,30
CALL ShowNum ;输出题目序号
MOV BL,DAT1[SI] ;第一个随即数输出
CALL BINDEC ;二进制-->十进制
OutPut '+' ;输出加号
JMP SHARE
SUB2:
MOV FLAG,0 ;FLAG置0,为加法作准备
clear 0,12,20,12,60,71h
SetGb 12,30
CALL ShowNum ;输出题目序号
MOV BL,DAT1[SI] ;第一个随即数输出
CALL BINDEC ;二进制-->十进制
OutPut '-' ;输出减号
SHARE:
MOV BL,DAT2 ;第2个随即数输出
CALL BINDEC ;二进制-->十进制
OutPut '=' ;输出等号
nexttry:
CALL DECBIN ;键盘输入十进制-->二进制
CMP RESULT,BX ;比较键盘输入和计算结果是否相等
JE TRUE
JNE WRONG1
wrong1:
jmp wrong
TRUE:
mov NNum,1
cmp YNum,1
je OneAdd
cmp YNum,2
je TwoAdd
cmp YNum,3
je ThreeAdd
OneAdd:
inc first
jmp nextto
TwoAdd:
inc second
jmp nextto
ThreeAdd:
inc third
nextto:
clear 0,14,20,14,55,74h
SetGb 14,30
ShowMess mess4 ;输出正确提示
cmp YNum,1
je add10
cmp YNum,2
je add8
cmp YNum,3
je add5
add10:
SetGb 15,30
ShowMess mess5 ;加十分
jmp jp1
add8:
SetGb 15,30
ShowMess mess10 ;加八分
jmp jp1
add5:
SetGb 15,30
ShowMess mess11 ;加五分
jmp jp1
WRONG:
cmp NNum,1
je fail1
cmp NNum,2
je fail2_1
cmp NNum,3
je fail3_1
ja nextmess1
nextmess1:
jmp nextmess
fail2_1:
jmp fail2
fail3_1:
jmp fail3
fail1:
inc NNum
inc YNum ;只能是下一次做对了
SetGb 14,22
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -