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

📄 pcclk.asm

📁 汇编程序
💻 ASM
字号:
;FILENAME: PCCLK.ASM  
;内容: 硬件中断时间显示   8253  10MS INTERRUPT   
PAGE 	60,78
STACK 	SEGMENT PARA STACK 'STACK'
       	DB 256 DUP(0)
STACK 	ENDS
DATA  	SEGMENT PARA PUBLIC 'DATA'
COUNT 	DB 100
TENH  	DB '2'
HOUR  	DB '3:'
TENM  	DB '5'
MINUTE	DB '9'
       	DB ':'
TENS  	DB '5'
SECOND	DB '0', 0DH ,'$'
DATA  	ENDS
CODE  	SEGMENT PARA PUBLIC 'CODE'
START 	PROC FAR
       	ASSUME CS:CODE
      	PUSH DS

      	MOV AX,0
       	PUSH AX
       	MOV AH, 01H            		;等待键按下,AL=字符的ASCII码
       	INT 21H
       	CLI
       	CLD
       	MOV AX, 0000H
       	MOV DS, AX
       	MOV SI, 0020H           	;DS:SI指向08H中断向量
       	LODSW                		;取08中断入口的偏移地址
       	MOV BX,AX
       	LODSW                   	;取08中断入口段地址
       	PUSH AX               		;压栈保护
       	PUSH BX
       	MOV AX,DATA       		;建立数据段的可寻址性
       	MOV DS, AX
      	ASSUME DS:DATA
      	MOV AX, 0000H
       	MOV ES, AX
       	MOV DI, 0020H            	;ES:DS指向08中断向量存放地址
       	MOV AX,OFFSET TIMER
       	STOSW                   	;写入偏移地址
       	MOV AX,CS
       	STOSW                     	;写入段地址
       	MOV AL,00110110B       		;8253初始化,0通道,3方式,HEX
       	OUT 43H,AL
       	MOV AX,11932           		;初值=11932
       	OUT 40H, AL
       	MOV AL ,AH
       	OUT 40H, AL
       	IN AL,21H              		;读8259的中段屏蔽寄存器IMR
       	PUSH AX                 	;压栈保护
       	MOV AL, 0FCH
STI
FOREVER:      	 
	MOV DL,0FFH            		;有键按下吗?
   	MOV AH, 06H
       	INT 21H
       	JZ DISP                   	;无键按下则转显示DISP
       	CMP AL, 20H             	;是空格键吗?

      	JZ EXIT                		;是则退出
DISP: 	MOV DX, OFFSET TENH   		;不是则显示时间
       	MOV AH, 09H
       	INT 21H
       	MOV AL, SECOND         		;取秒单元值
WAITCHA:         
CMP AL,SECOND          			;改变否?
       	JZ WAITCHA               	;没变则等待
       	JMP FOREVER          		;变则转FOREVER
EXIT: 	CLI                     	;有空格键按下退出
       	CLD
       	POP AX
       	OUT 21H,AL           		;恢复IMR
       	MOV AL, 36H           		;8253初始化,55ms
       	OUT 43H,AL
       	MOV AL, 0
       	OUT 40H,AL
       	OUT 40H,AL
       	MOV AX,0          		;恢复08H中断中断向量
      	MOV ES, AX
       	MOV DI, 4*8
      	POP AX
       	STOSW
       	POP AX
       	STOSW
       	STI
       	RET
TIMER 	PROC FAR
       	PUSH AX
       	DEC COUNT
       	JNZ L2                   	;不到1秒L2
       	MOV COUNT, 100        		;到1秒,重置COUNT,并修改时间
       	INC SECOND
       	CMP SECOND,'9'
       	JLE TIMEXT
       	MOV SECOND,'0'
       	INC TENS
       	CMP TENS,'6'
       	JL TIMEXT
       	MOV TENS,'0'
       	INC MINUTE
 
      	CMP MINUTE,'9'
       	JLE TIMEXT
       	MOV MINUTE ,'0'
       	INC TENM
       	CMP TENM,'6'
       	JL TIMEXT
       	MOV TENM,'0'
       	JMP L3
L2:   	JMP TIMEXT
L3:   	MOV AL ,HOUR
       	AND AL, 0FH
       	MOV AH, TENH
       	AND AH, 0FH
       	MOV CL, 4
       	ROR AH,CL
       	OR AL,AH
       	ADD AL, 1
       	DAA
       	CMP AL, 24
       	JL L1
       	MOV TENH,'0'
       	MOV HOUR ,'0'
       	JMP TIMEXT
L1:   	MOV AH,AL
       	AND AL, 0FH
       	OR AL, 30H
       	MOV HOUR, AL
       	MOV CL,4
       	ROR AH,CL
       	AND AH, 0FH
       	OR AH, 30H
      	MOV TENH,AH
TIMEXT:          
MOV AL, 20H
      	OUT 20H, AL            		;发中断结束命令
       	POP AX
       	IRET
TIMER 	ENDP
START 	ENDP
CODE  	ENDS
       	END START

⌨️ 快捷键说明

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