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

📄 math.asm

📁 对小学生算术加法程序的改进 具体要求如下: 1)、输入题数 2)、随机出题 3)、立即判对错
💻 ASM
📖 第 1 页 / 共 2 页
字号:
     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 + -