Курсовая работа по предмету "Программирование, компьютеры и кибернетика, ИТ технологии"


Програма модифікуюча команди, які використовуються в захищеному режимі


Міністерство Освіти і Науки України

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ

“ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”

Кафедра : “ОБЧИСЛЮВАЛЬНА ТЕХНІКА ТА ПРОГРАМУВАННЯ”

ЗАТВЕРДЖУЮ
Зав. Кафедрою xxxxxxxxx.

___________ /xxxxxxxx./

_________________ 2002р.

Програма модифікуюча команди, які використовуються в захищеному режимі
Специфікація
ЛИСТ ЗАТВЕРДЖЕННЯ
Розробники :
Керівник проекту :
________ / xxxxxxxx./
___________________ 2002р.
Виконавець :
_______ / Хххххххххххх Х.Х./
___________________ 2002р.

Харків

2002

ЗАТВЕРДЖЕНИЙ

Програма модифікуюча команди, які використовуються в захищеному режимі
Специфікація

Харків

2002

Специфікація

Номер документу

Назва документу

Примітки

Xxxxxx- 01 90 01-1

Технічне завдання

Xxxxxx- 01 81 01-1

Пояснювальна записка

Xxxxxx- 01 13 01-1

Опис програми

Xxxxxx- 01 12 01-1

Текст програми

Міністерство Освіти і Науки України

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ

“ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”

Кафедра : “ОБЧИСЛЮВАЛЬНА ТЕХНІКА ТА ПРОГРАМУВАННЯ”

ЗАТВЕРДЖУЮ
Зав. Кафедрою xxxxx.

___________ /xxxxxxxxxА./

_________________ 2002р.

Програма модифікуюча команди, які використовуються в захищеному режимі
Технічне завдання
ЛИСТ ЗАТВЕРДЖЕННЯ

Xxxxxx- 01 90 01-1 ЛЗ

Розробники :

Керівник проекту :

________ / xxxxxxВ./

___________________ 2002р.

Виконавець :
_______ / Хххххххххххх Х.Х./
___________________ 2002р.

Харків

2002

Зміст

Вступ

1. Підстава для розробки.

2. Призначення розробки.

3. Вимоги до програмного виробу.

3.1 Вимоги до функціональних характеристик.

3.2 Вимоги до надійності.

3.3 Умови експлуатації.

3.4 Вимоги до маркування і пакування.

3.5 Вимоги до транспортування і збереження.

Вимоги до складу і параметрів технічних засобів.

Вимоги до програмної документації.

Техніко-економічні показники.

Стадії і етапи розробки.

Порядок контролю і приймання.

Уведення

Програмний виріб це програма, що модифікує деякі команди, для того, щоб вони могли працювати в захищеному режимі. Програмний виріб орієнтований на компютери серії ІBM PS сумісних ПЭВМ, що використовують мікропроцесори 80286, 80386 і 80486.

1. Підстава для розробки :

Підставою для розробки є завдання на курсове проектування.

2. Призначення розробки :

Метою розробки є написання програми, що модифікує деякі команди для того, щоб вони могли працювати в захищеному режимі.

3. Вимоги до програмного виробу :

3.1. Вимоги до функціональних характеристик :

3.1.1. Програмний виріб повинний забезпечувати, модифікацію команд для того, щоб вони могли працювати в захищеному режимі роботи мікропроцесора.

3.1.2. Функціонування програмного виробу повинне бути погоджено з роботою TURBO PASCAL 7.0

3.2. Вимоги до надійності :

Програмний виріб повинний стійко функціонувати в апаратному і програмному середовищі, обговореному в п.4

3.3. Умови експлуатації :

Умови експлуатації програмного виробу цілком визначаються умовами експлуатації застосованих технічних засобів і носіїв даних.

3.4. Вимоги до маркування і пакування :

Вимоги до маркування і пакування не висуваються.

3.5. Вимоги до транспортування і збереження :

Вимоги до транспортування і збереження не висуваються.

4. Вимоги до складу і параметрів технічних засобів :

Для функціонування програмного виробу необхідна ІBM AT/XT і PS/2 чи сумісна з нею, з наступним мінімальним набором переферійних пристроїв:

- нагромаджувач на гнучких магнітних дисках;

- відеоадаптер будь-якого класу;

- клавіатура.

5. Вимоги до програмної документації :

- Опис програми;

- Пояснювальна записка;

- Текст програми;

Техніко-економічні показники.

Техніко-еконоічні показники в даному проекті не розраховуються.

Стадії і етапи розробки.

Розробка програми повинна вестись по наступному плану :

одержання завдання;

огляд літератури і обгрунтування необхідності розробки;

розробка структури вхідних і вихідних даних, уточнення методів рішення завдання;

опис і розробка алгоритму рішення завдання;

розробка структури програми та остаточне визначення конфігурації технічних засобів;

розробка програми, іспити і налагодження;

розробка програмної документації.

Порядок контролю і приймання.

При прийманні програмного виробу перевіряється :

комплектність, зміст і оформлення програмної документації;

відповідність програмного виробу програмним характеристикам;

відповідність програмного виробу обговореному програмному та апаратному середовищу;

надійність функцінування.

Міністерство Освіти і Науки України

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ

“ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”

Кафедра : “ОБЧИСЛЮВАЛЬНА ТЕХНІКА ТА ПРОГРАМУВАННЯ”

ЗАТВЕРДЖУЮ
Зав. Кафедрою О.Т.П.

___________ /xxxxxxxxx./

_________________ 2002р.

Програма модифікуюча команди, які використовуються в захищеному режимі
Пояснювальна записка
ЛИСТ ЗАТВЕРДЖЕННЯ

Xxxxxx- 01 81 01-1 ЛЗ

Розробники :

Керівник проекту :

________ / xxxxxxxxxx./

___________________ 2002р.

Виконавець :
_______ / Хххххххххххх Х.Х./
___________________ 2002р.

Харків

2002

Зміст

1. Організація захищеного режиму роботи мікропроцесора :

1.1. Визначення типу мікропроцесора.

1.2. Формування глобальної дескрипторної таблиці.

1.3. Структура дескриптора сегмента.

1.4. Виконання доступу до сегментів.

1.5. Формування дескрипторів сегментів.

1.6. Завдання адреси і розміру таблиці GDT.

1.7. Підготовка до скидання мікропроцесора.

1.8. Заборона маскуємих і немаскуємих переривань.

1.9. Збереження в памяті регістрів мікропроцесора.

1.10. Перехід мікропроцесора в захищений режим.

1.11. Повернення в реальний режим.

1.12. Відновлення регістрів мікропроцесора.

1.13. Дозвіл маскуємих і немаскуємих переривань.

2. Система команд мікропроцесора :

2.1. Кодування регістрів.

2.2. Визначення ефективної адреси.

1. ОРГАНІЗАЦІЯ РОБОТИ МІКРОПРОЦЕСОРА В ЗАХИЩЕНОМУ РЕЖИМІ

Усі мікропроцесори (МП) фірми Intel починаючи з 80286 і закінчуючи Pentium III, а також програмно і конструктивно сумісні з ними МП інших фірм (мікропроцесори сімейства x86) мають два основних режими роботи: захищений (Protected Mode) і режим реальних адрес (Real-Address Mode) чи просто реальний. Найбільше повно можливості мікропроцесорів реалізуються при роботі в захищеному режимі. При цьому:

* забезпечується фізична адресація памяті обсягом до 4 Гбайт, а при сторінковій організації - до 64 Гбайт, а також доступ до віртуальної памяті обсягом до 64 Тбайт;

* працює система захисту памяті, що регламентує доступ до сегментів памяті в залежності від ступеня їхньої захищеності і рівня привілеїв програм і запобігає несанкціоноване втручання в роботу операційної системи і програм користувачів;

* крім сегментації памяті може бути виконана її сторінкова організація;

* апаратно підтримується багатозадачний режим роботи мікропроцесора;

* виконується режим віртуального МП 8086.

Після включення харчування і при скиданні мікропроцесора в МП установлюється реальний режим роботи. Для організації роботи мікропроцесора в захищеному режимі в загальному випадку необхідно виконати наступні дії:

визначити тип встановленого в персональному компютері мікропроцесора;

сформувати в памяті глобальну дескрипторну таблицю, утримуючу дескриптори усіх використовуваних у програмі сегментів памяті;

задати базова адреса і розмір глобальної дескрипторної таблиці;

сформувати дані для повернення в реальний режим;

заборонити маскуємі і немаскуємі переривання;

зберегти в памяті вміст регістрів МП;

перевести мікропроцесор у захищений режим;

виконати в захищеному режимі задані дії;

повернутися в реальний режим;

відновити вміст регістрів МП;

дозволити маскуємі і немаскуємі переривання.

1.1. Визначення типу мікропроцесора.

Оскільки перехід у захищений режим, повернення з захищеного режиму, обробка переривань і організація багатозадачного режиму здійснюються по-різному для МП 80286 і МП наступних моделей, необхідно визначити тип МП персонального компютера. Визначення типу мікропроцесора для моделей 8086-i486 ґрунтується на розходженні в різних типів МП у стані і зміні окремих бітов регістра прапорів (FLAGS чи EFLAGS для 32-розрядних МП):

* 8086 : біти 12-15 регістра FLAGS завжди встановлені;

* 80286: біти 12-15 регістра FLAGS у реальному режимі завжди кинуті;

* 80386: прапор AC (біт 18) регістра EFLAGS не може бути встановлений;

* i486 : прапор AC EFLAGS може бути встановлений.

Для останніх моделей МП i486 і наступних мікропроцесорів (Pentium, Pentium MMX, Pentium Pro, Pentium II, Celeron і Pentium III) зявилася можливість одержати додаткову інформацію про МП за допомогою команди CPUID (CPU IDentification). Чи виконується ця команда на даному мікропроцесорі можна визначити за допомогою біта ID (21) регістра EFLAGS: якщо програмно стан цього біта можна змінити, значить команда CPUID виконується.

Команда CPUID має код 0Fh 0A2h. Параметр команди вказується в регістрі EAX. Значення бітов регістра EDX (при EAX=1), містить інформацію про особливості мікропроцесора.

Інформація, що повертається командою CPUID

Таблиця 1.

Вхідне значення EAX

Інформація, видавана мікропроцесором

0

EAX - максимальне вхідне значення EAX

EBX - Genu чи Auth

ECX - ine чи enti

EDX - ntel чи cAMD

1

EAX - версія МП: тип, сімейство, модель, Степпинг (stepping) чи старші 32

біта 96-бітного серійного номера МП

EBX - зарезервовано

ECX - зарезервовано

EDX - інформація про особливості МП

2

EAX:EBX:ECX:EDX - інформація про кеш-память і TLB

3

EDX:ECX- молодші 64 біта 96-бітного серійного номера МП

Коди ідентифікації МП

Таблиця 2

Тип EDX

[13:12]

Сімейство

EDX[11:8]

Модель

EDX[7:4]

Мікропроцесор

00

00

00

00

00

00

00

00

00

00

00

01

00

00

01

01

01

00

00

00

00

00

00

00

00

00

01

0100

0100

0100

0100

0100

0100

0100

0100

0100

0100

0100

0100

0101

0101

0101

0101

0101

0101

0101

0101

0101

0110

0110

0110

0110

0110

0110

0000

0001

0010

0011

0100

0101

0111

1000

1001

1110

1111

1000

0001

0010

0001

0010

0011

0100

0000

0001

0010

0001

0011

0101

0110

0111

0011

Intel486DX

Intel486DX

Intel486SX

Intel486DX2, Intel486DX2 OverDrive, AMD DX2 у режимі WT

IntelSXL

IntelSX2 OverDrive

IntelDX2 і AMD DX2 у режимі WB

AMD DX4 у режимі WT

AMD DX4 у режимі WB

Am5x86 у режимі WT

Am5x86 у режимі WB

IntelDX4 Overdrive

Pentium (60,66)

Pentium (75..200)

Pentium OverDrive (60,66)

Pentium OverDrive (75..133)

Pentium OverDrive для 486

Pentium MMX (166,200)

AMD-K5-PR75,90,100

AMD-K5-PR120,133

AMD-K5-PR166

Pentium Pro

Pentium II модель 3

Pentium II модель 5,

Pentium II Xeon, Celeron модель 5

Celeron модель 6

Pentium III, Pentium III Xeon

Pentium II OverDrive

При виконанні команди CPUID із вхідним значенням EAX=2 мікропроцесор повертає інформацію про внутрішню кеш-память і TLB. При цьому молодший байт регістра EAX (регістр AL) містить значення, що показує, скільки разів необхідно виконати команду CPUID із вхідним значенням EAX=2, щоб одержати всю інформацію про кешпамяті і TLB.

Старший біт (біт 31) кожного регістра показує, чи містить даний регістр достовірну інформацію (біт дорівнює 0) чи є зарезервованим (біт дорівнює 1). Якщо регістр містить достовірну інформацію, то вона представляється у виді однобайтних дескрипторів.

1.2. Формування глобальної дескрипторної таблиці.

Сегментація памяті, тобто розбивка памяті на окремі блоки, називані сегментами, здійснюється по-різному в реальному і захищеному режимах.

У захищеному режимі атрибути сегментів, що задають місце розташування сегмента в загальному адресному просторі, його розмір і особливості доступу до нього, представлені у виді 8-байтної структури даних, називаної дескриптором. Дескриптори зберігаються в памяті у виді дескрипторних таблиць. Дескриптори сегментів коду, стека, даних, а також системні дескриптори, знаходяться в глобальної дескрипторної таблиці - GDT (Global Descriptor Table).

При багатозадачний роботі кожна задача може мати свої сегменти коду, стека і даних, недоступні для інших задач. У цьому випадку дескриптори цих сегментів містяться в локальну дескрипторну таблицю - LDT (Local Descriptor Table), що може бути формована, якщо це необхідно, для кожної задачі.

Дескриптори оброблювачів переривань зберігаються дескрипторної таблиці переривань - IDT (Interrupt Descriptor Table).

У реальному режимі для опису атрибутів сегмента дескриптор

не потрібно, тому що базова адреса сегмента (зменшений у 16 разів) зберігається в сегментному регістрі, границя сегмента (64 Кб - 1) фіксована і завжди може бути зроблений доступ (запис і читання)

до сегмента.

1.3. Структура дескриптора сегмента.

Формат дескриптора сегмента для МП починаючи з 80386, що має наступні полючи :

Границя сегмента, рівна розміру сегмента, зменшеному на 1, і його базову адресу займають у дескрипторі по двох полючи : границя - байти 0,1 і молодші 4 розряди байта 6, базовий адреса - байти 2-4 і 7 дескриптора сегмента.

Наявність двох полів для границі і базової адреси сегмента звязано з забезпеченням сполучності програм, написаних для МП 80286, з наступними МП: молодші шістьох байтів дескриптора в цьому випадку цілком збігаються з дескриптором МП 80286.

