您的位置:首页 > 其它

第八篇 TSR程序设计初探

2012-11-30 00:36 225 查看
这篇博文介绍一个简单的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 segment
	assume cs:code

	oldInt16 dw ?,?
	msgIndex dw 0
	msg 	 db 'A TSR was installed in the computer by lulipeng!'

newInt16 proc far
	;cmp ah,0
	;je leave

	cmp ah,10h
	je go_1

	jmp dword ptr oldInt16   ;如果不是读键盘输入,则调用原来int 16h,然后直接返回

go_1:
	pushf
	call dword ptr oldInt16   ;调用原int 16h,把字符读进al中

	cmp al,0dh
	je go_2                   ;如果是回车,表示本次输入结束,回车符不做处理
	
	push si
	mov si,msgIndex
	mov al,msg[si]            ;将原来的字符改为程序员规定的字符
	inc si
	cmp si,48
	je go_3
back:
	mov msgIndex,si
	pop si
	jmp done

go_3:
	mov si,0
	jmp back

go_2:
	mov msgIndex,0

done:
	iret
newInt16 endp

start:
	;用int 21h,ah=35h,al=16h取出16h号中断的地址,存在es:bx中
	mov al,16h
	mov ah,35h
	int 21h
	mov oldInt16,bx
	mov oldInt16[2],es

	;利用int 21h,ah=25h,al=16h,把ds:dx中地址写给16h号中断
	push cs
	pop ds
	mov dx,offset newInt16
	mov al,16h
	mov ah,25h
	int 21h

	;将start标号前的内容驻留内存
	mov dx,offset start
	int 27h

	mov ah,4ch
	int 21h
code ends
	end start



五、结果截图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: