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 将功能号03送入AH 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 ; 跳转到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 ; 将BH寄存器清零
MOV AH,3 ; 功能号3表示读取光标位置
INT 10H ; 调用BIOS中断,读取光标位置
MOV CS:OLDCUR,DX ; 将光标位置保存到OLDCUR变量中
MOV AH,2 ; 功能号2表示设置光标位置
xor bh,bh ; 设置页号为0
MOV DX,CURSOR ; 设置光标位置为45H
INT 10H ; 调用BIOS中断,设置光标位置
MOV AH,2 ; 功能号2表示读取系统时钟
INT 1AH ; 调用BIOS中断,读取系统时钟
PUSH DX ; 保存DX寄存器
PUSH CX ; 保存CX寄存器
POP BX ; 弹出BX寄存器
PUSH BX ; 将BX寄存器入栈
CALL SHOWBYTE ; 调用显示字节函数,显示小时
CALL SHOWCOLON ; 调用显示冒号函数,显示冒号
POP BX ; 弹出BX寄存器
XCHG BH,BL ; 交换BH和BL寄存器的值
CALL SHOWBYTE ; 调用显示字节函数,显示分钟
CALL SHOWCOLON ; 调用显示冒号函数,显示冒号
POP BX ; 弹出BX寄存器
CALL SHOWBYTE ; 调用显示字节函数,显示秒钟
MOV DX,CS:OLDCUR ; 将光标位置还原为原来的位置
MOV AH,2
XOR BH,BH ; 设置页号为0
INT 10H ; 调用BIOS中断,设置光标位置
POP DX ; 弹出DX寄存器
POP CX ; 弹出CX寄存器
POP BX ; 弹出BX寄存器
POP AX ; 弹出AX寄存器
IRET ; 返回中断
SHOWBYTE PROC NEAR ;