Біти старшої частини байта 6 дескриптора мають наступне призначення:

G (Granularity) - біт дрібності вказує, у яких одиницях задана границя сегмента: при G=0 - у байтах, при G=1 - у сторінках обсягом по 4 Кбайт. Таким чином, сегмент може мати розмір до 1 Мбайт (2^20) при G=0 і до 4 Гбайт (2^32) при G=1. Коли границя задана в 4 Кб одиницях, те молодші 12 розрядів зсуву не беруть участь у порівнянні при перевірці виходу зсуву за зазначену границю сегмента.

D/B (Default size/Big) - біт розміру за замовчуванням визначає для сегмента коду розрядність формованої відносної адреси й операнда : при D=0 - 16 розрядів, при D=1 - 32 розряду. Розрядність, прийнята за замовчуванням може бути змінена за допомогою префікса розрядності даних (66h) чи адреси (67h).

Для сегмента стека цей біт називається B і визначає наступне:

* якщо сегмент стека визначена як сегмент даних, тобто ED=0, то при B=1 розміри слова стека і регістра ESP рівні 32 розрядам;

* якщо сегмент стека розширюється вниз (ED=1), то B також визначає розмір стека: при B=0 він дорівнює 64 Кб, при B=1 - 4 Гб.

Біт X може бути використаний чи системою користувачем за своїм розсудом (цей біт мікропроцесором не обробляється).

Байт доступу дескриптора визначає права доступу до обираного сегмента і, у залежності від типу сегмента, має кілька форматів.

Біти і полючи байта доступу мають наступне призначення:

P(Present) - біт присутності визначає наявність відповідного

сегмента (P=1) чи його відсутність (P=0) у памяті. Якщо в регістр сегмента занесений селектор дескриптора, що має Р=0, то при зверненні до цього сегмента виникає переривання 11;

DPL (Descriptor Privilege Level) - рівень привілеїв дескриптора вказує на ступінь захисту сегмента при доступі до нього;

S (System) - системний біт визначає вид обираного дескриптора: S=0 означає, що це дескриптор системного сегмента й у поле TYPE указується його тип ;

E (Execute) - біт “выполняемости” визначає, чи можна сегмент виконати: E=1 означає, що це сегмент коду, E=0 означає, що це чи сегмент даних, чи стека;

А (Accessed) - біт доступу встановлюється апаратно при доступі до сегмента, т.ч. при завантаженні відповідного селектора в сегментний регістр;

R (Read) - біт дозволу зчитування використовується для сегмента коду і дозволяє при R=1 зчитування його вмісту. При R=0 спроба зчитування приводить до виникнення переривання 13 (те ж відбувається при спробі запису в сегмент коду незалежно від R);

