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