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