www.pudn.com > int79h.rar > INT79H.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