這篇博文介紹一個簡單的TSR程式設計的例子。
一、TSR是什麼
TSR是記憶體駐留程式(Terminate and Stay Resident Program)的簡稱。記憶體駐留程式是指這樣
一種程式,TA在執行結束後,將一部分留在記憶體中,受到作業系統的保護,可由外界啟用。一
般來說,TSR都會和DOS或BIOS中斷相聯絡。
二、本篇博文介紹的TSR的設計思路是什麼
設計的功能:當運行TSR後,使用者無論輸入什麼,螢幕上只會顯示“A TSR was installed in the
computer by lulipeng!”。(輸入控制字元沒有效果,如shift、ctrl,因為其不在鍵盤
緩衝區)
設計的方法:①將16h號中斷的地址改為自己編寫的程式的地址,保留原中斷地址,以便根據需
要調用。
②DOS功能調用int 16h,a=10h是從鍵盤緩衝區讀取字元,al=讀取字元的ASCII。
只要將相應的al改為自己預先設計好的按一定順序輸出的字元即可。
③為什麼②中的方法可行,博主猜測,當在command.com中輸入字元時,該程式
會調用int 16h的10h號功能讀取字元的ASCII,然後輸出。我們只要中途截獲al,
改變其即可。
三、值得注意的地方
代碼是在win7旗艦版下command.com中實驗成功。在cmd.exe中沒有效果!
很遺憾我也不明白其中原委?
四、代碼
code segmentassume cs:codeoldInt16 dw ?,?msgIndex dw 0msg db 'A TSR was installed in the computer by lulipeng!'newInt16 proc far;cmp ah,0;je leavecmp ah,10hje go_1jmp dword ptr oldInt16 ;如果不是讀鍵盤輸入,則調用原來int 16h,然後直接返回go_1:pushfcall dword ptr oldInt16 ;調用原int 16h,把字元讀進al中cmp al,0dhje go_2 ;如果是斷行符號,表示本次輸入結束,斷行符號符不做處理push simov si,msgIndexmov al,msg[si] ;將原來的字元改為程式員規定的字元inc sicmp si,48je go_3back:mov msgIndex,sipop sijmp donego_3:mov si,0jmp backgo_2:mov msgIndex,0done:iretnewInt16 endpstart:;用int 21h,ah=35h,al=16h取出16h號中斷的地址,存在es:bx中mov al,16hmov ah,35hint 21hmov oldInt16,bxmov oldInt16[2],es;利用int 21h,ah=25h,al=16h,把ds:dx中地址寫給16h號中斷push cspop dsmov dx,offset newInt16mov al,16hmov ah,25hint 21h;將start標號前的內容駐留記憶體mov dx,offset startint 27hmov ah,4chint 21hcode endsend start
五、結果