⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cxc002.asm

📁 随机产生10道互不相同的20以内的加减法(加减数及和差均<=20)待用户答完题后
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;循环不溢出测试版(成功)+彩色测试版(成功)+随机不重复测试版(成功)+系统时间测试版(成功)

;☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
;☆                                        说    明                                      ☆
;☆                       20以内的加减法 (可供幼儿园小学生练习用)                        ☆
;☆          编程设计:程相闯   专业班级:计算机02-1班    指导教师:王卫平               ☆
;☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

;宏定义部分
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
DISP MACRO M                                     ;定义宏DISP显示字符串
      LEA DX,M 
      MOV AH,09
      INT 21H
  ENDM
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISP1 MACRO N                                    ;定义宏DISP1显示1个字符
      MOV DL,N
      MOV AH,2
      INT 21H
  ENDM
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~      
DISPCOLOR MACRO STR,LEN,ROW,COLOR,CHAR           ;定义宏DISPCOLOR彩显字符串
         MOV BP,SEG STR                          ;取STR串段地址
         MOV ES,BP
         MOV BP,OFFSET STR                       ;取STR串偏移地址
         MOV CX,LEN                              ;字符串长度
         MOV DH,ROW                              ;置行属性
         MOV DL,0                                ;置列属性 
         MOV BL,COLOR                            ;置颜色属性
         MOV AL,CHAR                             ;置光标属性
         MOV AH,13H
         INT 10H 
   ENDM
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISPCOL MACRO COL,NUM                            ;定义宏DISPCOL彩显若干个字符
        MOV AH,9                        
        MOV BH,0                                 ;置显示页
        MOV BL,COL                               ;置颜色属性
        MOV CX,NUM                               ;字符显示次数
        INT 10H
   ENDM
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WIN MACRO OPR1,OPR2,OPR3,OPR4,OPR5,OPR6          ;定义宏WIN建立窗口
         MOV AH,06H                              ;功能号
         MOV AL,OPR1                             ;AL=0初始化或AL=上卷行数
         MOV BH,OPR2                             ;置卷入行属性
         MOV CH,OPR3                             ;置左上行
         MOV CL,OPR4                             ;置左上列
         MOV DH,OPR5                             ;置右上行
         MOV DL,OPR6                             ;置右上列
         INT 10H
  ENDM
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
POS_CURSE MACRO OP1,OP2,OP3                      ;定义宏POS_CURSE光标位置
         MOV AH,2
         MOV BH,OP1                              ;页号
         MOV DH,OP2                              ; 行
         MOV DL,OP3                              ; 列
         INT 10H
  ENDM
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;程序开始
DATA SEGMENT 
    X DB ?
    Y DB ?
    Z DW ?
    W DW ?
    COU DW ?

    COUNT    DW 0
    SEC      DW 0
    MIN      DW 0
    HOURS    DW 0
    SAVE_LC  DW 2 DUP(?)

    DATE DB  '2005/??/??','$'                       ;显示系统日期格式
    SYSTIME DB '??:??:??$'                          ;显示系统时间格式

    DAT1 DB 11 DUP(-1)
    DAT2 DB 20 DUP(?)
    RESULT DW  20 DUP(?)
    FLAG DW 0

    STR1  DB 0AH,0DH, '********************************************************************$'
    LENSTR1 EQU $-STR1-1
    STR2  DB 0AH,0DH, '**         Program of Add and Subtract between 0 and 20           **$'
    STR3  DB 0AH,0DH, '**     Designed by Chengxiangchuang  E_mail:cxc-0378@163.com      **$'
    STR4  DB 0AH,0DH, '**    Computer 02-1 of Anhui University of Science & Technology   **$'                     
    STR5  DB 0AH,0DH, '********************************************************************$'

    MESS1 DB 0DH,0AH,'Cost Time: $'
    MESS2 DB 0DH,0AH,'You are Right! $'
    LENMESS2 EQU $-MESS2-1
    MESS5 DB 0DH,0AH,'Your Marks will add 10!$'
    LENMESS5 EQU $-MESS5-1
    MESS3 DB 0DH,0AH,'You are Wrong!$'
    LENMESS3 EQU $-MESS3-1
    MESS4 DB 0DH,0AH,'The Right Answer is: $'
    LENMESS4 EQU $-MESS4-1
    MESS6 DB 0DH,0AH,'Your Marks in total are: $'
    LENMESS6 EQU $-MESS6-1
    MESS7 DB 0DH,0AH,'Congratulation! You are Excellent! ^Q^ ^Q^ ^Q^ $'
    LENMESS7 EQU $-MESS7-1
    MESS8 DB 0DH,0AH,'Congratulation! You are Good! ^Q^ ^Q^ $'  
    LENMESS8 EQU $-MESS8-1
    MESS9 DB 0DH,0AH,'How Lucky! You are just Passing! ^Q^ $'
    LENMESS9 EQU $-MESS9-1
    MESS10 DB 0DH,0AH,'Sorry! You are Not Passing! Come on!$'
    LENMESS10 EQU $-MESS10-1
    MESS11 DB 0DH,0AH,'Do you want to Test again? (Y/N) $' 
    LENMESS11 EQU $-MESS11-1
DATA ENDS
;==========================================================================================
STACK SEGMENT STACK
    DB  200  DUP(0)
STACK ENDS
;==========================================================================================
CODE SEGMENT
 MAIN PROC FAR
    ASSUME CS:CODE,DS:DATA,SS:STACK

START: PUSH DS
    SUB AX,AX
    PUSH AX
    MOV AX,DATA
    MOV DS,AX
    MOV ES,AX        

    MOV Y,0
    MOV Z,0
    MOV DI,0

    MOV AH,0                                     ;设置25*80 彩色文本   
    MOV AL,3
    INT 10H 

         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

      CALL SYSDATE                               ;调用系统日期
     ;CALL TIMECXC                               ;调用系统时间

      DISPCOLOR STR1,LENSTR1,0,02H,1             ;显示CXC信息
      DISPCOLOR STR2,LENSTR1,1,0CH,1
      DISPCOLOR STR3,LENSTR1,2,0CH,1
      DISPCOLOR STR4,LENSTR1,3,0CH,1
      DISPCOLOR STR5,LENSTR1,4,02H,1
      CALL CRLF
  
     MOV COU,10                                  ;题目数为10
     MOV W,1
     MOV SI,1 
BEGIN:
        MOV COUNT,0                              ;将时间各单元计数器,时,分,秒清0
        MOV SEC,0
        MOV MIN,0
        MOV HOURS,0

   RENEW1: MOV DI,W
        CALL RAND                                ;第一个随机数
   RENEW: CMP DAT1[DI],BL                        
      JE RENEW1                                  ;比较随机数是否与原数组中数相等
         DEC DI                                  ;相等则再产生一个;不相等,则DI减1
     JNE RENEW                                   ;继续比较,不相等
      JE NEXT                                    ;直至DI为0,将随机数存至相应单元

NEXT: MOV DAT1[SI],BL
     
      MOV DX,4000                                ;时间延迟
AGAIN: MOV CX,65535
  CXC: LOOP CXC 
     DEC DX
     JNE  AGAIN 

     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
     CMP AX,20                                   ;比较结果是否>20
     JG BEGIN                                    ;大于20重新来过
JMP ADD2

SUB1:SUB AL,DAT2                                 ;计算两个随机数的和
     CBW                                         ;AL-->AX
     MOV RESULT,AX                               ;保存AX-->RESULT
     CMP AX,0                                    ;比较结果是否<0
     JL BEGIN                                    ;<0重新来过
JMP SUB2

    
ADD2:MOV FLAG,1                                  ;FLAG置1,为减法作准备
    
     DISPCOL 0DH,11                              ;彩显算术式子
     CALL SHOWQNUM                               ;输出题目序号
       
     MOV BL,DAT1[SI]                             ;第一个随即数输出
     CALL BINDEC                                 ;二进制-->十进制

     DISP1 '+'                                   ;输出加号
     JMP SHARE

SUB2:MOV FLAG,0                                  ;FLAG置0,为加法作准备
     DISPCOL 0AH,11
     CALL SHOWQNUM                               ;输出题目序号
        
     MOV BL,DAT1[SI]                             ;第一个随即数输出
     CALL BINDEC                                 ;二进制-->十进制
 
     DISP1 '-'                                   ;输出减号
  
SHARE: MOV BL,DAT2                               ;第2个随即数输出
     CALL BINDEC                                 ;二进制-->十进制

     DISP1 '='                                   ;输出等号
     
     CALL DECBIN                                 ;键盘输入十进制-->二进制

     CMP RESULT,BX                               ;比较键盘输入和计算结果是否相等
     JE TRUE
     JNE WRONG

 TRUE:ADD Y,1
     DISP MESS2                                  ;输出正确提示
     DISP MESS5 
     JMP JP1

WRONG: 
     DISP MESS3                                  ;输出错误提示
     DISP MESS4  
                                                 ;显示正确答案
     MOV BX,RESULT
     CALL BINDEC
     
JP1:    
    DISP MESS1                                   ;显示每道题所用时间
    CALL DISPTIME
    CALL CRLF
    CALL CRLF
    INC W
    INC SI
    DEC COU                                      ;计数器减1,进入下一次循环
    JNE BEGIN1


    MOV X,10                                     ;计算总分
    MOV AL,Y
    MOV AH,0
    MUL X
    PUSH AX

    DISPCOLOR MESS6,LENMESS6,24,03H,1            ;输出总分提示
    POP AX                                       ;输出总分
    MOV BX,AX
    CALL VALUE                                   ;输出评语
    CALL RETURN                                  ;询问是否再作一遍试题
    CALL SYSDATE                                 ;调用系统日期
    CALL TIMECXC                                 ;调用系统时间
    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
 
RET
BEGIN1:JMP BEGIN
MAIN ENDP   
;******************************************************************************************
RAND  PROC  NEAR                                 ;产生随机数子程序
      PUSH CX
      PUSH DX
      PUSH AX
      STI                                        ;置中断允许
      MOV AH,0                                   ;读时钟计数器值           
      INT 1AH              
      MOV AX,DX           
      AND AH,3                                   ;清高6位
      MOV DL,21                                  ;除21,产生0~20余数          
      DIV DL
      MOV BL,AH                                  ;余数存BX,作随机数           
      POP AX

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -