汇编语言显示时钟程序

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
INT 10H
MOV AH,2;读取系统时钟
INT 1AH
PUSH DX
PUSH CX
POP BX
PUSH BX
CALL SHOWBYTE
CALL SHOWCOLON
POP BX
XCHG BH,BL
CALL SHOWBYTE
CALL SHOWCOLON
POP BX
CALL SHOWBYTE
MOV DX,CS:OLDCUR
MOV AH,2
XOR BH,BH
INT 10H
POP DX
POP CX
POP BX
POP AX
IRET
SHOWBYTE PROC NEAR
PUSH BX
MOV CL,4
MOV AL,BH
SHR AL,CL
ADD AL,30H
CALL SHOW
CALL CURMOVE
POP BX
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
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,3
MOV BH,0
INT 10H
INC 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
MOV CX,1
INT 10H
POP CX
POP BX
POP AX
RET
SHOW ENDP

GO:
PUSH CS
POP DS
MOV AX,351CH ;取中断向量
INT 21H
MOV OLD1C,BX; 保存原中断向量
MOV BX,ES
MOV OLD1C+2,BX
MOV DX,OFFSET NEWINT1C; 置新的中断向量
MOV AX,251CH
INT 21H
MOV DX,OFFSET GO
SUB DX,OFFSET START
MOV CL,4
SHR DX,CL
ADD DX,11H
MOV AX,3100H; 结束并驻留
INT 21H
CODE ENDS
END START
-----------------------------------------------------------------------------------

cursor equ 45H ;定义显示位置
attrib equ 2fh ;定义时钟显示颜色,绿底白字
code segment
assume cs:code,ds:code
start:
jmp go ;转到程序预处理,设置中断并驻留
oldcur dw ? ;用于保存原来光标位置
OLD1C DW 2 DUP(?) ;用于保存原来的 int 1c 入口地址
NEWINT1C: ;新的 int 1c 入口
PUSHF ;标志压栈
CALL DWORD PTR CS:OLD1C ;调用原来的 int 1c 中断
push ax
PUSH BX
PUSH CX
PUSH DX
XOR BH,BH
MOV AH,3
INT 10H ;int10 子功能 03 取当前光标位置
MOV CS:OLDCUR,DX ;当前光标位置存入CS:OLDCUR
MOV AH,2
xor bh,bh
MOV DX,CURSOR ;DX=CURSOR=45h,表示光标定位在1 行70 列
INT 10H ;int10 子功能 02 设置光标位置
MOV AH,2
INT 1AH ;INT 1AH 子功能 02 读取系统时钟,返回CH/CL/DH=BCD码小时/BCD码分钟/BCD码秒
PUSH DX
PUSH CX
POP BX ;小时分钟数给BX
PUSH BX
CALL SHOWBYTE ;调用子程序显示小时,小时在bh中
CALL SHOWCOLON ;调用子程序显示时间分隔符 ":"
POP BX
XCHG BH,BL ;分钟给bh
CALL SHOWBYTE ;调用子程序显示分钟,bh是分钟数
CALL SHOWCOLON ;调用子程序显示时间分隔符 ":"
POP BX ;秒数给bh
CALL SHOWBYTE ;调用子程序显示秒数
MOV DX,CS:OLDCUR ;读取备份的光标位置
MOV AH,2
XOR BH,BH
INT 10H ;int10 子功能 02

还原原来的光标位置
POP DX
POP CX
POP BX
POP AX
IRET ;中断返回

SHOWBYTE PROC NEAR ;BCD值显示子程序,BCD值在BH中
PUSH BX ;压栈BX值,以防冲掉
MOV CL,4 ;以下代码BH中BCD十位值转ASCLL码
MOV AL,BH
SHR AL,CL
ADD AL,30H
CALL SHOW ;调用子程序显示AL,当前AL为时间值十位上的数值
CALL CURMOVE ;调用子程序后移光标
POP BX ;还原BX值
MOV AL,BH ;以下代码BH中BCD个位值转ASCLL码
AND AL,0FH
ADD AL,30H
CALL SHOW ;调用子程序显示AL,当前AL为时间值个位上的数值
CALL CURMOVE ;调用子程序后移光标
RET
SHOWBYTE ENDP

SHOWCOLON PROC NEAR ;显示字符 ":" 子程序,用于时间分隔符
MOV AL,':'
CALL SHOW ;调用子程序显示":"
CALL CURMOVE ;调用子程序后移光标
RET
SHOWCOLON ENDP

CURMOVE PROC NEAR ;光标后移子程序
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,3
MOV BH,0
INT 10H ;取光标位置
INC DL ;光标列位置加1
MOV AH,2
INT 10H ;设光标位置
POP DX
POP CX
POP BX
POP AX
RET
CURMOVE ENDP

SHOW PROC NEAR ;显示一个ASCLL字符子程序,AL为所显字符
PUSH AX
PUSH BX
PUSH CX
MOV AH,09H
MOV BX,attrib ;BH/BL=字符背景色/字符颜色 ,attrib=2fh=绿底白字
MOV CX,1 ;显示个数 1
INT 10H ;int 10 子功能 09 显示一个字符
POP CX
POP BX
POP AX
RET
SHOW ENDP

GO:
PUSH CS
POP DS
MOV AX,351CH ;取时钟中断 int 1c中断原入口
INT 21H
MOV OLD1C,BX ;保存原中断向量
MOV BX,ES
MOV OLD1C+2,BX
MOV DX,OFFSET NEWINT1C ;设置新的时钟中断 int 1c 入口
MOV AX,251CH
INT 21H
MOV DX,OFFSET GO
SUB DX,OFFSET START ;计算驻留内存字节数
MOV CL,4
SHR DX,CL ;驻留内存值转换为节
ADD DX,11H ;内存数加psp 11节
MOV AX,3100H ;结束并驻留
INT 21H
CODE ENDS
END START

相关文档
最新文档