lea bx,Vir

call CopyName ;Р1мя VIR-файла ; Создаем $У$-файл

mov ah,3Ch

mov al,l

lea dx,NameF$

int 21h

jnc я1

jmp Error ml: mov HandVir,ax ;0писатель незараженного файла

ret

CopyName PROC NEAR ;Копируем строку имени файла с нужным расширением ; При входе DI - смещение приемника, ; ВХ - смещение расширения

mov es,cs0

lea si,NameFE

mov ex,LName

eld rep movsb ;Копируем до расширения

mov si,bx \

mov ex,4 rep movsb ;Копируем расширение

ret

WriteHead PROC NEAR

; Записываем в $У$-файл эталонный заголовок

С помощью процедуры WriteHead в $У$—файл записываются 24 байта эталонного заголовка из переменной Head. Процедура CopyFile копирует в него остальные Leng24 байта из исходного файла. Для убыстрения копирования процедура пытается выделить буферную память максимально возможного размера 64 Кбайт за концом программы. Если в конце программы нет свободной памяти, процедура пытается зарезервировать память вне программы с помощью обращения к функции ДОС $48, а если ДОС отвечает отказом, использует в качестве буфера незанятую часть стека. В подавляющем большинстве случаев программа после загрузки получает в свое распоряжение всю незанятую память, поэтому обращение к ДОС или использование стека осуществляется крайне редко.

mov ah,40h

mov cx,24 ;Длина заголовка 24 байт lea dx,Head mov bx,HandVi r int 21h jnc m2 jmp Error m2: ret

CopyFile PROC NEAR ; Определяем длину буфера ;и копируем незараженную часть ; Находим длину буфера

mov ax,SPO ;Вершина стека (в стеке АХ!)

cmp ax,OFFDOh ;Стек 64 Кбайт?

ja LargStack ;-да

add ax,17 ;Округляем с избытком

mov cl,4

shr ax,cl ;Переводим в параграфы

jmp GetSize LargStack: