Доклад: Маскировка вирусов
mov ds,ax
mov word ptr ds:[0067h], offset shutdown_return
mov word ptr ds:[0069h],cs
pop ds
[Запрещаем маскируемые прерывания
cli
in al,INT_MASK_PORT
or al.OFFh
out INT_MASK_PORT,al
[Запрещаем немаскируемые прерывания. Данная последовательность
;команд не запрещает "незапрещаемые" прерывания в процессоре
[(этого сделать по определению нельзя), а "не пускает" сигнал
[немаскируемого прерывания к процессору
mov al,8Fh
out CMOS_PORT,al
jmp $+2
mov al,5
out CMOS_PORT+1,al
ret
init_protected_mode ENDP
[Подпрограмма, переводящая процессор в защищенный режим
set_protected_mode PROC
.Открываем адресную линию А20 для доступа свыше 1Мбайт.
;При закрытой линии адресное пространство
["зацикливается" в пределах 1Мбайт
call enable_a20
.Сохраняем значение регистра SS для реального режима
mov real_ss,ss
[Переводим компилятор Turbo Assembler в улучшенный режим.
[IDEAL - это не команда и не оператор, это директива, влияющая
[только на интерпретацию дальнейших строк листинга
ideal
р286
[Загружаем регистр глобальной таблицы дескрипторов GDTR
Igdt [QWORD gdt_gdt] ;db OFh,01h,16h dw offset gdt_gdt
[Переводим процессор в защищенный режим
mov ax,0001h
Imsw ax ;db OFh,01h,FOh
[Переводим компилятор Turbo Assembler назад в режим MASM
masm
.286
[Производим длинный переход для того,
.чтобы очистить внутреннюю очередь
.команд процессора
jmp far flush
db OEAh
dw offset flush
dw CS_DESCR
flush:
Останавливаем в регистр SS селектор сегмента стека
mov ax,SS_DESCR
mov ss.ax