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

📄 math.asm

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

;宏定义
;>>>>>>>>>>>>清屏>>>>>>>>>>>>>>>>>
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 + -