汇编语言编写DOS下的内存驻留程序(1)

绪言
0.1 内存驻留与中断
 内存驻留程序英文叫Terminate and Stay Resident Program,缩写为TSR.这些程序加载进内存,执行完后,就驻留在内存里,当满足条件时,调到前台来执行。
 内存驻留程序的常用形式有:
  >诸如Borland 的SideKick弹出式实用程序
  >日历系统
  >网络服务器
  >通讯程序
  >本地的DOS扩展(如CCDOS,UCDOS等中文系统都属于这个范畴)
  >一些可恶的人利用TSR技术制作很多可恶的病毒程序,几乎所有的病毒程序都是TSR程序.
 就象多任务系统调度一个进程有一个调度程序一样,在PC中从前台程序进入到一个TSR,也要有一个调度者,只是PC操作系统的调度不称为调度程序,而只称为触发机制.触发机制调度TSR执行在PC机上党称为激活一个TSR.触发机制主要有以下几种:
  >硬件中断:党用的是键盘中断INT 9H,时钟中断INT 8H,通讯中断INT 14H,磁盘中断INT 13H等等.
  >软件中断:党用的是键盘中断INT 16H,时钟中断INT 1CH,DOS中断INT 21H,等等.
  >以上各种的结合.
 从以上的触发机制可以看出,TSR和PC机的中断系统有着密切的关系.每种激活方式实际上都是与中断有关的.常用特殊的击键序列的识别码是通过截获INT 9H和INT 16H来实现.实际上不管TSR程序的哪一个环节,都与中断有着密切的关系.因此在具体进行TSR和程序设计之前,先介绍PC中断系统.在此只作简单说明.
 在PC机内存的最低端(0000H开始)的1K字节中,存放着256个指针即常说的中为向量或中断矢量(Interrupt vertor),每个中断向量都指向一个子程序,该程序称为中断处理程序(Interrup handler).一个中断向量由四个字节组成,有一个字是中断处理程序的偏移量值,后一个字是中断处理程序的段值.256中断向量一起称为中断向量表.
 手式计算中断向量的首址,可通过以下的公式来求得:
  X号中断向量的首址=0000H:X*4
 当产生一个中断时,处理器都按顺序执行以下步骤:
  >在堆栈上压入处理器的标志(相当于指令PUSHF).
  >在堆栈上压入当前CS和IP值(相当于指令PUSH CS和PUSH IP).
  >关闭中断(CLI)
  >从中断向量加载的CS和IP,执行中断处理程序.
 当执行完中断处理程序后,一般用IRET返回,它的作用是:
  >从堆栈上取出保存的IP和CS(相当于指令POP CS和PUSH CS).
  >同时恢复中断前的处理器标志(相当于指令POPF).
 中断有多种分类,由触发的原因和实现的性质来分,可分为硬件中断和软件中断,从操作系统分层实现来说,可以分成BIOS中断,BOS中断和用户中断.
 一方面,BIOS和DOS通过中断系统向用户提供一个操作系统功能界面.也就是说用户(一般来说是前台程序)的功能主要是通过调用DOS和BIOS的中断服务来实现的,具体来说就是通过INT指令来实现的.另一方面,BIOS和DOS由中断系统所构成,BIOS对硬件成为高层的功能,并通过中断的形式向用户提供.
 如果在当前程序执行的同时,能将一块代码放在内存,把中断向量指向代码中的子程序,那么在当前程序执行中产生中断时,就有可能执行不属于当前程序和操作系统的代码,产生的中断可能是当前程序产生的软件中断,也可能是由硬件产生的硬件中断.这就是单任务的PC操作系统可能执行多于一个进程的简单说明.
 在PC中断系统中有几个中断具有周期性,即INT 8H,INT 1CH和INT 28H.它们或者周期性被执行用于时间计时,或者周期性产生用于等待.它们是在实现TSR时进行轮询触发的基础.键盘中断(INT 9H和INT 16H)当用户击键时发生,利用它们是进行热键处理的基础.串行口通讯也是触发的一个重要机制.此外众多的软件中断也是触发的媒介.

