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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: