例10.16 编写一个驻留程序,它可显示当前时间的秒数。

解:
CSEG SEGMENT 'CODE'
ORG 100H
start:
JMP init
INT1C DD ?
SEC DW ?
TSR:
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH BP
PUSH DS
PUSH ES ;保存所用到的寄存器
MOV AX, CS
MOV DS, AX
MOV ES, AX ;把CS的值赋给DS和ES
MOV AH, 2H
INT 1AH ;读取当前时间
MOV DL, DH
AND DH, 0FH
MOV CL, 4
SHR DL, CL
ADD DX, 3030H
MOV SEC, DX ;把当前秒数转化成字符串
MOV  AH, 13H
MOV AL, 0
MOV BH, 0
MOV BL, 7
MOV CX, 2
MOV DX, 004EH  ;指定显示位置为(0,78)
LEA BP, SEC
INT 10H ;在指定位置显示秒数
POP ES ;恢复所用寄存器的值
POP DS
POP BP
POP DX
POP CX
POP BX
POP AX
JMP CS:INT1C ;转向中断1CH原服务程序
init:
CLI
MOV AX, 351CH
INT 21H
MOV word ptr INT1C, BX
MOV word ptr INT1C+2, ES
MOV AX, 251CH
LEA DX, TSR
INT 21H
STI
LEA DX, init
ADD DX, 15
MOV CL, 4 ;把init的偏移量转换成“节数”
SHR DX, CL ;每节内有16个字节
MOV AX, 3100H
INT 21H
CSEG ENDS
END  start

关 闭