C (Conforming) - біт підпорядкування визначає додаткові правила звертання із сегментом коду (див. роздягнув 12 “ Захист памяті”;

W (Write) - біт дозволу запису використовується для сегмента даних і дозволяє (при W=1) чи забороняє (при W=0) зміна умісту сегмента даних. При порушенні викликається переривання 13. Дескриптор сегмента стека обовязково повинна мати W=1;

ED (Expand Down) - біт напрямку розширення визначає, як буде вказуватися границя сегмента даних: при ED=0 (расширениe нагору) дані в сегменті розміщаються в напрямку зростання адрес від базової адреси сегмента до його границі, зазначеної в дескрипторі; при ED=1 (расширення униз) дані в сегменті розташовуються в напрямку зменшення адрес. Це реалізується в сегментах стека, де дані розміщаються починаючи з осередку, адреса який дорівнює базовому, збільшеному на максимальний розмір сегмента (64 Кб чи 4 Гб у залежності від біта B дескриптора). Інші осередки стека мають менші адреси, аж до нижньої границі стека, рівній сумі базової адреси сегмента і його границі, зазначеної в дескрипторі.

Біти P і A байта доступу дескриптора сегмента можуть бути використані операційною системою (ОС) для організації віртуальної памяті. ОС періодично переглядаючи (і скидаючи) біти A дескрипторів усіх сегментів, визначає час останнього доступу до кожного сегмента. Якщо сегмента, до якого виконується звертання, немає в памяті (P=0), виробляється відповідне переривання, і операційна система, обробляючи це переривання, зчитує цей сегмент із магнітного диска в память. І, якщо в памяті немає для цього вільного місця, з її віддаляється на диск саме той сегмент, що довше всього залишався незатребуваним.

1.4. Виконання доступу до сегментів.

Доступ до необхідного сегмента здійснюється за допомогою селектора, що заноситься у відповідний сегментний регістр.

Сегментні регістри містять значення селекторів сегментів, що

указують на поточні адресуємі сегменти памяті. З кожним із сегментних регістрів звязаний недоступний програмно (“тіньовий”) дескрипторний регістр сегмента.

Селектор являє собою 16-розрядний покажчик, що має три полючи :

- поле RPL (Requested Privilege Level) визначає рівень привілеїв запиту, т.ч. вказує той припустимий рівень захисту сегмента, при якому сегмент може бути обраний за допомогою даного селектора.

- поле TI (Table Indicator) служить індикатором вибору дескриптор уторованої таблиці: TI = 0: вибирається GDT; TI = 1: вибирається LDT.

- поле ІНДЕКС служить номером для вибору одного з дескрипторів, що містяться в таблиці. Першим дескриптором у таблиці завжди указується дескриптор, називаний нуль-дескриптор (він містить нулі у всіх полях). Завантаження нуль-дескриптора в сегментні регістри коду і стека відразу викликає переривання 13 (“Порушення загальної захисту”). При завантаженні нуль-дескриптора в сегментні регістри даних це переривання не виникає. Однак воно виробляється при спробі програми звернутися до цих сегментів. Це може бути використане для запобігання доступу до тих чи іншим сегментної регістрам.

Максимальне число дескрипторів таблиці визначається форматом селектора і дорівнює 8192 .

Число дескрипторних таблиць, доступних задачі (GDT і LDT), їх максимальний розмір, а також максимальний розмір сегмента визначають розмір віртуальної памяті мікропроцесора: 2*8192*4 Гбайт = 64 Тбайт.

Щораз при завантаженні селектора в сегментний регістр мікропроцесор знаходить у GDT по індексі необхідний дескриптор сегмента і завантажує дані з цього дескриптора (базова адреса, границя й атрибути) у відповідний дескрипторний “тіньовий” регистер. Якщо значення індексу перевищить границю GDT, то буде переривання 13.

При звертанні до памяті мікропроцесор на етапі сегментації формує лінійна адреса операнда чи команди, а потім на етапі сторінкової організації перетворить його у фізичну адресу. Якщо сторінкова організація не використовується, те лінійна адреса буде бути фізичним.

Лінійна адреса операнда чи команди дорівнює сумі базової адреси того сегмента, де знаходяться операнд чи команда, і їхньої відносної адреси. При цьому базова адреса сегмента береться мікропроцесором саме з дескрипторного регістра, а не з дескриптора сегмента в GDT, що зажадало би звертання до памяті і додатковим тимчасовим витратам.

1.5. Формування дескрипторів сегментів.

Структура дескриптора таблиці GDT відповідно до формату дескриптора сегмента. Для сегмента коду байт доступу буде дорівнює:

acc_code:=present OR nosys OR exe OR read, тобто він знаходитися в памяті (P=1), не є системним (S=1), його можна виконувати (E=1) і його можна читати (R=1).

Формування дескрипторів таблиці GDT здійснюється за допомогою

занесення значення параметрів у відповідні полючи дескриптора, і мають наступне значення :

i - номер дескриптора сегмента в GDT;

limit - границя сегмента;

base - базова адреса сегмента;

acces - байт доступу;

d, g - біти D і G байта 6 дескриптора сегмента.

1.6. Завдання адреси і розміру GDT.

Після формування дескрипторів GDT необхідно вказати мікропроцесору місце розташування цієї таблиці в памяті і її розмір.

Це робиться за допомогою регістра GDTR, що містить 32-розрядний базова адреса таблиці і її 16-розрядну границю.

Для формування даних регістра GDTR і його завантаження використовується базова адреса і розмір перемінної gdt і за допомогою команди LGDT завантажує ці значення в регістр GDTR.

1.7. Підготовка до скидання мікропроцесора.

Для МП 80286 повернення в реальний режим із захищеного здійснюється тільки шляхом скидання мікропроцесора, ініційованого командою контролера клавіатури.

Для МП наступних моделей можливі два варіанти повернення в реальний режим: за допомогою команди MOV чи також через скидання МП. У випадку повернення через скидання мікропроцесора необхідно в реальному режимі підготувати структури даних для здійснення повернення в задану крапку програми після скидання МП.

Після виконання скидання процесор переходить у реальний режим і керування передається BIOS. BIOS аналізує вміст осередку CMOS-памяті з адресою 0Fh - байта стану відключення. Подальші дії визначаються вмістом цього осередку.

Значення байта стану відключення

Таблиця 3.

Значення

Причина відключення

0

1

2

3

4

5

6,7,8

9

0Ah

Програмне скидання при натисканні комбінації клавіш

CTRL-ALT-DEL чи несподіване скидання. Виконується звичайний перезапуск системи, але процедури тестування, що працюють при включенні харчування, не виконуються.

Скидання після визначення обсягу памяті.

Скидання після тестування памяті.

Скидання після виявлення помилки в памяті (контроль

парності).

Скидання з запитом перезавантаження.

Після скидання перезавантажується контролер переривань,

потім керування передається за адресою, що знаходиться в області даних BIOS 0040h:0067h.

Скидання після виконання тесту роботи процесора в

захищеному режимі.

Скидання після виконання пересилання блоку памяті з

основної памяті в розширену.

Після скидання керування негайно передається по

адресі в 0040h:0067h області даних BIOS.

Якщо в захищеному режимі не використовуються переривання і, відповідно, не перепрограмується контролер переривань, є зміст застосувати значення 0Ah. При цьому послу скидання МП керування буде відразу передано за адресою, узятому з області даних BIOS 0040h:0067h. У цьому випадку час, витрачений на повернення в реальний режим, буде менше.

Для запису байта даних в осередок CMOS-памяті необхідно спочатку в порт з адресою 70h записати номер потрібного осередку, а потім у порт 71h - занести дані.

1.8. Заборона маскуємих і немаскуємих переривань.

Перед переходом у захищений режим необхідно заборонити всі зовнішні апаратні як маскуємі, так і немаскуємі. Обробка маскуємих переривань мікропроцесором не виконується, якщо скинутий прапор IF регістра FLAFS/EFLAFS. Скидання прапора IF виконує команда CLI. Для заборони немаскуємих переривань необхідно в порт 70h занести байт даних, що містить у старшому розряді одиницю.

1.9. Збереження в памяті регістрів мікропроцесора.

Оскільки при скиданні МП значення його регістрів губляться, те необхідно попередньо здійснити запис значень сегментних регістрів і регістра покажчика стека в память.

1.10. Переклад мікропроцесора в захищений режим.

Для того щоб перевести МП у захищений режим, необхідно установити 0-й біт регістра керування CR0 (Control Register) в одиницю.

Регістр CR0 включає 10 розрядів для керування роботою мікропроцесора і визначення його стану (біти CD, NW, AM, WP і NE зявилися в МП починаючи з i486):

PE (Protection Enable) - біт дозволу захисту встановлюється в “1” для переключення МП у захищений режим. Якщо РЕ скинутий - МП працює в реальному режимі; МР (Monitor coProcessor) - біт керування співпроцесором - блоком FPU (Floating Point Unit) використовується разом з битому TS для генерації переривання 7 (“FPU недоступний”) при обробці команди WAIT : якщо MP=1 і TS=1, то команда WAIT викликає переривання;

EM (Emulation) - біт емуляції співпроцесора: коли він установлений викликається переривання 7 при виконанні команд FPU чи переривання 6 при виконанні команд MMX (для МП, що виконує набір команд MMX). Значення EM не впливає на команду WAIT;

TS (Task Swiched) - біт переключення задач: біт TS установлюється при переключенні задач. Якщо TS=1 і виконується команда FPU чи MMX (якщо MP=1, то і команда WAIT), те викликається переривання 7;

NE (Numeric Error) - біт керування обробкою помилок FPU : якщо NE=0, то встановлюється схема обробки помилок, використовувана в МП 80286 і 80386 - через зовнішнє переривання IRQ 13 (переривання від співпроцесора). При цьому на вхід IRQ 13 контролера переривань надходить сигнал FERR# від МП, що приймає активний (низький) рівень при помилці FPU. Вхідний сигнал МП IGNNE# низьким рівнем дозволяє заборонити обробку помилок FPU. Якщо NE=1, помилки співпроцесора обробляються як внутрішні переривання з номером 16;

WP (Write Protection) - біт захисту від запису забороняє запис у сторінки, потрібні тільки для читання для всіх програм;

AM (Alignment Mask) - біт маски вирівнювання: при AM=0 забороняється перевірка невирівняності операндів;

NW (Not Write through) - біт заборони запису в кеш-память;

CD (Cache Disable) - біт заборони кэшировання, тобто заповнення рядка кеш-памяті;

PG (PaGing) - біт дозволу сторінкової організації. Установка PG=1 дозволена тільки в захищеному режимі, тобто при PE=1.

Занесення даних у регістр CR0 для мікропроцесорів починаючи с 80386 виконується спеціальною командою MOV, що здійснює промін із системними регістрами.

У МП 80286 замість 32-розрядного регістра CR0 мається 16-розрядний регістр MSW (Machine Status Word). Занесення даних у MSW виконується командою LMSW. Для сумісності молодші 16 розрядів CR0 збігаються з MSW і запис у них може здійснюватися також і командою LMSW.Установка біта PE здійснюється для мікропроцесора 80286 за допомогою команди LMSW, що заносить значення перемінної msw у регістр MSW: db 0fh,01h,36h { LMSW }

dw msw

jmp @prot

Для МП починаючи з 80386 установка біта PE CR0 без зміни інших розрядів регістра керування здійснюється за допомогою команди MOV:

db $0f,$20,0c0h { MOV EAX,CR0 }

db 66h,0dh { OR EAX,1 }

dd 1h

db $0f,22h,0c0h { MOV CR0,EAX }

jmp @prot

Відразу після переходу МП у захищений режим необхідно виконати програмний перехід для очищення буфера предвиборки від команд, занесених туди в реальному режимі. Перехід здійснюється на мітку @prot, з яким і починається робота МП у захищеному режимі. Помітимо, що оскільки в програмі P_MODE не було потрібно перевантажувати сегментний регістр коду (у захищеному режимі використовувалися ті ж базова адреса і розмір сегмента і того ж права доступу), те використовується внутрісегментний перехід і завантаження регістра

CS не відбувається. Потім у сегментні регістри DS, SS і ES завантажуються відповідні селектори:

@prot:mov ax,data_sel

mov ds,ax

mov ax,stack_sel

mov ss,ax

mov ax,video_sel

mov es,ax

На цьому переклад мікропроцесора в захищений режим завершується.

1.11. Повернення в реальний режим.

Для повернення в реальний режим для МП 80286 використовується процедура RESET , що встановлює ознаку виконання скидання мікропроцесора (res=1), за допомогою команди контролера клавіатури здійснює скидання МП : mov al,$fe

out $64,al

і очікує завершення скидання мікропроцесора:

@wait_res:

hlt

jmp @wait_res.

Після скидання МП BIOS виконує перехід на крапку входу, адреса яке зберігається в осередку $40:$67. Для МП починаючи з 80386 повернення в реальний режим виконується за допомогою команди MOV, що здійснює скидання біта PE регістра CR0. Перед цим необхідно виконати наступні дії :

а) заборонити апаратні переривання командою CLI;

