P ; Разрешение трансляции всех (в том

Числе и привилегированных команд

Процессоров 386 и 486

Структура для дескриптора сегмента

Descr struc

Lim dw 0 ; Граница (биты 0 - 15)

Base_1 dw 0 ; База (биты 0 - 15)

Base_m db 0 ; База (биты 16 - 23)

Attr_1 db 0 ; Байт атрибутов 1

Attr_2 db 0 ; Граница (биты 16 - 19)

И атрибуты 2

Base_h db 0 ; База (биты 24 - 31)

Descr ends

Data segment use16

Таблица глобальных дескрипторов GDT

Селектор 0 – обязательный нулевой дескриптор

21 gdt_null descr <0,0,0,0,0,0>

Селектор 8 - сегмент данных

23 gdt_data descr <data_size-1,0,0,92h,0,0>

Селектор 16 - сегмент кода

25 gdt_code descr <code_size-1,0,0,98h,0,0>

Селектор 24 – сегмент стека

27 gdt_stack descr <255,0,0,92h,0,0>

Селектор 32 - видеобуфер

29 gdt_screen descr <4095,8000h,0bh,92h,0,0>

30 gdt_size=$-gdt_null ; Размер GDT

31 ;======================================================

Поля данных программы

Pdescr dq 0 ; Псевдодескриптор для команды lgdt

Sym db 1 ; Символ для вывода на экран

Attr db 1ah ; Атрибут символа

36 mes db 27,'[31;42mReal mode now',27,’[0m’,10,13,'$'

Mes1 db 26 dup(32),'A message in protected mode',27 dup(32),0

38 data_size=$-gdt_null ; Размер сегмента данных

Data ends

40 ;=========================================================

Text segment 'code' use16 ; По умолчанию 16-разрядный режим

Assume cs:text,ds:data

Main proc

Xor eax,eax ; Очистка 32-разр. EAX

Mov ax,data ; Инициализация сегментного регистра

Mov ds,ax ; для реального режима

Вычисление 32-битного линейного адреса сегмента данных и загрузка

Его в дескриптор (в EAX уже находится его сегментный адрес).

Для умножения его на 16 сдвинем его влево на 4 разряда

Shl eax,4 ; В ЕAX - линейный базовый адрес

Mov ebp,eax ; Сохранение его в EBP

Mov bx,offset gdt_data ; В ВХ адрес дескриптора

53 mov [bx].base_1,ax ; Мл. часть базы

Rol eax,16 ; Обмен старшей и младшей половины EAX

55 mov [bx].base_m,al ; Средняя часть базы

Вычисление и загрузка 32-битного линейного адреса сегмента команд

Xor eax,eax ; Очистка 32-разр. EAX

Mov ax,cs ; Адрес сегмента команд

Shl eax,4 ; В ЕAX - линейный базовый адрес

Mov bx,offset gdt_code ; В ВХ адрес дескриптора

61 mov [bx].base_1,ax ; Мл. часть базы

Rol eax,16 ; Обмен старшей и младшей половины EAX

63 mov [bx].base_m,al ; Средняя часть базы

Вычисление и загрузка 32-битного линейного адреса сегмента стека

Xor eax,eax

Mov ax,ss

Shl eax,4

Mov bx,offset gdt_stack

69 mov [bx].base_1,ax

Rol eax,16

71 mov [bx].base_m,al

Подготовка псевдодескриптора и загрузка его в регистр GDTR

73 mov dword ptr pdescr+2,ebp ; База GDT (0-31)

Mov word ptr pdescr,gdt_size-1 ; Граница GDT

Lgdt pdescr ; Загрузка регистра GDTR

Подготовка к переходу в защищенный режим

Cli ; Запрет маскир. прерываний

Mov al,80h ; Запрет NMI

Out 70h,al ; Порт КМОП микросхемы

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

Mov eax,cr0 ; Чтение регистра состояния

Or eax,1 ; Взведение бита 0

Mov cr0,eax

84 ;*************************************************

85 ;* Теперь процессор работает в защищенным режиме *

86 ;*************************************************

Загрузка в CS селектор сегмента кода, а в IP смещения следующей

Команды (при этом и очищается очередь команд)

Db 0eah ; Код команды far jmp