管理员
|
楼主#
更多
发布于:2012-09-10 18:55
| | | | 驻留程序TSR(Terminate but Stay Resident)是一种特殊应用程序,它在装入 内存运行后,其部分代码仍然驻留在内存,当该段代码被激活时,它又进入运行状态。常用的驻留程序是作为某个中断处理程序的一部分,其激活条件就是系统产生了此中断的中断请求。 虽然驻留程序可根据具体的需要有不同的编写方式,但其典型结构包括以下几部分: 1、保存、修改中断向量表; 2、程序第一次运行时的初始化部分: ◆用自己定义的地址来取代中断向量表中的原地址 ◆确定驻留代码部分的字节数 ◆用中断21H之功能31H把需要驻留代码部分驻留在内存 3、驻留内存的代码部分。 例10.15 在NumLock处于“开状态”时,每按小键盘(Numeric Keypad)上的数字键,给出“啪啪”响声。 解: CSEGSEGMENT ’CODE’ ORG 100H start: JMPinit INT9DD ? TSR: PUSHAX PUSHCX PUSHDS;保存寄存器 MOVAH, 2 INT16H;读取键盘当前状态 TESTAL, 00100000B;检测NumLock的状态 JZTSRExit INAL, 60H CMPAL, 71 JLTSRExit CMPAL, 83 JGTSRExit MOVAL, 10110110B OUT43H, AL;向端口43H送特定的数0B6H MOVAX, 1000 OUT42H, AL MOVAL, AH OUT42H, AL;向端口42H送声音频率 INAL, 61H;读取扬声器的当前状态 MOVAH, AL;把扬声器的状态保存在AH中 ORAL, 03 OUT61H, AL;开声音 MOVCX, 9000 delay: LOOPdelay;声音延迟 MOVAL, AH OUT61H, AL;恢复扬声器原来的状态,即关声音 TSRExit: POPDS POPCX POPAX ;恢复寄存器 JMPCS:INT9;转向中断9H原来的处理程序 init: CLI;关中断 MOVAH, 35H MOVAL, 09H INT21H MOV word PTR INT9, BX MOV word PTR INT9+2, ES;保存中断9H原处理程序入口地址 MOV AH, 25H MOVAL, 09H LEADX, TSR INT21H;设置中断9H新的处理程序入口地址 STI;开中断 LEADX, init ADDDX, 15 MOVCL, 4;把init的偏移量转换成“节数” SHRDX, CL;每节内有16个字节 MOVAX, 3100H INT21H CSEGENDS ENDstart 例10.16 编写一个驻留程序,它可显示当前时间的秒数。 解: CSEG SEGMENT ’CODE’ ORG100H start: JMPinit INT1CDD ? SECDW ? TSR: PUSHAX PUSHBX PUSH CX PUSH DX PUSH BP PUSH DS PUSH ES;保存所用到的寄存器 MOVAX, CS MOVDS, AX MOV ES, AX;把CS的值赋给DS和ES MOV AH, 2H INT1AH;读取当前时间 MOV DL, DH AND DH, 0FH MOVCL, 4 SHR DL, CL ADD DX, 3030H MOV SEC, DX;把当前秒数转化成字符串 MOV AH, 13H MOV AL, 0 MOVBH, 0 MOV BL, 7 MOVCX, 2 MOVDX, 004EH ;指定显示位置为(0,78) LEA BP, SEC INT 10H;在指定位置显示秒数 POPES;恢复所用寄存器的值 POP DS POP BP POPDX POPCX POPBX POPAX JMPCS:INT1C;转向中断1CH原服务程序 init: CLI MOVAX, 351CH INT 21H MOV word ptr INT1C, BX MOV word ptr INT1C+2, ES MOV AX, 251CH LEADX, TSR INT 21H STI LEA DX, init ADDDX, 15 MOVCL, 4;把init的偏移量转换成“节数” SHRDX, CL;每节内有16个字节 MOVAX, 3100H INT 21H CSEG ENDS END start
| | | | |
|