0.2 DOS的可重入性分析
 一个多任务操作系统之所以能使多个进行并存,是因为操作系统的大部分代码是可以了重的,对于临界资源有相应的PV操作,使得当调度一个新的进程时,能完整地保存前一个里程的现场,当再一次调度被挂起的进程时能象没有被中断一样继续执行.
 对于PC机来说,代码的重入性比较弱,对临界资源没有PC操作.当我们用中断程序启动用户的TSR时,如果只保存标志和寄存器,以及当前进程一些信息,那么只保存了当前程序的一部分现场,DOS的临界资源不会自动保存.在进行TSR设计时,一定要了解PC操作系统的重入性和临界资源.
 重入性总是体现在代码上,所谓可重入代码的指这样的代码,即该代码被执行时还没有从中退出,由于某种原因又一次或者多次进入相同的代码,该代码每次的执行结果都是正确的,就说该代码是可重入的.相反,如果结果不正确,那么就就该代码是不可重入的.下面是一个可重入的子程序的例子:
  Add proc near
   cmp DS:word ptr [si],0
   je DonotAddTheValue
   add ax,DS:word ptr [si]
  DonotAddTheValue:
   ret
  Add endp
 上面的例子不管在其中任何一处再一次执行该子程序,执行结果不变.为了说明,只举多种可能性中的一种.
  mov ds,0100h    ;ds=0100h
  mov si,0010h    ;si=0010h
  mov ax,0001h    ;ax,=0001h
  call Add
  cmp 0100h:word ptr [0010h],0  ;Call Add subroutine
  push ds     ;Interrupted
  push si
  push ax
  mov ds,0200h    ;ds=0200h
  mov si,0200h    ;si=0020h
  mov ax,0003h    ;ax=0003h
  call Add
  cmp 0200h:word ptr [0020h],0  ;0200:0020h=0004h
  jne
  add ax,0200h:word ptr [0020h]  ;ax=0007h
  ret      ;Return
  pop ax     ;ax=0001h
  pop si     ;si=0010h
  pop ds     ;ds=0100h
  iret      ;Return to Add subroutine

时间: 2024-11-07 23:00:07

汇编语言编写DOS下的内存驻留程序(1)的相关文章

汇编语言编写DOS下的内存驻留程序(4)

四 基本的驻留程序4.1 一个基本的COM程序DOS之下有两种形式的可执行文件,这两种文件分别是COM文件和EXE文件.其中,COM文件可以迅速地加载和执行,但是其大小不能超过64K字节,只能有一个段,代码段.而且起始地址为100H指令必须为程序的启动指令.EXE文件可以加载到许多个段中,因此程序的大小没有限制,但是程序加载的过程就比较慢,而且对于内存驻留程序来说还会造成更大的麻烦.以下是一个可以正确执行的COM文件,但其内容是空的;只是一个COM文件的框架,可以把你写的任何应用部分加在这个文件

汇编语言编写DOS下的内存驻留程序(3)

三 中断矢量3.1 IBM PC提供的中断IBM PC有两种基本形态的中断.如果是由外围设备所产生的中断就叫做硬件中断(Hardware interrupt),譬如:键盘,磁盘机和时钟等外围设备都可以产生硬件中断.外围设备所产生的中断信号都连接到中断控制器,中断控制器可以根据它们之间的重要性来安排优先顺序,以便使CPU有效地处理这些硬件信号.另一种中断是软件中断(Software interrupt),软件中断也叫做陷井(Trap),它是由执行中的软件所产生.虽然软件包中断的处理方式和硬件中断完

汇编语言编写DOS下的内存驻留程序(5)

五 键盘输入扩充程序有了前一节的基本驻留程序为基础,就可以建立起不同的应用程序.接下来,就写一个驻留程序,把用户敲入的字符,用一系列的字符来取代.这样可以减少用户的击键次数.首先,先复习一下前一节的驻留程序的格式,如下所示:cseg segmentassume cs:cseg,ds:csegorg 100hstart: jmp InitializeOld_Keyboard_IO dd ? ;Section 1new_keyboard_io proc farsti ;Section 2pushfa

