例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 |