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

📄 typer.asm

📁 一个在键盘上练习打字并能统计时间的程序。 熟悉和掌握有关键盘和时间的中断及字符显示技术。
💻 ASM
字号:
;FILENAME: 
;内容:打字计时练习程序
STACK	SEGMENT PARA STACK 'STACK'
       	DB  256  DUP(0)
TOP   	LABEL WORD
STACK 	ENDS
DATA  	SEGMENT  PARA PUBLIC 'DATA'
BUFFER	DB 16H DUP(0)
BUFPT1	DW 0
BUFPT2	DW 0
KBFLAG	DB  0
PROMPT	DB '   *PLEASE PRACTISE TYPING*',0DH,0AH,'$'
SCANTAB  DB 0,0,'1234567890-=',8,0
     	DB 'QWERTYUIOP[]',0DH,0
     	DB 'ASDFGHJKL;',0,0,0,0
     	DB 'ZXCVBNM,./',0,0,0
      	DB ' ',0,0,0,0,0,0,0,0,0,0,0,0,0
      	DB '789-456+1230.'
EVEN
OLDCS9	DW ?
OLDIP9	DW ?
STR1 	DB 'abcd efgh ijkl mnop qrst uvwx yz.'
      	DB 0DH,0AH,'$'
STR2 	DB 'there are some newspapers on the table.'
      	DB 0DH,0AH,'$'
STR3  	DB 'there are some clouds in the sky.'
      	DB 0DH,0AH,'$'
STR4  	DB 'she always eats her lunch at noon.'
      	DB 0DH,0AH,'$'
STR5 	DB 'i do not like autumn and winter.'
CRLF  	DB 0DH,0AH,'$'
COLON 	DB ':','$'
EVEN
SADDR 	DW STR1,STR2,STR3,STR4,STR5
COUNT 	DW 0
SEC    	DW 0
MIN   	DW 0
HOURS 	DW 0
SAVE_LC  DW 2 DUP(?)
DATA  	ENDS
CODE  	SEGMENT
  		ASSUME   CS:CODE,DS:DATA,ES:DATA,SS:STACK
MAIN 	PROC FAR
START:
MOV AX,STACK
      	MOV SS,AX
    	MOV SP,OFFSET TOP

    	PUSH DS
   		SUB AX,AX
       	PUSH AX
      	MOV AX,DATA
      	MOV DS,AX
      	MOV ES,AX

      	MOV AH,35H
      	MOV AL,09H
      	INT 21H
      	MOV OLDCS9,ES
      	MOV OLDIP9,BX

      	PUSH DS
      	MOV DX,SEG KBINT
      	MOV DS,DX
      	MOV DX,OFFSET KBINT
      	MOV AL,09H        
      	MOV AH,25H
      	INT 21H
      	POP DS

      	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,11111100B
       	OUT 21H,AL
         
FIRST:	MOV AH,0
       	MOV AL,3
       	INT 10H

      	MOV DX,OFFSET PROMPT
      	MOV AH,9
      	INT 21H

      	MOV SI,0
NEXT: 	MOV DX,SADDR[SI]
      	MOV AH,09H
       	INT 21H

      	MOV COUNT,0
     	MOV SEC,0
      	MOV MIN,0
      	MOV HOURS,0

      	STI
FOREVER:
     	CALL KBGET
      	TEST KBFLAG,80H
     	JNZ  ENDINT
       	PUSH AX
       	CALL DISPCHAR
      	POP  AX
      	CMP AL,0DH
       	JNZ FOREVER
     	MOV AL,0AH
      	CALL DISPCHAR

      	CALL DISPTIME
      	LEA DX,CRLF
      	MOV AH,09H
      	INT 21H

      	ADD SI,2
     	CMP SI,5*2
      	JNE NEXT
      	JMP FIRST
ENDINT:  
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

      	PUSH DS
      	MOV DX,OLDIP9
      	MOV AX,OLDCS9
      	MOV DS,AX
      	MOV AL,09H
       	MOV AH,25H
      	INT 21H
      	POP DS

      	STI
       	RET
MAIN  	ENDP
CLINT 	PROC NEAR
      	PUSH DS
      	MOV BX,DATA
      	MOV DS,BX

     	LEA BX,COUNT
      	INC WORD PTR[BX]
       	CMP WORD PTR[BX],18
      	JNE RETURN
      	CALL INCT
ADJ:
      	CMP HOURS,12
       	JLE RETURN
       	SUB HOURS,12
RETURN:
      	POP DS
       	STI
      	IRET
CLINT 	ENDP
INCT  	PROC NEAR
      	MOV WORD PTR[BX],0
      	ADD BX,2
     	INC WORD PTR[BX]
      	CMP WORD PTR[BX],60
      	JNE EXIT
      	CALL INCT
EXIT: 	RET
INCT  	ENDP
DISPTIME PROC NEAR
      	MOV AX,MIN
      	CALL BINDEC

      	MOV BX,0
      	MOV AL,':'
     	MOV AH,0EH
     	INT 10H
      	MOV AX,SEC
     	CALL BINDEC

      	MOV BX,0
      	MOV AL,':'
      	MOV AH,0EH
     	INT 10H

      	MOV BX,COUNT
      	MOV AL,55D
      	MUL BL
       	CALL BINDEC

       	RET
DISPTIME      ENDP
BINDEC	PROC NEAR
      	MOV CX,100D
     	CALL DECDIV
      	MOV CX,10D
      	CALL DECDIV
     	MOV CX,1
      	CALL DECDIV
       	RET
BINDEC	ENDP
DECDIV   PROC NEAR
     	MOV DX,0
       	DIV CX

      	MOV BX,0
      	ADD AL,30H
      	MOV AH,0EH
      	INT 10H

      	MOV AX,DX
     	RET
DECDIV   ENDP
KBGET	PROC NEAR
     	PUSH BX
     	CLI
      	MOV BX,BUFPT1
      	CMP BX,BUFPT2
       	JNZ KBGET2
      	CMP KBFLAG,0
      	JNZ KBGET3
      	STI
      	POP BX
      	JMP KBGET
KBGET2:
       	MOV AL,[BUFFER+BX]
       	INC BX
       	CMP BX,16H
       	JC KBGET3
      	MOV BX,0
KBGET3:
       	MOV BUFPT1,BX
       	POP BX
       	RET
KBGET 	ENDP
KBINT 	PROC NEAR
      	PUSH BX
      	PUSH AX

      	IN AL,60H
     	PUSH AX
      	IN AL,61H
      	OR AL,80H
       	OUT 61H,AL
       	AND AL,7FH
      	OUT 61H,AL

      	POP AX
      	TEST AL,80H
      	JNZ  KBINT2
       	MOV BX,OFFSET SCANTAB
      	XLAT SCANTAB
      	CMP AL,0
       	JNZ KBINT4
       	MOV KBFLAG,80H
      	JMP KBINT2
KBINT4:
      	MOV BX,BUFPT2
      	MOV [BUFFER+BX],AL
      	INC BX
       	CMP BX,16H
       	JC KBINT3
       	MOV BX,0
KBINT3:
      	CMP BX,BUFPT1
      	JZ KBINT2
       	MOV BUFPT2,BX
KBINT2:  CLI
      	MOV AL,20H
       	OUT 20H,AL
       	POP AX
      	POP BX
       	STI
       	IRET
KBINT 	ENDP
DISPCHAR PROC NEAR
      	PUSH BX
      	MOV BX,0
      	MOV AH,0EH
      	INT 10H
       	POP BX
      	RET
DISPCHAR ENDP
CODE  	ENDS
       	END   START

⌨️ 快捷键说明

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