INPUT MACRO  
MOV AH,01H 
INT 21H
ENDM
Output MACRO X  			
MOV DL,X
MOV AH,02H 
INT 21H
ENDM
Display MACRO TEMP   		
MOV DX,OFFSET TEMP
MOV AH,09H
INT 21H 
ENDM
DATA SEGMENT				
   	AA DB '+'  
  	BB DB '='
   	CC DB 5 DUP(?)
   	JJ DB 0AH,0DH,'The right answer is:$'
   	GHH DB '0',0DH,0AH,'$'
   	BUF DB 'Please input your answer:',0AH,0DH,'$'
   BUFF DB 20 DUP(?)
   TITLE1 DB 0AH,0DH,'Your answer is right.$'
   TITLE2 DB 0AH,0DH,'Your answer is wrong.$'
   TITLE3 DB 0AH,0DH,'Do you want to continue?(Y/N)$'
   TITLE4 DB 0AH,0DH,'Error,please input again.$'
   TITLE5 DB 0AH,0DH,'Your score is:$'
   STR0 DB 0AH,0DH,' *******************************$'
   STR1 DB 0AH,0DH,' ***                              ***$'
   STR2 DB 0AH,0DH,' ***     WELCOME     YOU!       ***$'
   STR3 DB 0AH,0DH,' ***                              ***$'  
   STR4 DB 0AH,0DH,' *** This is a test for the addition ***$'
   STR5 DB 0AH,0DH,'  ***      of two hexnumber         ***$'
   STR6 DB 0AH,0DH,'  ***                              ***$'
   STR7 DB 0AH,0DH,' ********************************$'
DATA ENDS
STACK SEGMENT 						
  DB 200 DUP(?)
STACK ENDS
CODE SEGMENT						
   ASSUME CS:CODE,DS:DATA,SS:STACK
START:CALL CLEAR   				
MOV AX,DATA 
MOV DS,AX
Display   STR0				
Display   STR1
Display   STR2
Display   STR3
Display   STR4
Display   STR5
Display   STR6
Display   STR7
CALL CR 						
MOV CX,0 						
Q1:   PUSH CX
MOV CX,20
MOV DX,0
MOV BX,0
CALL RAND 					
CALL MCAT 					
MOV AX,BX
PUSH AX
Output AA 					
CALL RAND 					
ADD BX,0FH
CALL MCAT					
Output BB 					
CALL CR 					
Display BUF 					
MOV CX,2					
LEA DI,BUFF					
LP: INPUT 				
CMP AL,30H 					
JB  B1
CMP AL,39H					
JA NEXT
B2: MOV [DI],AL					
INC DI
LOOP LP						
MOV CX,20
POP AX
ADD AX,BX					
CMP AX,0 						
JNE  A1
Display GHH 					
JMP QQQ  						
B1:  Display TITLE4 				
CALL CR  						
JMP LP
NEXT:CMP AL,41H 					
JB B1
CMP AL,46H 					
JA B1
JMP B2
A1: MOV BX,AX 				
Display JJ 	
CALL MCAT					
LEA DI,BUFF					
LEA SI,CC 					
MOV CH,2 						
A8: MOV CL,[DI]
CMP [SI],CL				
JNZ BBb		
INC DI
INC SI
DEC CH
CMP CH,0 			
JNZ A8
Display TITLE1				
POP CX
INC CX						
JMP QQQ 					
BBb: Display TITLE2 				
POP CX
QQQ:   Display TITLE3 			
 INPUT 						
 CMP AL,'N'					
 JE  Q4
 CMP AL,'Y'					
 JNE Q3
 CALL CR 						
 JMP Q1 						
Q3:   Display TITLE4 				
CALL CR 					
JMP QQQ 					
Q4:   Display TITLE5
MOV AL,CL					
CMP AL,0 						
JZ  Q5
MOV CH,10				
MUL CH 						
DIV CH 						
ADD AL,30H					
ADD AH,30H
MOV BL,AH 
Output AL  					
Output BL 					
JMP EXIT  					
Q5: ADD AL,30H 					
Output AL					
EXIT: MOV AH,4CH					
INT 21H
MCAT PROC							
 PUSH AX
 PUSH BX
 PUSH CX
 PUSH DX
 CMP BX,9
 JA A2
 PUSH AX
 PUSH BX
 PUSH CX
 PUSH DX
 MOV AX,BX
 MOV BL,5
 DIV BL
 CMP AH,3
 JAE A3
A3:    POP DX
 POP CX
 POP BX
 POP AX
 ADD BL,30H
 MOV CC,BL					
 MOV CC+1,'$'
 Display CC 					
 JMP A4
A2:    MOV CL,4
 MOV AL,0
 PUSH BX
 SHL BX,CL
 CMP BH,9
 JBE SS1
 SUB BH,9
 ADD BH,40H
 JMP SS2
SS1:   ADD BH,30H
SS2:   MOV CC,BH
 POP BX
 AND BL,0FH
 PUSH AX
 PUSH BX
 PUSH CX
 PUSH DX
 MOV AX,BX
 MOV BL,5
 DIV BL
 CMP AH,3
 JAE A5
A5:    POP DX
 POP CX
 POP BX
 POP AX
 CMP BL,9
 JBE SS4
 SUB BL,9
 ADD BL,40H
 JMP SS3
SS4:  ADD BL,30H
SS3:  MOV CC+1,BL					
MOV CC+2,'$'
Display CC 					
A4:   POP DX
POP CX
POP BX
POP AX 
RET
MCAT ENDP
RAND PROC 					
PUSH CX
PUSH DX
PUSH AX
STI
MOV AH,0 						
INT 1AH
MOV AX,DX
AND AH,3 						
MOV DL,101					
DIV DL
MOV BL,AH					
POP AX
POP DX
POP CX 
RET
RAND ENDP
CLEAR PROC NEAR					
 PUSH AX
 PUSH BX
 PUSH CX
 PUSH DX
 MOV AH,06H					
 MOV AL,00H
 MOV CX,0
 MOV BH,0FH
 MOV DH,18H
 MOV DL,4FH
 INT 10H
 MOV BH,0 					
 MOV DX,0
 MOV AH,02H
 INT 10H
 POP DX
 POP CX
 POP BX
 POP AX
 RET
CLEAR ENDP
CR  PROC						
  PUSH  AX					
  PUSH  DX
  MOV DL,0DH					
  MOV AH,2
  INT 21H
  MOV DL,0AH					
  INT 21H
  POP   DX					
  POP   AX
  RET							
CR   ENDP
CODE    ENDS
  END START				
