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

📄 2.asm

📁 包含很多有用的程序
💻 ASM
字号:

;宏定义部分
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
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

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;程序开始
DATA SEGMENT 
    X DB ?
    Y DB ?
    Z DW ?
    W DW ?
    COU DB ?
    SAVE_LC  DW 2 DUP(?)
    DAT1 DB 11 DUP(-1)
    DAT2 DB 20 DUP(?)
    RESULT DW  20 DUP(?)
    MESS0 DB 0DH,0AH, 25 DUP(?),201," XIAO  XUE  SHENG  JIA  FA  CE  SHI",187,25 DUP(?),'$'
    LENMESS0  EQU $-MESS0-1
    MESS1 DB 0DH,0AH,"please input number:",0ah,0dh,'$'
    LENMESS1  EQU $-MESS1-1
    MESS2 DB 0DH,0AH,'You are Right! $'           
    MESS3 DB 0DH,0AH,'You are Wrong!$'    
    MESS4 DB 0DH,0AH,'The Right Answer is: $' 
    MESS5 DB 0DH,0AH,'Your Marks will add 10!$'   
    MESS6 DB 0DH,0AH,'Your Marks in total are: $'
    LENMESS6 EQU $-MESS6-1    
    MESS7 DB 0DH,0AH,'Do you want to Test again? (Y/N) $' 
    LENMESS7 EQU $-MESS7-1
    
DATA ENDS
;==========================================================================================
CODE SEGMENT
 MAIN PROC FAR
    ASSUME CS:CODE,DS:DATA

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
    DISPCOLOR MESS0,LENMESS0,01H,7dh,01         
    DISPCOLOR MESS1,LENMESS1,02h,23H,01 
    CALL CRLF  
    mov ah,01
    int 21h
    sub al,30h
    mov cou, al
   CALL CRLF                          ;输入题目数       
     MOV W,1
     MOV SI,1 
begin:
   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中       
ADD1:ADD AL,DAT2                                 ;计算两个随机数的和
     CBW                                         ;AL-->AX
     MOV RESULT,AX                               ;保存AX-->RESULT
     CMP AX,200                                   ;比较结果是否>20
     JG BEGIN                                    ;大于20重新来过
JMP ADD2    
ADD2:
    
     DISPCOL 0DH,11                              ;彩显算术式子
     CALL SHOWQNUM                               ;输出题目序号      
     MOV BL,DAT1[SI]                             ;第一个随即数输出
     CALL BINDEC                                 ;二进制-->十进制
     DISP1 '+'                                   ;输出加号
     JMP SHARE  
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 BINDEC2     
JP1:
   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 BINDEC
    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 
RET
BEGIN1:JMP BEGIN
MAIN ENDP   
;******************************************************************************************
RAND  PROC
      PUSH CX
      PUSH DX
      PUSH AX
      STI    
      MOV AH,0             ;读时钟计数器值
      INT 1AH
      MOV AX,DX            ;清高6位
      AND AH,3
      MOV DL,101           ;除101,产生0~100余数
      DIV DL
      MOV BL,AH            ;余数存BX,作随机数
      POP AX
      POP DX
      POP CX
      RET
RAND  ENDP
;******************************************************************************************
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
;******************************************************************************************
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 EXIT                                     ;是否<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
EXIT: 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
;******************************************************************************************  
BINDEC1 PROC NEAR                                ;二进制-->十进制(三位数)子程序
       PUSH BX
       PUSH CX
       MOV CX,100
       CALL DECDIV                               ;调用二进制->十进制(一位数)子程序
       MOV CX,10
       CALL DECDIV
       MOV CX,1
       CALL DECDIV
       POP CX
       POP BX
RET
BINDEC1 ENDP
;******************************************************************************************
BINDEC2 PROC NEAR                                ;二进制-->十进制(三位数)子程序
       PUSH BX
       PUSH CX
       MOV CX,1000
       CALL DECDIV                               ;调用二进制->十进制(一位数)子程序
       MOV CX,100
       CALL DECDIV
       MOV CX,10
       CALL DECDIV
       MOV CX,1
       CALL DECDIV

       POP CX
       POP BX
RET
BINDEC2 ENDP
;******************************************************************************************
RETURN PROC NEAR                                 ;循环演练试题子程序
      DISPCOLOR MESS7,LENMESS7,24,02H,1
      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:
      CALL CRLF
      
RET
START1:JMP START

RETURN ENDP
;******************************************************************************************
 SHOWQNUM  PROC  NEAR
     DISP1 '('                                   ;输出左括号
    
     ADD Z,1
     MOV BX,Z                                    ;输出题目序号
     CALL BINDEC  

     DISP1 ')'                                   ;输出右括号
     DISP1 20H                                   ;输出空格
RET
SHOWQNUM  ENDP
;******************************************************************************************
CODE   ENDS
       END  START  




⌨️ 快捷键说明

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