б) передати керування сегменту коду з R=1 і FFFFh;

в) завантажити в сегментні регістри DS, SS, ES селектори сегмента, що має атрибути, відповідні реальному режиму: границю сегмента, рівну 64ДО-1, ED=0 і W=1;

г) за допомогою команди LIDT завантажити в IDTR базова адреса (0) і границю (1Кб - 1) таблиці векторів реального режиму;

д) очистити біт PE регістра CR0;

е) здійснити межсегментний перехід.

З перерахованих вище дій у даній програмі потрібно виконати тільки пункти а), в), і д). Пункт б) не потрібно виконувати оскільки сегмент виконуваного коду уже володіє зазначенними параметрами. Пункт г) не потрібно, тому що в захищеному режимі не оброблялися і таблиця векторів (тобто IDT) і її розташування в памяті не були змінені.

Нарешті, пункт е) не потрібний через те, що не було завантаження регістра CS при вході в захищений режим.

Для завантаження сегментних регістрів DS, SS і ES використовується

селектор сегмента даних data_sel, що задовольняє перерахованим у пункті в) умовам : mov ax,data_sel

mov es,ax

mov ds,ax

mov ss,ax.

Очищення біта PE регістра CR0 виконуються командою MOV:

db $0f,$20,0c0h

db 66h,25h

dd 0fffffffeh

db $0f,22h,0c0h

jmp ret_r

Перехід на мітку ret_r необхідний для очищення буфера предвиборки команд.

1.12. Відновлення регістрів МП.

Відновлення регістрів МП виконується в такий спосіб:

ret_r:

xor ax,ax { Відновлення регістрів після }

mov ds,ax { повернення в реальний режим: }

mov ds,ds:[4*$60] { DS, }

mov ss,real_ss { SS, }

mov es,real_es { ES і }

mov sp,real_sp { SP }

1.13. Дозвіл маскуємих і немаскуємих переривань.

Дозвіл маскуємих і немаскуємих переривань здійснюється за допомогою процедури en_int. Ця процедура також виконує скидання стану клавіш-перемикачів.

2. Система команд мікропроцесора :

2.1. Кодування регістрів.

При двухбітовому полі rg :

Таблиця 4.

rg

00

01

10

11

Сегментні регістри

Es

Cs

Ss

Ds

При трьохбітовому полі rg :

Таблиця 5.

Reg

000

001

010

011

100

101

110

111

W=0

Al

Cl

Dl

Bl

Ah

Ch

Dh

Bh

W=1

Ax

Cx

Dx

Bx

Sp

Bp

Si

Di

2.2. Визначення ефективної адреси.

Ефективна адреса EA операнда в памяті визначається в залежності від значень полів : mod і r/m :

Визначення ефективної адреси :

Таблиця 6.

Mod

DISP

R/m

EA

00

0

000

001

010

011

100

101

110

111

EA = (BX) + (SI)

EA = (BX) + (DI)

EA = (BP) + (SI)

EA = (BP) + (DI)

EA = (SI)

EA = (DI)

EA = DISP

EA = (BX)

01

Disp-low с расширением

со знаком

000

001

010

011

100

101

110

111

EA = (BX) + (SI) + DISP

EA = (BX)+(DI) + DISP

EA = (BP)+(SI) + DISP

EA = (BP)+(DI) + DISP

EA = (SI) + DISP

EA = (DI) + DISP

EA = (BP) + DISP

EA = (BX) + DISP

10

Disp-high : Disp-low

000

001

010

011

100

101

110

111

EA = (BX) + (SI) + DISP

EA = (BX)+(DI) + DISP

EA = (BP)+(SI) + DISP

EA = (BP)+(DI) + DISP

EA = (SI) + DISP

EA = (DI) + DISP

EA = (BP) + DISP

EA = (BX) + DISP

11

-

Код

регистра

-

Міністерство Освіти і Науки України

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ

“ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”

Кафедра : “ОБЧИСЛЮВАЛЬНА ТЕХНІКА ТА ПРОГРАМУВАННЯ”

ЗАТВЕРДЖУЮ
Зав. Кафедрою xxxx.

___________ /xxxxxx./

_________________ 2002р.

Програма модифікуюча команди, які використовуються в захищеному режимі
Опис програми
ЛИСТ ЗАТВЕРДЖЕННЯ

Xxxxxx- 01 13 01-1 ЛЗ

Розробники :

Керівник проекту :

________ / xxxxxxx./

___________________ 2002р.

Виконавець :
_______ / Хххххххххххх Х.Х./
___________________ 2002р.

Харків

2002

ЗАТВЕРДЖЕНИЙ

Xxxxxx- 01 13 01-1 ЛЗ

Програма модифікуюча команди, які використовуються в захищеному режимі
Опис програми

Харків

2002

Опис програми

Зміст

Опис змінних.

Опис процедур і функцій.

Список літератури.

Опис змінних.

</ tr>

Rm

Byte

Значення поля R/m

( Регистр-операнд / регістри, використовувані в обчисленні зсуву ).

hex_tabl

Array[0..15] of char

Шеснадцятирічне значення

чисел.

Опис процедур і функцій.

Процедура Analiz :

( procedure Analiz;Assembler; )

У даній процедурі знаходиться код програми, написаний мовою Assembler, що аналізується, на розмір формату команди, у наслідку, головною програмою.

Функція hex :

( function hex(p:longint):string; )

Дана функція здійснює переклад числа p у шеснадцятирічне значення, для наступного виводу його на печатку, чи екран монітора.

Функція Opred_Dlin_Kom :

( function Opred_Dlin_Kom(cod:byte;n:word):integer; )

Дана функція здійснює обчислення розміру довжини байта, який

йде відразу після КОП ( коду операції ).

Головна програма :

( program Ade; )

У тексті головної програми здійснює обчислення розміру довжини поточної команди, і перехід, по отриманій довжині, до коду наступної команди.

Список літератури :

"Апаратне забезпечення ІBM PC " (частина 1) Діалог - Мифи

"Програмування в середовищі Turbo Pascal 7.0" А.І Марченко Л.А. Марченко 1997р.

Методичні вказівки " Засобу обробки переривань у мові Turbo Pascal 7.0" 1993р. Ф.А. Домнін І.С.Зиков.

Методичні вказівки "Архітектура обчислювальних систем " 1993р. А.І. Поворознюк, І.С.Зиков, С.Ю. Леонов.

Методичні вказівки "Робота з машинними кодами і прямою доступ до памяті і портів у мові Turbo Pascal 7.0" 1993р. Ф.А. Домнін И.С. Зиков.

Міністерство Освіти і Науки України

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ

“ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”

