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

📄 int79h.asm

📁 编写一个自定义INT 79H的中断服务程序
💻 ASM
字号:
;编写一个自定义INT 79H的中断服务程序
DATA SEGMENT
 STRING1 DB 'Do you want to writing?(y/n):','$'
 STRING2 DB '   BYEBYE!','$'
 STRING3 DB '   WRONG,PLEASE CHOOSE AGAIN.','$'
DATA ENDS

CODE SEGMENT
   ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
START:  MOV AX,DATA
        MOV DS,AX
        MOV AX,0
 
        MOV AL,79H   ;  使用dos功能调用存取中断向量
        MOV AH,35H   
        INT 21H 
        PUSH ES      
        PUSH BX
        PUSH DS
        MOV AX,SEG WORD1
        MOV DS,AX    
        MOV DX,OFFSET WORD1   
        MOV AL,79H   
        MOV AH,25H   
        INT 21H
        POP DS

        MOV CX,5H
        CALL CLEAR
LOOP1:  MOV AH,01H    ;从键盘输入一字符   
        INT 21H
        CMP AL,'Y'
        JE INQR
        MOV AH,09       ;在品红的背景下显示浅绿色的闪烁星
        MOV AL,'*'
        MOV BH,0
        MOV BL,0DAH
        MOV CX,CX
        INT 10H
        ADD CX,1
        MOV DL,0
        INC DH
        LOOP LOOP1  
INQR:                  ;中断
        INT 79H 
        
        POP DX       ;中断还原
        POP DS       
        MOV AL,79H   
        MOV AH,25H   
        INT 21H
        RET          
MAIN ENDP

WORD1 PROC NEAR     ; 实现简单的字处理程序功能
                    ;光标可以上下左右移动,可写字符,删字符
INPUT:  MOV AH,02H     ;回车,换行
        MOV DL,0DH
        INT 21H
        MOV AH,02H
        MOV DL,0AH
        INT 21H
        MOV DL,0
        MOV AH,09H    ;输出字符串string1
        LEA DX,STRING1  
        INT 21H  
        MOV AH,01H    ;从键盘输入一字符   
        INT 21H
        
        CMP AL,'N'    ;'N'与'Y'的选择
        jE NO
        JNE CMP2
CMP2:
        CMP AL,'Y'
        jE YES

        MOV AH,02H     ;回车,换行
        MOV DL,0DH
        INT 21H
        MOV AH,02H
        MOV DL,0AH
        INT 21H

        MOV AH,09H 
        LEA DX,STRING3
        INT 21H

        MOV AH,02H      ;回车,换行
        MOV DL,0DH
        INT 21H
        MOV AH,02H
        MOV DL,0AH
        INT 21H

        JMP INPUT
YES:    JMP WRITING
NO:     MOV AH,02H       ;回车,换行
        MOV DL,0DH
        INT 21H
        MOV AH,02H
        MOV DL,0AH
        INT 21H
        MOV AH,09H 
        LEA DX,STRING2
        INT 21H
        MOV AX,4C00H
        INT 21H
WRITING:
       PUSH DS
       PUSH AX
       PUSH BX
       PUSH CX
       PUSH DX
       STI
       
       CALL CLEAR    ;调用清屏子程序
       MOV AL,03H
       INT 10H 
       MOV BH,0 
       MOV DH,10 
       MOV DL,10 
       MOV AH,2 
       INT 10H       ;将光标设置在中央 

TOP:   MOV AH,0      
       INT 16H 

DOWN :CMP AH,50H     ;下
      JNZ RIGHT 
      MOV AH,3 
      MOV BH,0 
      INT 10H 
      INC DH 
      MOV AH,2 
      INT 10H 
      JMP NEXT 

RIGHT: CMP AH,4DH   ;右
      JNZ UP 
      MOV AH,3 
      MOV BH,0 
      INT 10H 
      CMP DL,79    ;判断是不是到了最后一列 
      JZ  NEXT1     ;是,跳转
      INC DL        ;不是,列号加1
      DONE:MOV AH,2 
      INT 10H 
      JMP NEXT 

NEXT1:              ;若是最后一列,则光标转道下一行的第一列
      INC DH       
      MOV DL,0 
      JMP DONE 

UP:   CMP AH,48H      ;上
      JNZ LEFT 
      MOV AH,3 
      MOV BH,0 
      INT 10H 
      CMP DH,1 
      JZ  NEXT 
      DEC DH 
      MOV AH,2 
      INT 10H 
      JMP NEXT 

LEFT: CMP AH,4BH    ;左
      JNZ ESC1 
      MOV AH,3 
      MOV BH,0 
      INT 10H 
      CMP DL,1      ;判断是不是第一列  
      JZ  NEXT2     ;是,跳转
      DEC DL        ;不是,列号减1
D:    MOV AH,2 
      INT 10H  
      JMP NEXT 

NEXT2: CMP DH,1     ;是第一列,再判断是不是第一行的第一列
       JNZ DDD      ;如果不是,转DDD 
       JMP NEXT     ;如果是,说明当前光标位于第一行,第一列,
                    ;所以光标不动,继续循环    
DDD:   DEC DH 
       MOV DL,79 
       JMP D 

ESC1:  CMP AL,1BH  ;退出
       JNZ BACK 
       JMP EXIT 

BACK:  CMP AL,08H   ;BACK键
       JNZ ENTER 
       MOV DL,AL 
       MOV AH,2 
       INT 21H 
       MOV DL,20H 
       MOV AH,2 
       INT 21H 
       MOV AH,3 
       MOV BH,0 
       INT 10H 
       DEC DL 
       MOV AH,2 
       INT 10H 
       JMP NEXT 

ENTER: CMP AL,0DH   ;ENTER键   
       JNZ DEFAULT 
       MOV AH,3 
       MOV BH,0 
       INT 10H 
       INC DH    ;若是回车键,则转道下一行(INC DH)
       MOV DL,0  ;的第一列(MOV DL,0)   
       MOV AH,2 
       INT 10H 
       JMP NEXT 

DEFAULT: MOV DL,AL  ;其它键 
         MOV AH,2 
         INT 21H 

NEXT:  JMP TOP 
         
EXIT:  MOV AH,4CH  ;ESC键退出
       INT 21H
WORD1 ENDP

CLEAR PROC NEAR
       PUSH AX
       PUSH BX
       PUSH CX
       PUSH DX

       MOV AX,0600H ;ah=06(滚动)al=00(全屏空白)
       MOV BH,0FH   ;黑色背景(0) 白色前景(f) 
       SUB CX,CX    ;左上角行:列 
       MOV DX,184FH ;右下角行:列 
       INT 10H

       POP DX
       POP CX
       POP BX
       POP AX
       RET
CLEAR ENDP
CODE ENDS
     END START

   

⌨️ 快捷键说明

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