|
|
|
|
Освобождение операционной среды
Среда содержит строки символов. Каждая строка имеет имя переменной, за которой следует значение (более полное описание среды приведено в главе 3).
DOS устанавливает среду при загрузке Вашей резидентной подпрограммы TSR. Программы свободны в интерпретации значений этих переменных. Файл COMMAND.COM
использует переменную PATH (путь) для указания каталогов, в которых необходимо производить поиск загружаемой программы или командного файла.
Так как при загрузке программы файл COMMAND.COM запрашивает DOS о передаче копии операционной среды, TSR нет необходимости проводить после ее
завершения любые изменения в среде. Время, в течение которого среда является правильной, - это время инициализации TSR. Использует ли Ваша TSR среду
или по разным причинам не использует, зависит от приложения. В связи с тем, что после завершения TSR среда является неправильной и она занимает
определенную память, то нет никаких причин хранить ее (хотя отказ от освобождения среды не оказывает неблагоприятного воздействия на TSR).
Начальный сегмент среды содержится в PSP по смещению 2Ch (смотри листинг 4-15 "Структура PSP"). Для освобождения среды используйте функцию int
21h AH=49h "Освободить блок памяти". При некоторых обстоятельствах среда отсутствует. Поэтому, прежде чем освобождать среду, необходимо проверить
эти обстоятельства. Если среда отсутствует, то PSP будет содержать нули по смещению 2Ch (функция 49h будет иметь некоторые проблемы при освобождении
блока памяти в ячейке 00000h). Пример освобождения среды приведен в листинге 4-25.
Листинг 4-25. Освобождение среды
----------------------------------------------------------------
;
; Освобождение среды
;
; Замечание: Структура PSP_W_Envron является частью структуры
; PSP с именем STRUC в листинге 4-15
FreeEnv PROC NEAR
pushr ; сохранение некоторых регистров
mov ah,62h ; запрос адреса PSP
int 21h
mov es,bx ; es <== PSP
xor ax,ax ; ax <== 0
xchg ax,es:PSP_W_Envron
; затирание сегмента среды в PSP
; ax <== сегмент среды
or ax,ax ; среда присутствует ?
jz NoEnv ; если 0 -- нет
mov es,ax ; es <== среда
mov ah,49h ; освободить блок памяти
int 21h
NoEnv: popr ; восстановление регистров
ret ; возврат
FreeEnv ENDP
----------------------------------------------------------------
|
|
|