Кафедра : “ОБЧИСЛЮВАЛЬНА ТЕХНІКА ТА ПРОГРАМУВАННЯ”

ЗАТВЕРДЖУЮ
Зав. Кафедрою О.Т.П.

___________ /xxxxxxx./

_________________ 2002р.

Програма модифікуюча команди, які використовуються в захищеному режимі
Текст програми
ЛИСТ ЗАТВЕРДЖЕННЯ

Xxxxxx- 01 12 01-1 ЛЗ

Розробники :

Керівник проекту :

________ / xxxxxxxxx./

___________________ 2002р.

Виконавець :
_______ / Хххххххххххх Х.Х./
___________________ 2002р.

Харків

2002

ЗАТВЕРДЖЕНИЙ

Xxxxxx- 01 12 01-1 ЛЗ

Програма модифікуюча команди, які використовуються в захищеному режимі
Текст програми

Харків

2002

program Ade; { Курсовой проект по МПС на 2002г.}

uses CRT, prot; { Модуль PROT содержит константы, типы переменных, переменные, процедуры и функции для работы в защищенном режиме }

label ret_r; { Точка возврата в реальный режим }

const code_sel3 =$30; { селектор кода модуля TURBO }

s:string=Обработка прерываний в защищенном режиме;

s1:string=Скан-коды клавиш: ;

var ff:extended;

err,segcode,ip,ofs_div,ofs_next,fl1,fl2,cur_sel,cod_ofs,cod_sel,sel_descr,ofs_analiz,

ds_int,ax_,bx_,ds_,bp_,ss_,cs_,flags,sp_,w,segm,sel_cs,es_ :word;

cod_,i,lim1,lim2,prov,i_descr:byte;ss:string;dlina : integer;i_table:byte;

table:array[0..9] of record segm,ofs:word;cod,descr:byte;

end;

Real_Znach_ds : word;Real_Znach_ss : word;Real_Znach_es : word;Real_Znach_cs : word;

procedure out_GDT;{------------------Вывод таблицы GDT------------------}

var i:byte;

begin i:=1;

writeln(ТАБЛИЦА GDT);

while gdt[i].acc<>0 do begin

writeln(hex(i*8),:, hex(gdt[i].acc), ,hex(gdt[i].base_h),hex(gdt[i].base_l), ,hex(gdt[i].lim_l)); inc(i); end

end;

procedure Save_RG;Assembler;

asm { Сохранение значений сегментных регистров DS,SS,ES}

mov Real_Znach_ds,ds

mov Real_Znach_ss,ss

mov Real_Znach_es,es

mov Real_Znach_cs,cs

end; {save_rg}

procedure Analiz; {Assembler;}

begin

asm mov ax,2 end;

end;

procedure real_code;Assembler;

asm

inc ax

inc cx

inc ax

inc cx

mov es,es_

mov segm,ax

end;

procedure post(ofs,sel:word);

var i,cur_ofs,cur_ofs1,cur_ofs_:word; { Текущее смещение }

cod_p,cod,cod1,cod2,cod3,cod4,k,cod1_: byte;

function Dlin_Kom(cod:byte):integer;

var md, rm : byte;

begin

md:=cod shr 6;rm:=cod and 7;

case md of

$0 : case rm of

$0..$5,$7 : Dlin_Kom:=1;

$6 : Dlin_Kom:=2;

end;

$1 : Dlin_Kom:=2;

$2 : Dlin_Kom:=3;

$3 : Dlin_Kom:=1;

end;{case}

end;{Dlin_Kom}

begin

asm

mov es_,es { Сохранить ES в es_ }

end;

cur_ofs:=ofs; { Текущее смещение процедуры }

i:=1; { Номер команды процедуры }

repeat

asm

mov es,sel { Загрузить селектор в ES }

mov bx, cur_ofs

dec bx

mov al, byte ptr es:[bx] { Префикс команды: }

mov cod_p,al { cod_p }

mov al, byte ptr es:[bx+1] { 1-й байт команды (КОП): }

mov cod,al

mov al, byte ptr es:[bx+2] { 2-й байт команды }

mov cod1,al { (modregr/m): cod1 }

mov al, byte ptr es:[bx+3] { 3-й байт команды: }

mov cod2,al { cod2 }

mov al, byte ptr es:[bx+4] { 4-й байт команды: }

mov cod3,al { cod3 }

mov al, byte ptr es:[bx+5] { 5-й байт команды }

mov cod4,al { cod4 }

cmp cod,9ah { Это команда межсегментного перехода? }

jnz @2 { Если да: }

mov ax, word ptr es:[bx+2] { определение смещения }

mov cod_ofs,ax

mov ax, word ptr es:[bx+4] { и селектора перехода }

mov cod_sel,ax

mov al,0cch

mov byte ptr es:[bx+1],al

jmp @2

@1:

cmp cod,8eh { Это команда загрузки сегмента данных? }

jnz @2 { Если да: }

mov al,35h

mov byte ptr es:[bx],al

jmp @2

mov ax,sel_cs { Занесение значения CS процедуры }

mov es,ax { Real_code в регистр ES }

mov bx,offset real_code

mov al,cod_p { Запись префикса искомой команды в }

mov byte ptr es:[bx],al { качестве 1-го байта процедуры }

mov al,8bh { Замена: вместо сегментного регистра }

mov byte ptr es:[bx+1],al { будет загружаться регистр AX }

mov al,cod1 { Коррекция байта modregm/r }

and al,0c7h

mov byte ptr es:[bx+2],al

mov al,cod2

mov byte ptr es:[bx+3],al { Занесение 3-го байта }

xor ax,ax { искомое значение сегментного регистра }

@2:mov es,es_

end;

cur_ofs1:=cur_ofs;

case cod of

$88..$8B : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$C6 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+2;

$C7 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+3;

$B0..$B7 : cur_ofs:=cur_ofs+2;

$B8..$BF : cur_ofs:=cur_ofs+3;

$A0..$A3 : cur_ofs:=cur_ofs+3;

$8E,$8C : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$FF : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$50..$57 : cur_ofs:=cur_ofs+1;

$06,$0E,

$16,$1E : cur_ofs:=cur_ofs+1;

$68 : cur_ofs:=cur_ofs+3;

$6A : cur_ofs:=cur_ofs+2;

$60 : cur_ofs:=cur_ofs+1;

$8F : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$58..$5F : cur_ofs:=cur_ofs+1;

$07,$17,

$1F : cur_ofs:=cur_ofs+1;

$61 : cur_ofs:=cur_ofs+1;

$86,$87 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$90..$97 : cur_ofs:=cur_ofs+1;

$E4,$E5 : cur_ofs:=cur_ofs+2;

$EC,$ED : cur_ofs:=cur_ofs+1;

$E6,$E7 : cur_ofs:=cur_ofs+2;

$EE,$EF : cur_ofs:=cur_ofs+1;

$D7 : cur_ofs:=cur_ofs+1;

$8D : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$C4,$C5 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$9C..$9F : cur_ofs:=cur_ofs+1;

$00..$03 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$80,

$82,$83 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+2;

$81 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+3;

$04 : cur_ofs:=cur_ofs+2;

$05 : cur_ofs:=cur_ofs+3;

$10..$13 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$14 : cur_ofs:=cur_ofs+2;

$15 : cur_ofs:=cur_ofs+3;

$FE,$FF : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$40..$47 : cur_ofs:=cur_ofs+1;

$28..$2B : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$2C : cur_ofs:=cur_ofs+2;

$2D : cur_ofs:=cur_ofs+3;

$18..$1B : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$1C : cur_ofs:=cur_ofs+2;

$1D : cur_ofs:=cur_ofs+3;

$FE,$FF : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$48..$4F : cur_ofs:=cur_ofs+1;

$38..$3B : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$3C : cur_ofs:=cur_ofs+2;

$3D : cur_ofs:=cur_ofs+3;

$F6,$F7 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$27,$37 : cur_ofs:=cur_ofs+1;

$2F,$3F : cur_ofs:=cur_ofs+1;

$69 : cur_ofs:=cur_ofs+4;

$6B : cur_ofs:=cur_ofs+3;

$D4,$D5 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$98,$99 : cur_ofs:=cur_ofs+1;

$D0..$D3 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$C0,$C1 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+2;

$20..$23 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$24 : cur_ofs:=cur_ofs+2;

$25 : cur_ofs:=cur_ofs+3;

$84,$85 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$F6 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+2;

$F7 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+3;

$A8 : cur_ofs:=cur_ofs+2;

$A9 : cur_ofs:=cur_ofs+3;

$08..$0B : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$0C : cur_ofs:=cur_ofs+2;

$0D : cur_ofs:=cur_ofs+3;

$30..$33 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$34 : cur_ofs:=cur_ofs+2;

$35 : cur_ofs:=cur_ofs+3;

$A4,$A5 : cur_ofs:=cur_ofs+1;

$A6,$A7 : cur_ofs:=cur_ofs+1;

$AE,$AF : cur_ofs:=cur_ofs+1;

$AC,$AD : cur_ofs:=cur_ofs+1;

$AA,$AB : cur_ofs:=cur_ofs+1;

$6C..$6F : cur_ofs:=cur_ofs+1;

$F2,$F3 : cur_ofs:=cur_ofs+2;

$E8 : cur_ofs:=cur_ofs+3;

$9A : cur_ofs:=cur_ofs+5;

$EB : cur_ofs:=cur_ofs+2;

$E9 : cur_ofs:=cur_ofs+3;

$EA : cur_ofs:=cur_ofs+5;

$C3 : cur_ofs:=cur_ofs+1;

$C2 : cur_ofs:=cur_ofs+3;

$CB : cur_ofs:=cur_ofs+1;

$CA : cur_ofs:=cur_ofs+3;

$70..$7F : cur_ofs:=cur_ofs+2;

$E0..$E3 : cur_ofs:=cur_ofs+2;

$C8 : cur_ofs:=cur_ofs+4;

$C9 : cur_ofs:=cur_ofs+1;

$CD : cur_ofs:=cur_ofs+2;

$CC : cur_ofs:=cur_ofs+1;

$CE : cur_ofs:=cur_ofs+1;

$CF : cur_ofs:=cur_ofs+1;

$62 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$F8..$FD : cur_ofs:=cur_ofs+1;

$F4,$F5 : cur_ofs:=cur_ofs+1;

$9B : cur_ofs:=cur_ofs+1;

$65,$F0 : cur_ofs:=cur_ofs+1;

$0F : cur_ofs:=cur_ofs+2;

$D8..$DF : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

$26,$2E,

$36,$3E : cur_ofs:=cur_ofs+1;

$0F : cur_ofs:=cur_ofs+Dlin_Kom(cod2)+2;

$63 : cur_ofs:=cur_ofs+Dlin_Kom(cod1)+1;

end;

write(i:4,. ,sel,:,cur_ofs1, Код => ,hex(cod):3,;);

if (cur_ofs-cur_ofs1) >1 then write( ,hex(cod1):3, );

if (cur_ofs-cur_ofs1) >2 then write( ,hex(cod2):3, );

if (cur_ofs-cur_ofs1) >3 then write( ,hex(cod3):3, );

if (cur_ofs-cur_ofs1) >4 then write( ,hex(cod4):3, );

inc(i);

if cod=$9a then begin

writeln(Межсегментный переход!);

with table[i_table] do begin segm:=sel;ofs:=cur_ofs1;cod:=$9a;descr:=sel_descr; end;

inc(i_table); { Формирование дескриптора сегмента кода: }

init_gdt(i_descr,$ffff,lin_adr(cod_sel,0),acc_code,0,0);

inc(i_descr);sel_descr:=sel_descr+8;post(cod_ofs,cod_sel);

end;

until (cod=$C3) or (cod=$CB) or (cod=$C2) or (cod=$CA);{ret}

writeln(End of procedure);readkey;

end;{post}

begin

textbackground(0);clrscr;textcolor(15);

asm cli end; w:=0; i_table:=0;

for i:=0 to 9 do table[i].segm:=0;

memL[0:3*4]:=Longint(@int3); asm sti end;

i_descr:=6; sel_descr:=$30;Save_RG;

writeln(Значение DS,SS,ES,CS для реального режима : , hex(Real_Znach_ds), ,,hex(Real_Znach_ss),,, hex(Real_Znach_es), ,hex(Real_Znach_cs)); sel_cs:=Cseg;

asm mov ofs_analiz,offset analiz end; post(ofs_analiz,Cseg);

analiz;

writeln(w=,w, sp=,sp_, cod_=,hex(cod_), bp=,bp_, ss=,hex(ss_), cs=,hex(cs_), ds=,hex(ds_), bx=,bx_); i:=0;

while table[i].segm<>0 do with table[i] do begin

writeln(segm=,segm, ofs=,ofs, cod=,hex(cod), desr=,hex(descr));inc(i);

end; readkey;

lim1:=0; lim2:=10;

{---Определение значения сегмента кода cs1 процедур,описанных в модуле PROT----}

cs1:=Seg(int_30h);

excep:=$ff; { Отличное от FFh значение переменной excep }

semaf:=0; { Начальная установка семафора }

res:=0; { МП сброшен не был }

{-----------Определение типа микропроцессора----------------}

get_cpu_type(0,cpu_type); { В cpu_type - номер типа МП }

if cpu_type=2 then t:=0 { 16-разрядный МП }

else t:=8; { 32-разрядный МП }

{ Формирование байта доступа прерывания: }

acc_int:=present OR type_int OR t;

{ Формирование байта доступа ловушки: }

acc_trap:=present OR type_trap OR t;

{--------------Формирование таблицы GDT-------------------- }

{ Нуль-дескриптор: }

init_gdt(0,0,0,0,0,0);

init_gdt(1,$ffff,lin_adr(cseg,0),acc_code,0,0);

init_gdt(2,$ffff,lin_adr(cs1,0),acc_code,0,0);

init_gdt(3,$ffff,lin_adr(dseg,0),acc_data+$60,0,0);

init_gdt(4,0,lin_adr(sseg,0),acc_stack,0,0);

init_gdt(5,4000-1,lin_adr($b800,0),acc_data,0,0);

{------Формирование данных регистра GDTR и его загрузка-----}

out_GDT; readkey; exit; init_gdtr;

{----Определение селектора (sel_ret) и смещения (ofs_ret)---}

sel_ret:=Cseg;

asm mov ofs_ret,offset ret_r end;

{-------------Формирование данных для перехода на метку ret_r после сброса МП-------}

save_ret_real(sel_ret,ofs_ret,5);

not_int;{------Запрет маскируемых и немаскируемых прерываний--------}

{--------------Формирование таблицы IDT-------------------- }

init_idt(0,ofs(exc_00),code_sel2,acc_trap);

init_idt(1,ofs(exc_01),code_sel2,acc_trap);

init_idt(2,ofs(exc_02),code_sel2,acc_trap);

init_idt(3,ofs(exc_03),code_sel,acc_trap);

init_idt(4,ofs(exc_04),code_sel2,acc_trap);

init_idt(5,ofs(exc_05),code_sel2,acc_trap);

init_idt(6,ofs(exc_06),code_sel2,acc_trap);

init_idt(7,ofs(exc_07),code_sel2,acc_trap);

init_idt(8,ofs(exc_08),code_sel2,acc_trap);

init_idt(10,ofs(exc_10),code_sel2,acc_trap);

init_idt(11,ofs(exc_11),code_sel2,acc_trap);

init_idt(12,ofs(exc_12),code_sel2,acc_trap);

init_idt(13,ofs(exc_13),code_sel2,acc_trap);

init_idt(14,ofs(exc_14),code_sel2,acc_trap);

init_idt(16,ofs(exc_16),code_sel2,acc_trap);

init_idt(17,ofs(exc_17),code_sel2,acc_trap);

init_idt(18,ofs(exc_18),code_sel2,acc_trap);

init_idt($20,ofs(PIC_1),code_sel2,acc_int);

init_idt($21,ofs(keyb),code_sel2,acc_int+$60);

for i:=2 to 7 do

init_idt($20+i,ofs(PIC_1),code_sel2,acc_int);

for i:=8 to 15 do

init_idt($20+i,ofs(PIC_2),code_sel2,acc_int);

init_idt($30,ofs(int_30h),code_sel2,acc_trap);

init_idtr_p;

init_idtr_r;

pic(1);

save_sreg;

real_sp:=SPtr;

if cpu_type=2 then

{--------Переход в защищенный режим для МП 80386 и выше-----}

asm { Установка бита PE=1 в регистре управления CR0: }

db 0fh,20h,0c0h { MOV EAX,CR0 }

db 66h,0dh { OR EAX,1 }

dd 1h

db 0fh,22h,0c0h { MOV CR0,EAX }

end;

asm

db 0eah { Межсегментный переход на метку @prot }

dw offset @prot { для очистки буфера команд МП }

dw code_sel { и загрузки регистра CS }

@prot:mov ds,data_sel { DS, }

mov ss,stack_sel { SS }

mov es,video_sel { и ES }

mov ah,1 { Установка маркера: }

mov bx,1001h { строка 1, столбец 10 }

int 30h

mov ah,4 { Вывод строки s на экран: }

mov dh,1eh { видеоатрибут, }

mov si,offset s { адрес строки }

int $30

mov ah,1 { Установка маркера }

mov bx,004h

int 30h

mov ah,4 { Вывод строки s1 на экран: }

mov dh,30h

mov si,offset s1

int $30

mov ah,1 { Установка маркера }

mov bx,006h

int 30h

sti

@wait:

cmp semaf,0

jz @wait

cmp cpu_type,2

jnz @mov

db 9ah { межсегментный вызов процедуры reset }

dw offset reset

dw code_sel2

{---Подготовка к возврату в реальный режим по команде MOV---}

@mov:mov ds,data_sel

mov ss,data_sel

mov es,data_sel

{---------------Восстановление атрибутов IDT----------------}

db 0fh,01h,1eh { LIDT idtr_r }

dw idtr_r

{-------Возврат в реальный режим по команде MOV-------------}

db 0fh,20h,0c0h { MOV EAX,CR0 }

db 66h,25h { AND EAX,FFFFFFFEh }

dd 0fffffffeh

db 0fh,22h,0c0h { MOV CR0,EAX }

mov bx,offset ofs_ret

db 0ffh { Косвенный межсегментный переход на метку ret_r }

db 2fh { для очистки буфера команд МП и загрузки CS }

{db 2eh} {вместо 2fh}

{dw ofs_ret}

{-----------------Работа в реальном режиме------------------}

ret_r: xor ax,ax

mov ds,ax

mov ds,ds:[4*$60] { DS, }

mov ss,real_ss { SS, }

mov es,real_es { ES }

mov sp,real_sp { и SP }

end;

if res=0 then test_wr; { Если запрет сохранился - }

{ вырабатывается прерывание 13, обработчик которого }

{ с помощью процедуры reset сбрасывает МП }

{----------Размаскирование контроллеров прерываний----------}

port[$21]:=0; { первого КП }

port[$a1]:=0; { и второго КП }

{-----Разрешение маскируемых и немаскируемых прерываний-----}

en_int;

{-------------Проверка возникновения исключений-------------}

if excep<>$ff then {if excep=11 then

writeln(Обработано исключение 11 (селектор , err shr 3,))

else} writeln(Исключение ,excep);

{----------Анализ возврата МП из защищенного режима---------}

if res=0 then s:=по команде MOV else s:=через сброс МП;

writeln(Возврат из защищенного режима выполнен ,s);

writeln(prov=,prov,ss);

readkey;

end.



Не сдавайте скачаную работу преподавателю!
Данную курсовую работу Вы можете использовать для написания своего курсового проекта.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем курсовую работу самостоятельно:
! Как писать курсовую работу Практические советы по написанию семестровых и курсовых работ.
! Схема написания курсовой Из каких частей состоит курсовик. С чего начать и как правильно закончить работу.
! Формулировка проблемы Описываем цель курсовой, что анализируем, разрабатываем, какого результата хотим добиться.
! План курсовой работы Нумерованным списком описывается порядок и структура будующей работы.
! Введение курсовой работы Что пишется в введении, какой объем вводной части?
! Задачи курсовой работы Правильно начинать любую работу с постановки задач, описания того что необходимо сделать.
! Источники информации Какими источниками следует пользоваться. Почему не стоит доверять бесплатно скачанным работа.
! Заключение курсовой работы Подведение итогов проведенных мероприятий, достигнута ли цель, решена ли проблема.
! Оригинальность текстов Каким образом можно повысить оригинальность текстов чтобы пройти проверку антиплагиатом.
! Оформление курсовика Требования и методические рекомендации по оформлению работы по ГОСТ.

Читайте также:
Разновидности курсовых Какие курсовые бывают в чем их особенности и принципиальные отличия.
Отличие курсового проекта от работы Чем принципиально отличается по структуре и подходу разработка курсового проекта.
Типичные недостатки На что чаще всего обращают внимание преподаватели и какие ошибки допускают студенты.
Защита курсовой работы Как подготовиться к защите курсовой работы и как ее провести.
Доклад на защиту Как подготовить доклад чтобы он был не скучным, интересным и информативным для преподавателя.
Оценка курсовой работы Каким образом преподаватели оценивают качества подготовленного курсовика.

Сейчас смотрят :

Курсовая работа Профессиональная этика
Курсовая работа Факторы, формирующие качество сахарного печенья
Курсовая работа Проблемы реализации денежно-кредитной и фискальной политики в Республике Беларусь
Курсовая работа Современное сварочное оборудование
Курсовая работа Расчет себестоимости на предприятии
Курсовая работа Научная разработка технологии возделывания овса в Алнашском районе Удмуртской Республики
Курсовая работа Психолого-педагогическое сопровождение детей дошкольного возраста на разных этапах развития
Курсовая работа Анализ эффективности деятельности предприятия
Курсовая работа Заключение под стражу
Курсовая работа Эффективность использования рабочего времени на предприятии рабочими. (На примере ОАО "БРТ")
Курсовая работа Инвестиционная деятельность предприятия
Курсовая работа Экономические циклы, их виды и влияние на различные отрасли экономики
Курсовая работа Преступления против свободы личности
Курсовая работа Организация системы мотивации и стимулирования труда персонала гостиницы "Метрополь"
Курсовая работа Цирроз печени