386________________________________________ Приложение

aov ax,1000h 64 К » 4096 параграфов GetSize:

ШОУ ex, as

add ax,ex AX - сегмент буфера

mov es,PSP Сегмент PSP

mov bx,es:[2] Получаем вершину памяти

sub bx,ax BX - доступная память в параграфах

crop bx,1000h Больше 64 Кбайт?

ja LargMem -Да

mov cl,4

shi bx,cl BX - доступная память в байтах

jmp m5 LargMem:

mov bx,OFFFFh Длина буфера -=64 Кбайт той: сюр bx,0 Есть свободная память?

jne SetMem -Да ; Нет свободной памяти - резервируем ее

mov ah,48h

mov bx,1000h

int 21h ;Резервируем 64 К

jnc OKay .-Удачно

cmp bx,0 ;Есть хоть сколько-нибудь памяти?

jne GetLowMem ;-Да ; Выделяем часть стека GetStack:

mov ax, ss

mov bx,sp

add bx,-2

jmp SetMem GetLowMem:

mov ah,48h ;Просим у ДОС блок памяти

int 21h ;длиной BX параграфов

jc GetStack ;He получаем - используем стек Okay:

piov MemF,bx ; Размер зарезервированной mov cl,4 ;памяти в параграфах shi Ьх,с1 ;Переводим в байты SetMem:

mov Mem,bx ;Запоминаем в MEM длину буфера

TOOV MemS,ax ;и в MemS сегмент

; Копируем незараженную часть файла

Copy:

mov ax,Leng2 AX - старшая часть остатка

mov сх,Меш СХ - максимальный буфер

cmp ах,0 Осталось больше длины буфера?

jnz Read -Да

cmp cx,Lengl Сравниваем с длиной буфера

jb Read -Буфер меньше остатка

mov cx,Lengl Копируем остаток целиком

; Читаем файл

Read:

mov ah,3Fh

mov dx,0 »Смещение буфера » О

mov bx,HandExa lЧитаем из зараженного файла

push ds ; Сохраняем DS

mov ds,HemS ;вуфер за концом программы

int 21h

pop ds