系统时间显示
CURSOR EQU 45H
ATTRIB EQU 2FH
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
START: JMP GO
OLDCUR DW ?
OLD1C DW 2 DUP(?)
NEWINT1C:
PUSHF
CALL DWORD PTR CS:OLD1C
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR BH,BH
MOV AH,3 ;读光标位置
INT 10H ;显示器驱动程序
MOV CS:OLDCUR,DX
MOV AH,2 ;设置光标位置
XOR BH,BH
MOV DX,CURSOR ; 自定义CURAOR光标位置给DX,即第00行,第69列(45H)
INT 10H ;显示器驱动程序
MOV AH,2 ;读CMOS时钟,即系统时钟CH=小时,CL=分,DH=秒(都为BCD数)
INT 1AH ;时钟驱动程序
PUSH DX
PUSH CX ;将CX小时寄存器给BX,CX备用
POP BX ;CX-->BX
PUSH BX ;保护BX
CALL SHOWBYTE ;调用显示时间数字的子程序
CALL SHOWCOLON ;调用显示":"的子程序入口参数AL
POP BX
XCHG BH,BL ;交换BH BL为的是显示分
CALL SHOWBYTE
CALL SHOWCOLON
POP BX ;把DX给BX,现在开始显示秒
CALL SHOWBYTE ;调用显示时间数字的子程序
MOV DX,CS:OLDCUR ;调用光标的地址
MOV AH,02H ;10号功能AH=2是设置光标位置
XOR BH,BH ;BH清0,为图形方式
INT 10H ;10号功能调用
POP DX
POP CX
POP BX
POP AX
IRET
SHOWBYTE PROC NEAR ;显示时间数字子程序入口参数BH
PUSH BX
MOV CL,04H
MOV AL,BH ;先将小时的十位给AL,比如12点,这个是转变1的
SHR AL,CL ;将小时的数转化为ASCII码
ADD AL,30H
CALL SHOW ;调用显示子程序
CALL CURMOVE ;移动光标
POP BX ;再将小时的个位给AL,比如12点,这个是转变2 的
MOV AL,BH
AND AL,0FH
ADD AL,30H
CALL SHOW ;调用显示子程序
CALL CURMOVE ;调用移动光标子程序
RET
SHOWBYTE ENDP
SHOWCOLON PROC NEAR ;显示时间中的":"
MOV AL,':'
CALL SHOW
CALL CURMOVE
RET
SHOWCOLON ENDP
CURMOVE PROC NEAR ;移动光标子程序,就好像在DOS中,按空格,光标后移一个 位置
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,3 ;读光标位置
MOV BH,0 ;BH为显示页号BH=0是图形方式
INT 10H ;10H号功能是显示器驱动程序
INC DL ;DH,DL=行,列值
MOV AH,2 ;设置光标位置
INT 10H
POP DX
POP CX
POP BX
POP AX
RET
CURMOVE ENDP
SHOW PROC NEAR ;这个子程序功能是在显示器上显示数字
PUSH AX
PUSH BX
PUSH CX
MOV AH,09H ;在当前光标处写字符的代码和属性
MOV BX,ATTRIB ;BH=00显示页号,BL=2F欲写字符的属性
MOV CX,1 ;字符计数
INT 10H
POP CX
POP BX
POP AX
RET
SHOW ENDP
GO: PUSH CS
POP DS
MOV AX,351CH ;AH=35H 取中断向量AL=1CH为中断向量号,该中断被INT 8H(即8253/8254计数器)中断调用,每秒执行18.2次
INT 21H ; 中断返回参数ES:BX
MOV OLD1C,BX
MOV BX,ES
MOV OLD1C+2,BX
MOV DX,OFFSET NEWINT1C;中断程序入口地址
MOV AX,251CH ;AH=25H设置中断向量,AL=1CH为中断向量号
INT 21H
MOV DX,OFFSET GO ;常驻内存程序的长度
SUB DX,OFFSET START
MOV CL,4
SHR DX,CL
ADD DX,11H
MOV AX,3100H ;AH=31H程序常驻内存
INT 21H
CODE ENDS
END START
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
啥意思?没有明白你的问题啊
一周热门 更多>