Числе и привилегированных команд
Процессоров 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