![]() | 第11章 更高级的技术 | -313- | |||||||||||||||||||
了解了内存的分配技术,我们再回过头来说一说内存驻留技术。前面我们提到过当一个程序调入内存进行时,DOS会把所有可用内存分配给这个程序,而当程序结束时,这些内存就会被DOS收回。注意这种情况只有在用户程序采用"INT 20H"中断及DOS的4CH功能调用结束进行时才会发生。如果采用"INT 27H"中断结束程序,那么DOS在回收内存时就会做一些盘算,它会将内存重新划分一下,用户程序需要多少内存,DOS就会留出多少内存,其余内存它会毫不客气地收回来。 这就有点象我们编写的"GETMEM"程序首先要重新划分内存一样。实际上DOS也是通过4AH功能把可用内存重新分配,为需要驻留的程序保留合适的空间。这就给程序设计者这样一个提示:如果编制一个程序把某个已经驻留在内存中的程序占据的内存空间释放,这样不就可以在需要的时候把已驻留的程序"撤出"内存了吗。 很多鼠标器配用的驱动程序都有这样的能力。下面给出的这个程序例是为前面的"SNAP"程序编制的,运行了SNAP程序之后再运行UNINST就可以收回SNAP占据的内存空间: |
|||||||||||||||||||||
UNINST.ASM code main msg start: |
segment assume org proc jmp db mov int mov mov push mov mov int pop mov int lea mov int mov |
cs:code,ds:code 100h near start 'SNAP.COM is already ax,3505h 21h bx,2ch ax,word ptr es:[bx] es es,ax ah,49h 21h es ah,49h 21h dx,msg ah,9 21h ah,4ch |
;跳过字符串 uninstalled.',07h,0dh,0ah,24h ;取得05H中断向量(等同于取得SNAP ;的PSP段地址) ;将SNAP程序的环境块段地址 ;送至AX寄存器 ;暂存SNAP程序的PSP段地址 ;将SNAP程序的环境块段地址送入ES ;释放SNAP程序的环境块 ;取回SNAP程序的PSP段地址 ;释放SNAP程序占用的内存空间 ;显示提示信息 ;结束进程 |
||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |