Доклад: Маскировка вирусов
shr dl,4
shi ax,4
;Устанавливаем адрес сегмента данных
;в глобальной таблице дескрипторов
mov bx, offset gdt_ds
setgdtentry
;Вычисляем абсолютный адрес для сегмента GDT: прибавляем
;к уже вычисленному абсолютному адресу сегмента данных
;смещение в нем таблицы дескрипторов
add ax,offset gdtr
adc dl.0
Останавливаем адрес сегмента GDT
;в глобальной таблице дескрипторов
mov bx.offset gdt_gdt
setgdtentry
;Вычисляем абсолютный адрес для сегмента кода
;в соответствии со значением регистра CS
mov ax,cs
mov dl.ah
shr dl,4
shi ax,4
.Устанавливаем адрес сегмента кода
;в глобальной таблице дескрипторов
mov bx, offset gdt_cs
setgdtentry
[Вычисляем абсолютный адрес для сегмента стека
;в соответствии со значением регистра SS
mov ax.ss
mov dl.ah
shr dl,4
shi ax,4
Останавливаем адрес сегмента стека
;в глобальной таблице дескрипторов
mov bx,offset gdt_ss
setgdtentry
Перехватываем рестарт. Так как процессор i286 (а эта программа
[рассчитана именно на такой процессор) не имеет возможности
;возврата в реальный режим из защищенного, возврат в реальный
режим будем производить следующим образом: перехватим рестарт,
.сгенерируем CPU Reset, после которого получим управление, когда
Процессор будет находится уже в реальном режиме. На процессоре
;i386 возврат в реальный режим происходит
[значительно проще и "естественнее".
push ds