Поиск по базе сайта:
Лабораторна робота №2 тема: Програмування текстової відеопам’яті у захищеному режимі icon

Лабораторна робота №2 тема: Програмування текстової відеопам’яті у захищеному режимі




Скачати 86.74 Kb.
НазваЛабораторна робота №2 тема: Програмування текстової відеопам’яті у захищеному режимі
Дата конвертації25.10.2014
Розмір86.74 Kb.
ТипЛабораторна робота

Архітектура комп’ютера www.aeom.ho.ua

Лабораторна робота № 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 ;Селектор 8,сегмент даних

gdt_code descr ;Селектор 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 дані про таблицю глобальних дескрипторів та переводить ЦП у захищений режим;

  • виводить рядок символів (ПІБ студента, група) з атрибутом згідно варіанта:




Номер варіанта

Колір символа

Колір фону



чорний

білий



синій

рожевий



червоний

синій



фіолетовий

жовтий



жовтий

синій



фіолетовий

жовтий



жовтий

блакитний



зелений

жовтий



фіолетовий

сірий



синій

блакитний



коричневий

білий



зелений

рожевий



фіолетовий

синій



білий

жовтий



синій

зелений



коричневий

жовтий



зелений

блакитний



фіолетовий

яскраво-білий



білий

сірий



чорний

салатовий



синій

білий



червоний

рожевий



білий

блакитний



синій

червоний



коричневий

сірий




  • повертає процесор у реальний режим.


^
ПИТАННЯ ДЛЯ САМОКОНТРОЛЮ




  1. Яка базова адреса текстової відеопам’яті?

  2. Скілький відеосторінок має текстова відеопам’ять?

  3. Яку інформацію зберігає дескриптор сегменту?

  4. Який об’єм (розмір) відеосторінки текстової відеопам’яті?

  5. Що таке таблиця глобальних дескрипторів?

  6. Чи можна модифікувати сегменти команд в захищеному режимі під час виконання програми?

  7. Яке призначення тіньових регістрів? Чи доступні вони програмісту?

  8. Що таке регістр таблиці глобальних дескрипторів?

  9. Які таблиці треба підготувати для виходу в захищений режим?

  10. У який спосіб можна повернутися з захищеного режиму до реального?









Схожі:




База даних захищена авторським правом ©lib.exdat.com
При копіюванні матеріалу обов'язкове зазначення активного посилання відкритою для індексації.
звернутися до адміністрації