Защищенный режим процессоров Intel


Вход в защищённый режим


После того, как программа получила адрес процедуры для входа в защищённый режим, она может вызвать эту процедуру при помощи команды CALL. Перед вызовом необходимо загрузить регистры:

Регистры на входе: AX Разрядность программы. Если программа является 32-разрядной, в регистре AX необходимо установить бит 0 в единицу. ES В этот регистр необходимо загрузить сегментный адрес буфера, который будет использован сервером DPMI. Размер буфера должен быть определён при помощи предыдущей функции (регистр SI).

После загрузки регистров необходимо выполнить вызов процедуры с адресом, который был получен в регистрах ES:DI после вызова предыдущей функции.

Если функция выполнилась успешно, флаг CARRY сброшен и программа выполняется в защищённом режиме.

Регистры на выходе CS Селектор, которому соответствует базовый адрес сегмента кода программы и предел 64 килобайта. SS Селектор для сегмента стека, базовый адрес соответствует стеку реального режима, предел - 64 килобайта. DS Селектор, соответствующий сегменту данных реального режима, предел - 64 килобайта. ES Селектор, указывающий на PSP программы с пределом 100h байт. FS, GS 0 (если программа работает на процессоре i80386 или i80486). ESP Если программа работает в 32-разрядном режиме, старшее слово регистра ESP будет равно 0.

Остальные регистры не изменяются.

Если функция выполнилась с ошибкой, флаг CARRY устанавливается в единицу и программа продолжает выполнение в реальном режиме.

После входа в защищённый режим вам становится доступен интерфейс DPMI через функции прерывания INT31h.

Для завершения своей работы программа, использующая DPMI, должна выдать прерывание INT 21h (функция 4Ch) - это обычный способ завершения программ, работающих в среде MS-DOS.

Приведём фрагмент программы, использующей DPMI. На примере этого фрагмента мы покажем, как убедиться в том, что в системе имеется интерфейс DPMI, как войти в защищённый режим и завершить работу программы.

; Получаем адрес точки входа в защищённый режим mov ax, 1687h int 2Fh test ax, ax jnz Cant_Enter_PMode ; не можем войти в защищённый режим mov [PMode_Entry_Seg], es mov [PMode_Entry_Off], di ; Заказываем память для сервера DPMI (если это требуется) test si, si jz Enter_PMode_Now mov bx, si mov ah, 48h int 21h jc Cant_Enter_PMode mov es, ax ; Устанавливаем защищённый режим Enter_PMode_Now: xor ax, ax call DWORD PTR [PMode_Entry_Off] jc Cant_Enter_PMode ; Программа работает в защиённом режиме. ; Здесь располагаются строки ; вашей программы. ; Завершение программы и возврат в DOS mov ax, 4C00h int 21h


Начало  Назад  Вперед