汇编语言编写DOS下的内存驻留程序(2)

基本原理2.1 8086/8088IBM PC中央处理单元(Central Processing Unit)是微处理器Inter 8088,8088是8086是小的版本.对于编写程序而言,两者几乎完全相同.两者之间的差别是在于:它们对外的沟通.8086和外界沟通时是经由16位的输入输出通道,内存存取也是每次以16位为单位,8088和8086极为相似,但是它和外界沟通时就必须经由16位的通道.2.1.1 寄存器8086/8088的结构简单,其中包含了一组一般用途的16位寄存器.AX,BX,CX,D

如何进行系统配置 ——了解DOS下的内存

DOS操作系统最早设计时,PC机的硬件系统只支持1M字节的寻址空间,所以DOS只能管理最多1M字节的连续内存空间.在这1M内存中,又只有640K被留给应用程序使用,它们被称为常规内存或基本内存,其它384K被称为高端内存,是留给视频显示和BIOS等使用的.在1982年,640K内存对微型计算机来说显得绰绰有余,人们甚至认为,640K的内存可以用来干任何事.现在看起来有些可笑,但在当时,情况确实如此. 现在的情况是,即使你的电脑装有几兆或几十兆内存,但如果你使用DOS操作系统,那么你也只有640K

DOS下内存的配置

我们大家都知道,DOS大体上不能够完全依靠人机界面的方式来一步步地完成系统的配置.若要让系统发挥出最大的性能,必须依靠我们的进一步努力.下面介绍一下DOS内存的配置方法. 实模式的DOS通常只能使用1M以下的内存空间.其中基本内存为640K,而上位内存则需要相应的内存管理器.基本内存的管理尤为重要,因为使用不当会造成一些程序无法运行.那么,应如何优化使用它呢?这儿有一些建议. 首先,加载提供上位内存(UMB)的内存管理器.通常有EMM386和QEMM等,不过这些工具自身占用的内存较大,在此推荐的

DOS下内存的配置_DOS/BAT

实模式的DOS通常只能使用1M以下的内存空间.其中基本内存为640K,而上位内存则需要相应的内存管理器.基本内存的管理尤为重要,因为使用不当会造成一些程序无法运行.那么,应如何优化使用它呢?这儿有一些建议. 首先,加载提供上位内存(UMB)的内存管理器.通常有EMM386和QEMM等,不过这些工具自身占用的内存较大,在此推荐的是UMBPCI,这是一个 仍在发展的工具,可提供最大高达162K的UMB,而且如果放在HIMEM前可完全不占用基本内存.然后,将所有的设备驱动程序/TSR调入UMB(用 D

DOS下内存的配置方法_DOS/BAT

我们大家都知道,DOS大体上不能够完全依靠人机界面的方式来一步步地完成系统的配置.若要让系统发挥出最大的性能,必须依靠我们的进一步努力.下面介绍一下DOS内存的配置方法.  实模式的DOS通常只能使用1M以下的内存空间.其中基本内存为640K,而上位内存则需要相应的内存管理器.基本内存的管理尤为重要,因为使用不当会造成一些程序无法运行.那么,应如何优化使用它呢?这儿有一些建议.  首先,加载提供上位内存(UMB)的内存管理器.通常有EMM386和QEMM等,不过这些工具自身占用的内存较大,在此推

在DOS下使用注册表扫描程序

从windows98之后,windows系统加入了对注册表的 管理程序,该程序有两个版本,scanregw.exe工作在windows环境中,Scanreg.exe工作在dos环境.并用一个Scanreg.ini文件与之辅助.介绍该程序For windows版本的文章很多,朋友们可以自己 查找参阅.这里仅介绍如何在dos下使用Scanreg.exe程序. 由于程序 是在dos模式下工作.因此,尽管你的操作系统是 中文版的windows,这时出现的也是英文字符界面.程序操作是由命令行和一些选项 开