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: