Лабораторна робота № 2
ТЕМА: Програмування текстової відеопам’яті у захищеному режимі.
МЕТА: Навчитись виводити текстову інформацію на екран комп’ютера у захищеному режимі роботи процесора шляхом програмування текстової відеопам’яті.
Короткі теоретичні відомості
Під час увімкнення комп’ютера, у процесорі автоматично встановлюється режим реальної адреси (реальний режим). Перехід у захищений режим здійснюється програмно. Оскільки багато деталей функціонування процесора в реальному і захищеному режимах істотно відрізняються, програми, призначені для захищеного режиму, повинні бути написані особливим чином. Реальний і захищений режими є несумісними.
Розглянемо програму, яка у захищеному режимі виводить рядок символів з заданим атрибутом (колір символа і його фон) на монітор шляхом програмування текстової відеопам’яті комп’ютера.
.386P ;Дозвiл трансляцiї привiлейованих команд
;Структура для опису дескрипторiв сегментiв
descr struc
limit dw 0 ;Межа (бiти 0..15)
base_l dw 0 ;База, бiти 0..15
base_m db 0 ;База, бiти 16..23
attr_1 db 0 ;Байт атрибутiв 1
attr_2 db 0 ;Межа (бiти 16..19) i атрибути 2
base_h db 0 ;База, бiти 24..31
descr ends
;Сегмент даних
data segment use16 ;16-розрядна програма
;Таблиця глобальних дескрипторiв GDT
gdt_null descr <0,0,0,0,0,0> ;Селектор 0 - обов'язковий
;нульовий дескриптор
gdt_data descr <data_size-1,0,0,92h,0,0> ;Селектор 8,сегмент даних
gdt_code descr <code_size-1,0,0,98h,0,0> ;Селектор 16,сегмент команд
gdt_stack descr <255,0,0,92h,0,0> ;Селектор 24, сегмент стеку
gdt_scree descr <4095,8000h,0Bh,92h,0,0> ;Селектор 32,відеобуфер
gdt_size=$-gdt_null ;Розмiр GDT
pdescr dq 0 ;Псевдодескриптор для lgdt
real_sp dw 0 ;Змiнна для збереження SP
sym db 1 ;Символ для виведення на екран
attr db 1eh ;Його атрибут
mes db 27, '[31;42m Повернулися в реальний режим! ',27,'[0m$'
data_size=$-gdt_null ;Розмiр сегменту даних
data ends ;Кiнець сегменту даних
;Сегмент команд
text segment 'code' use16 ;16-розрядна програма
assume CS:text, DS:data
main proc
mov AX, data ;Iнiцiалiзацiя DS
mov DS, AX ;у реальному режимi
;Знайдемо 32-бiтову лiнiйну адресу сегменту даних
mov DL,0
shld DX,AX,4
shl AX,4
mov BX,offset gdt_data
mov [BX]. base_l,AX
mov [BX]. base_m,DL
;Знайдемо 32-бiтову лiнiйну адресу сегменту команд
mov AX, CS
mov DL,0
shld DX,AX,4
shl AX,4
mov BX,offset gdt_code
mov [BX]. base_l,AX
mov [BX]. base_m,DL
;Знайдемо 32-бiтову лiнiйну адресу сегменту стеку
mov AX,SS
mov DL,0
shld DX,AX,4
shl AX,4
mov BX,offset gdt_stack
mov [BX]. base_l,AX
mov [BX]. base_m,DL
;Пiдготуємо дескриптор i завантажимо регiстр GDTR
mov BX,offset gdt_data ;Адреса GDT
mov AX,[BX].base_l;Одержимо та занесемо у pdescr
mov word ptr pdescr+2, AX ;базу, бiти 0..15
mov DL,[BX]. base_m;Одержимо i занесемо у pdescr
mov byte ptr pdescr+4, DL ;базу, бiти 16..23
mov word ptr pdescr, gdt_size-1 ;Межа GDT
lgdt pdescr ;Завантажимо регiстр GDTR
;Пiдготуємося до повернення в реальний режим
mov AX, 40h ;Налаштуємо ES на область
mov ES,AX ;даних BIOS
mov word ptr ES:[67h],offset return;Зсув точки повернення
mov ES:[69h],CS ;Сегмент точки повернення
;Пiдготуємося до переходу в захищений режим
cli ;Заборона апаратних переривань
mov AL,0Fh ;Вибiрка байту стану вiдключення
out 70h,AL ;Порт КМОП-мiкросхеми
mov AL, 0Ah ;Установка режиму вiдновлення
out 71h,AL ;пiсля скидання процесора
;Перехід в захищений режим
smsw AX ;Одержимо слово стану машини
or AX,1 ;Встановимо бiт PE
lmsw AX ;Запишемо слово стану
;Процесор працює в захищеному режимi
;Завантажуємо в CS:IP селектор:зсув точки continue
db 0EAh ;Код команди far jmp
dw offset continue ;Зсув
dw 16 ;Селектор сегменту команд
continue:
;Робимо щоб адресувалися данi
mov AX,8 ;Селектор сегменту даних
mov DS,AX
;Робимо щоб адресувався стек
mov AX,24 ;Селектор сегменту стеку
mov SS,AX
;Iніціалізуємо ES i виводимо символи
mov AX,32 ;Селектор сегменту відеобуферу
mov ES,AX
mov BX,800 ;Початковий зсув на екранi
mov CX,640 ;Кількість виведених символiв (циклів)
mov AX,word ptr sym ;Початковий символ з атрибутом
screen: mov ES:[BX],AX ;Вихiд у відеобуфер
add BX,2 ;Зсунемося у вiдеобуферi
inc AX ;Наступний символ
loop screen ;Цикл виведення на екран
;Поверння ЦП у реальний режим
mov real_sp,SP ;Збережемо SP
mov AL,0FEh ;Команда скидання процесора
out 64h,AL ;у порт 64h
hlt ;Зупиняемо процесор до кiнця скидання
;Процесор працює в реальному режимi
;Вiдновлення операцiйного середовища реального режиму
return: mov AX,data ;Вiдновимо адресуємість даних
mov DS,AX
mov SP,real_sp ;Вiдновимо адресуємість стеку
mov AX,stk
mov SS,AX
sti ;Дозволимо апаратнi переривання
mov AH, 09h ;Функцiя виведення на екран рядка
mov DX, offset mes ;Адреса рядка
int 21h
mov AX, 4C00h ;Завершимо програму звичайним чином
int 21h
main endp ;Кiнець головної процедури
code_size=$-main ;Розмiр сегменту команд
text ends ;Кiнець сегменту команд
stk segment stack 'stack' ;Початок сегменту стеку
db 256 dup ('^')
stk ends ;Кiнець сегменту стеку
end main ;Кiнець програми
Дескриптор gdt_screen описує відеосторінку 0 текстової відеопам’яті. Розмір відеосторінки, як відомо, складає 4096 байт, тому в поле межі записано число 4095. Базова фізична адреса відеосторінки відома (В8000h). Молодші 16 бітів бази (число 8000h) заповнюють слово base_l дескриптора, біти 16...19 (число 0Bh) – байт base_m. Біти 20...31 базової адреси рівні 0, оскільки відеобуфер розміщується в першому мегабайті адресного простору.
Фрагмент програми
mov AX,32 ;Селектор сегменту відеобуфера
mov ES,AX
mov BX,800 ;Початковий зсув на екранi
mov CX,640 ;Кількість виведених символiв
mov AX,word ptr sym
screen: mov ES:[BX],AX ;Вихiд у відеобуфер
add BX,2 ;Зсунемося у вiдеобуферi
inc AX ;Наступний символ
loop screen ;Цикл виведення на екран
забезпечує циклічне виведення символа (змінна sym) з атрибутом 1eh (attr).
ЗАВДАННЯ
Розробити та відлагодити програму, яка:
описує таблицю глобальних дескрипторів;
описує дескриптори відеосторінки 0 текстової відеопам’яті, сегментів даних, сегменту команд, сегменту стеку програми;
ініціалізує дескриптори, завантажує в регістр процесора GDTR дані про таблицю глобальних дескрипторів та переводить ЦП у захищений режим;
виводить рядок символів (ПІБ студента, група) з атрибутом згідно варіанта:
Номер варіанта
Колір символа
Колір фону
чорний
білий
синій
рожевий
червоний
синій
фіолетовий
жовтий
жовтий
синій
фіолетовий
жовтий
жовтий
блакитний
зелений
жовтий
фіолетовий
сірий
синій
блакитний
коричневий
білий
зелений
рожевий
фіолетовий
синій
білий
жовтий
синій
зелений
коричневий
жовтий
зелений
блакитний
фіолетовий
яскраво-білий
білий
сірий
чорний
салатовий
синій
білий
червоний
рожевий
білий
блакитний
синій
червоний
коричневий
сірий
повертає процесор у реальний режим.
ПИТАННЯ ДЛЯ САМОКОНТРОЛЮ
Яка базова адреса текстової відеопам’яті?
Скілький відеосторінок має текстова відеопам’ять?
Яку інформацію зберігає дескриптор сегменту?
Який об’єм (розмір) відеосторінки текстової відеопам’яті?
Що таке таблиця глобальних дескрипторів?
Чи можна модифікувати сегменти команд в захищеному режимі під час виконання програми?
Яке призначення тіньових регістрів? Чи доступні вони програмісту?
Що таке регістр таблиці глобальних дескрипторів?
Які таблиці треба підготувати для виходу в захищений режим?
У який спосіб можна повернутися з захищеного режиму до реального?