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