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

📄 typer.asm

📁 老师布置的一道需要8H中断的一道汇编题
💻 ASM
字号:
DSEG	  SEGMENT

DSEG    ENDS
	
CSEG	  SEGMENT
        ASSUME	CS:CSEG,DS:CSEG
MESS    DB 'Continue? y/n$'
MESS1   DB 'TIME:$'        
FNAME   DB 'TEST.TXT',0
MESS0   DB 'FILE NOT FOUND$'
FBUFF   DB ?
BUFF    DB 128 DUP(0)
COUNT   DW 0
MIN     DB 0
SEC     DB 0
MSEC    DW 0	  
INCTIME:CLI
        PUSH DS
        PUSH AX
        PUSH BX
	      PUSH CX
	      PUSH DX
	      PUSH SI
	      PUSH DI
	      PUSH BP
	      PUSH SP        ;PROTECT
	      PUSH CS
	      POP DS
	      PUSH DS
	      POP ES
	            
        
        MOV  AX,55
	      ADD  MSEC,AX
	      CMP  MSEC,1000
	      JAE  INCSEC
	      JMP  INTEND
INCSEC: MOV  MSEC,0
        INC  SEC
        CMP  SEC,60
        JE   INCMIN
        JMP  INTEND
INCMIN: MOV  SEC,0
        INC  MIN

INTEND: POP  SP
        POP  BP
        POP  DI
        POP  SI
        POP  DX
        POP  CX
        POP  BX
        POP  AX
        POP  DS
        STI
        IRET
;-------------------
;-------------------
SHOW PROC
;IN:AL
;OUT:NULL
           
       MOV   CX,2
	     MOV   DL,10
DISP1: DIV   DL
       XCHG  AH,AL
	     ADD   AL,'0'
	     PUSH  AX
	     XCHG  AH,AL
	     MOV   AH,0
	     LOOP  DISP1
	     MOV   CX,2
DISP2: POP   DX
       MOV   AH,2
	     INT   21H
	     LOOP  DISP2
	     
	     RET
SHOW    ENDP
;-----------------
SHOWSIGN  PROC FAR
;SHOW':'
        PUSH AX
        PUSH DX
        MOV  DL,':'
        MOV  AH,2
        INT  21H
        POP  DX
        POP  AX
        RET
SHOWSIGN  ENDP
;------------------
SHOWTIME   PROC
        CALL NEWLINE
        MOV  DX,OFFSET MESS1
        CALL DISPMESS
        MOV  AL,MIN
        XOR  AH,AH
        CALL SHOW
        CALL SHOWSIGN
        
        MOV  AL,SEC
        XOR  AH,AH
        CALL SHOW
        CALL SHOWSIGN
        
        MOV  AX,MSEC
        MOV  BL,10
        DIV  BL
        XOR  AH,AH
        CALL SHOW
        RET
SHOWTIME   ENDP 
;-------------------         
NEWLINE      PROC
;IN:NULL
        PUSH AX
        PUSH DX
	      MOV   DL,0DH
	      MOV   AH,2
	      INT   21H
	      MOV   DL,0AH
	      MOV   AH,2
	      INT   21H
	      POP DX
	      POP DX
	      RET
NEWLINE   ENDP
;--------------------
DISPMESS     PROC
;IN:DX
        PUSH AX
        MOV   AH,9
	      INT   21H
	      POP AX
	      RET
DISPMESS     ENDP
;------------------
READCH    PROC
;IN:NULL
;OUT:AL 
        PUSH CX
        PUSH DX                   
        MOV CX,1
        MOV DX,OFFSET FBUFF
        MOV AH,3FH
        INT 21H
        JC  READCH1
        CMP AX,CX
        MOV AL,1AH
        JB  READCH1
        MOV AL,FBUFF
READCH1:POP DX
        POP CX
        RET
READCH   ENDP
;--------------------- 
STOBUFF  PROC
;IN:SI,AL
       PUSH DX
       
       MOV  DL,AL
       MOV  AH,2
       INT  21H
       
       MOV  BYTE PTR [SI],AL
       INC  COUNT
       INC  SI
       
       POP  DX
       RET
       
STOBUFF  ENDP
;-------------------                    
CHECK   PROC
;IN:SI, 
        PUSH AX
        PUSH BX
        PUSH DX 
        
        MOV SI,OFFSET BUFF
        MOV CX,0    
NEXTCHEC:MOV BL,BYTE PTR [SI]
        IN AL,21H	      
	      AND AL,11111110B
	      OUT 21H,AL                ;OPEN INT
	      STI
NEXTCH: MOV AH,1
        INT 16H
        JZ  NEXTCH
        MOV AH,0
        INT 16H 
        CMP AL,1BH
        JE  OVER1
        CMP AL,1fH
        JB NEXTCH 
        
        CMP AL,BL                ;判断是否正确       
        PUSH BX
        PUSH CX
        PUSH DX   ;PROTECT
        JE  RIGHT
             
WRONG:  MOV BH,0
        MOV BL,47H
        MOV CX,1
        
        MOV AH,9
        INT 10H 
        
RIGHT:  MOV DL,AL
        MOV AH,2
        INT 21H
        POP DX
        POP CX  
        POP BX 
        
        
        INC CX
        INC SI
        CMP CX,COUNT
        JAE  DISPTIME
        
        
        JMP NEXTCHEC
        
DISPTIME:CLI
	      IN AL,21H
	      OR AL,00000001B
	      OUT 21H,AL               ;CLOSE INT	
	      CALL SHOWTIME
	      MOV MIN,0
	      MOV SEC,0
	      MOV MSEC,0
         MOV COUNT,0
         POP DX 
         POP BX
         POP AX       
        RET
               
CHECK   ENDP         

;-------------------     
START:	PUSH CS
        POP DS
	      	      
        MOV DX,OFFSET INCTIME      
	      MOV AX,251CH
	      INT 21H	      
	      CLI
	      IN AL,21H
	      OR AL,00000001B
	      OUT 21H,AL               ;CLOSE INT	
        MOV DX,OFFSET FNAME          ;FILE
        MOV AX,3D00H
        INT 21H
                       
        JNC OPEN_OK
        MOV DX,OFFSET MESS0
        CALL DISPMESS
        JMP OVER
        
OPEN_OK:MOV BX,AX
NLINE:  MOV SI,OFFSET BUFF
STO_NEXT:
        CALL READCH
        CMP  AL,1AH
        JZ   LASTCHECK
        CMP  AL,0DH
        JZ   NEXTLINE
        CALL STOBUFF
        JMP  STO_NEXT
NEXTLINE: CALL READCH    ;读取换行符
          CMP AL,1AH
          JZ  OVER
          
          CALL NEWLINE
          MOV SI,OFFSET BUFF
          CALL CHECK
          CALL NEWLINE
          JMP NLINE       
LASTCHECK:
          CALL NEWLINE
          MOV SI,OFFSET BUFF
          CALL CHECK

                                                                                  
OVER:   call newline
        MOV   DX,OFFSET MESS
	      CALL  DISPMESS
	      CALL  NEWLINE
	   
NEXTIN: MOV   AH,8
	      INT   21H                   ;CONTINUE???	   
	      CMP   AL,'Y'	   
	      JE    START             
	      CMP   AL,'y'	   
	      JE    START
	      CMP   AL,0dh	   
	      JE    START
	      CMP   AL,'N'
	      JE    OVER1
	      CMP   AL,'n'
	      JE    OVER1
	      JMP   NEXTIN
over1:  MOV AH,3EH
        INT 21H
        
        MOV AH,4CH
        INT 21H
        	      
CSEG    ENDS
	      END	 START
	

⌨️ 快捷键说明

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