Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lekz._2.doc
Скачиваний:
3
Добавлен:
05.05.2019
Размер:
206.85 Кб
Скачать

1.3. Яким чином 16-розрядні процесори адресують пам'ять в один мільйон байт?

У регістрі міститься 16 біт. Оскільки адреса сегменту завжди на межі параграфа, молодші чотири біта адреси дорівнюють нулю.

Шістнадцяткове значення FFF0 дозволяє адресувати до 65520 (плюс зміщення) байт. Але фахівці вирішили, що немає сенсу утримувати місце для бітів, які завжди дорівнюють нулю.

Тому адреса зберігається в сегментному регістрі як шіст. nnnn, а комп'ютер вважає, що є ще чотири нульових молодших біта (одна шіст. цифра), тобто, шіст. nnnn0. Таким чином, шіст. FFFF0 дозволяє адресувати до 1048560 байт.

В разі, якщо ви сумніваєтеся, то декодуйте кожне шіст.F як двійкове 1111, врахуйте нульові біти і додайте значення для одиничних біт.

2. Операційна система, завантаження програм

Операційна система. Операційна система пропонує уніфікований, не залежний від типа пристрою, доступ до ресурсів комп'ютера для таких пристроїв, як клавіатура, дисплей і дискові накопичувачі. Апаратна незалежність (device independence) означає відсутність необхідності безпосереднього звернення до пристрою, оскільки операційна система може сама виконувати операції вводу/виводу (I/О) на рівні пристроїв, незалежно від того, яка програма замовила операцію.

Нас цікавлять наступні функції.

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

  • Ввод/вивід. Програми запитують початкові дані у системи і надають вихідні дані системі за допомогою переривань. Програмістові не потрібно кодувати низькорівневі операції вводу/виводу.

  • Завантаження програм. Коли користувач або програма запитують виконання іншої програми, завантажувач виконує послідовність кроків, потрібних для діставання доступу до цієї програми на диску, для її разме¬щенія в пам'яті і початки виконання.

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

  • Обробка переривань. Система дозволяє програмам діставати доступ до зовнішніх пристроїв за допомогою переривань.

Завантаження за допомогою BIOS. Включення живлення комп'ютера приводить до переходу процесора в стан запуску (reset state), очищенню пам'яті (запису нулів), проведенню перевірки парності пам'яті, завантаженню в регістр CS адреси FFFF[0]H і зміщенню 0 в регістр IP. Тому перша інструкція, що підлягає виконанню, знаходиться за адресою FFFF0h, сформованою парою CS:ІP. Це адреса точки входу в BIOS, що записана в ПЗП.

B IOS містить набір процедур, що дозволяють підтримувати пристрої. Процедура, що починається з адреси FFFF0h, перевіряє різні частини комп’ютера, щоб розпізнати і проініціалізувати пристрої, приєднані до нього (вона також містить функції читання і запису для цих пристроїв). Після цього BIOS створює дві області даних.

1. Область, що містить таблицю векторів переривань (Interrupt Vector Table), котра починається з адреси 0 і містить 256 4-байтних адрес у формі сегмент:зміщення. BIOS і операційна система використовують ці адреси для обробки переривань, що виникають в процесі роботи.

2. Область даних BIOS (BIOS Data Areas), яка починається з адреси 40[0]Н і зв'язана, в основному, із станом приєднаних пристроїв.

П

Рис. 2.3Інтерфейс вводу-виводу

отім BIOS визначає, чи доступний диск, на якому міститься операційна система, і, якщо доступний, викликає початковий завантажувач з диска. Ця програма завантажує системні файли з диска в пам'ять і передає їм управління. Системні файли містять драйвера пристроїв і інший код для роботи з апаратурою. Ці модулі ініціалізують внутрішні системні таблиці і системну частину таблиці векторів переривань.

Одне із завдань операційної системи – взаємодія з BIOS у разі потреби. Коли прикладна програма запрошує функції вводу/виводу (I/О) у операційної системи, остання передає запит BIOS, а BIOS працює безпосередньо з пристроєм. Проте в деяких випадках, наприклад, при роботі з клавіатурою і дисплеєм, програма звертається до BIOS безпосередньо. Інколи – хоча така практика зустрічається рідко і не і не рекомендуєма – програма безпосередньо звертається до пристрою.

Завантажувач системних програм. Як тільки BIOS передає управління операційній системі (OC), ви можете запросити виконання програми. Є два типи виконуваних файлів - .СОМ і .ЕХЕ. Програми типу .СОМ складаються з єдиного сегменту, що містить код, дані і стек. Цей тип програм корисний для створення невеликих утиліт або резидентних програм (це програми, що залишаються в пам'яті при виконанні інших програм). У реальному режимі програми типу .ЕХЕ складаються з роздільних сегментів коду, даних, стека і застосовуються для створення серйозніших застосувань.

Коли ви запрошуєте у системи виконання програми типу .ЕХЕ, завантажувач виконує наступні кроки.

  1. Знаходить програму на диску.

  2. Створює 256-байтний (100Н) префікс сегменту програми (program segment prefix, PSP) на межі параграфа в доступній внутрішній пам'яті.Загружает программу в память, непосредственно следующую за PSP.

3. Завантажує адресу PSP в регістри DS і ES.

4. Завантажує адресу сегмента коду в регістр CS і встановлює регістр ІР у значення, відповідне зміщенню першої інструкції (зазвичай 0) в сегменті коду.

5. Завантажує адресу стека в регістр SS і встановлює регістр SP в значення, рівне розміру стека.

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

Як вказано вище, завантажувач ініціалізував CS:IP і SS:SP. Але відмітьте, що він зберігає адресу PSP як в DS, так і в ES, хоча програма вимагає наявність в цих регістрах адреси сегменту даних. Тому програми типу .ЕХЕ повинні ініціалізувати регістр DS адресою сегменту даних (ми обговоримо це питання пізніше).

Захищений режим. У захищеному режимі (наприклад, в Windows), на відміну від реального режиму, процесор може переключатися між декількома завданнями. Кожна програма займає свою окрему ділянку пам'яті, і процесор повинен захищати цю ділянку і зберігати стан кожної програми. У реальному режимі сегментні регістри містять дійсні адреси сегментів, але можуть адресувати лише 1 мегабайт. Захищений режим вимагає набагато потужніших засобів адресації. Для цього він використовує таблиці, включно і ті, що наведені нижче:

  • Таблиці локальних дескрипторів (Local Descriptor Table, LDT). У відповідності з вимогами системи для кожного завдання наявна одна така таблиця. 16-розрядний регістр LDT містить адресу цієї таблиці для виконуваного в даний момент завдання.

  • Таблиця дескрипторів переривань (Interrupt Descriptor Table, IDT). Ця таблиця використовується при обробці операції переривання, а її адреса міститься в регістрі IDT.

• Таблиця глобальних дескрипторів (Global Descriptor Table, GDT). Ця таблиця містить адреси всіх LDT, а її адреса зберігається в 32-розрядному регістрі GDT.

Дійсні адреси сегментів зберігаються в таблицях дескрипторів: сегментні регістри (або селектори) містять покажчики на поточну таблицю LDT. Таблиці надають 32 розряди для адресації до 4 гігабайт пам'яті. Зазвичай таблиця векторів переривань розташована за адресою 0000:0000, але кожне завдання може мати свою власну її копію.

3. Стек

І .EXE, і .СОМ-файли вимагають резервування місця в програмі під стек. Стек має три основні призначення:

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

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

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

Завантажувач програм автоматично створює стек для програм .СОМ, але для програм типу .ехе стек повинен оголошуватися явно (тобто програмістом у програмі). В реальному режимі базовий елемент стека - слово (2 байти). Регістр SS, що ініціалізований завантажувачем, містить адресу початку стека. Регістр SP спочатку містить розмір стека, тобто значення, що вказує на байт, наступний за кінцем стека. Стек відрізняється від інших сегментів способом зберігання даних: він починає зберігати дані у комірці з найбільшою доступною адресою в сегменті, а наступні дані зберігає у комірках у бік зменшення адрес пам'яті.

Для зміни значення регістра SP використовуються інструкції (команди) PUSH і POP. Ці команди використовуються для запису даних в стек і читання їх зі стека. PUSH зменшує значення регістра SP на 2 і поміщає значення в слово, що адресується парою Ss:sp. POP прочитує значення зі слова, що адресується, і збільшує значення регістра SP на 2, переміщаючи покажчик на наступне за адресою слово.

Частина стека, що містить всі дані, поміщені в нього для окремої процедури, називається кадром стека (stасk frame). Наступний приклад ілюструє поміщення даних з регістрів АХ і ВХ в стек і подальше витягання даних назад зі стека в регістри. Передбачимо, що регістр АХ містить 026В, ВХ містить 04Е3, і SP містить 36. Адреса сегменту стека, що зберігається в регістрі SS, тут не важлива.

1. Спочатку стек порожній і має наступний вигляд.

0000

0000

0000

0000

Зміщення Кадр стека SP = 36

34

32

30

  1. PUSH АХ: зменшує значення регістра SP на 2 (до 34) і зберігає вміст регістра АХ (026В) в стеку. Відмітимо, що операція міняє місцями байти в слові, так що 026В перетворюється на 6В02.

6В02

0000

0000

0000

Зміщення Кадр стека

34 SP = 34

32

30

  1. PUSH ВХ: зменшує SP до 32 і зберігає вміст ВХ, тобто 04Е3, в стеку у вигляді Е304.

6В02

Е304

0000

0000

Зміщення Кадр стека

34

32 SP = 32

30

4. PОР ВХ: поміщає слово з комірок, на які вказує SP, в регістр ВХ і збільшує SP на 2 (до 34). Регістр ВХ тепер містить 04Е3 з правильно переставленими байтами.

6В02

Е304

0000

0000

Зміщення Кадр стека

34 SP = 34

32

30

5. POP АХ: поміщає слово з комірок, на які вказує SP, в регістр АХ і збільшує SP на 2 (до 36). Регістр АХ тепер містить 026В з правильно переставленими байтами.

6В02

Е304

0000

0000

Зміщення Кадр стека SP = 36

34

32

30

Відмітьте, що інструкції POP викликалися у порядку, зворотному інструкціям PUSH, тобто в прикладі вміст АХ записувався першим, але читався другим, а вміст ВХ записувався другим, але читався першим. Також зверніть увагу, що значення, записані в стек, не втрачаються після читання, хоча SP вже не вказує на них. Подальші операції PUSH замінять старі значення слів новими.

Слід пам'ятати, що написана програма повинна поєднувати поміщення елементів в стек і витягання їх зі стека. Хоча ця вимога видається простою і ясною, її порушення може привести до важко усуваних помилок. Крім того, для програми .ехе стек має бути чималим для зберігання всіх значень, які можуть бути в нього поміщені. Відмітьте: коли SP = 0, стек повний.

Інші інструкції, що працюють зі стеком:

• PUSHF і POPF: зберігають і відновлюють стан прапорів;

• PUSHA і РОРА (80286+): зберігають і відновлюють вміст всіх регістрів загального призначення (АХ, DX, СХ, ВХ, SP, BP, SI і DI) і збільшують/зменшують SP на 16;

• PUSHAD і POPAD (80386+): зберігають і відновлюють вміст всіх 32-розрядних регістрів загального призначення (ЕАХ. EDX, ECX, EBX, ESP, EBP, Еsi і EDI) і збільшують/зменшують SP на 32.

4. Регістри процесора

Сегментні регістри: CS, DS, SS і ES. Кожен сегментний регістр забезпечує адресацію дільниці пам'яті розміром 64К, котра називається поточним сегментом. Як показано раніше, сегмент вирівнюється на межі параграфа і його адреса в сегментному регістрі передбачає наявність справа чотирьох нульових бітів.

Регістр CS. Регістр сегменту коду містить початкову адресу сегменту коду. Ця адреса плюс величина зміщення в командному покажчику (IP) визначає адресу команди, яка має бути вибрана для виконання. Для звичайних (не дуже великих) програм немає необхідності робити посилання на регістр CS.

Регістр DS. Регістр сегменту даних містить початкову адресу сегменту даних. Ця адреса плюс величина зміщення, визначена в команді, вказують на конкретну комірку в сегменті даних.

Регістр SS. Регістр сегменту стека містить початкову адресу в сегменті стека.

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

Регістри загального призначення: AX, BX, CX і DX. При програмуванні на асемблері регістри загального призначення є «робочими конячками». Особливість цих регістрів полягає в тому що можлива адресація їх як одного цілого слова або як oднобайтової частини. Лівий байт є старшою частиною (high), а правий — молодшою частиною (low). Наприклад, двобайтовий регістр CX складається з двох однобайтових: CH і CL, і посилання на регістр можливі по будь-якому з цих трьох імен. Наступні три асемблерні команди засилають нулі в регістри CX, CH і CL, відповідно:

MOV CX,00 MOV CH,00 MOV CL,00

Регістр AX. Регістр AX є основним регістром і застосовується для всіх операцій вводу-виводу, деяких операцій над рядками і деяких арифметичних операцій. Наприклад, команди множення, ділення і зсуву передбачають використання регістра AX. Деякі команди генерують ефективніший код, якщо вони мають посилання на регістр AX.

AX: | AH | AL |

Регістр BX. Регістр BX є базовим регістром. Це єдиний регістр загального призначення, який може використовуватися в якості «індекса» для розширеної адресації. Інше загальне вживання його — обчислення.

BX: | BH | BL |

Регістр CX. Регістр CX є лічильником. Він необхідний для управління числом повторень циклів і для операцій зсуву вліво або вправо. Регістр CX використовується також для обчислень.

CX: | CH | CL |

Регістр DX. Регістр DX є регістром даних. Він застосовується для деяких операцій ввода/вивода і тих операцій множення і ділення над великими числами, які використовують регістрову пару DX і AX.

DX: | DH | DL |

Будь-які регістри загального призначення можуть використовуватися для додавання і віднімання як 8-, так і 16-ти бітових значень.

Регістрові вказівники: SP і BP. Регістрові вказівники (покажчики) SP і BP забезпечують системі доступ до даних в сегменті стека. Рідше вони використовуються для операцій додавання і віднімання.

Регістр SP. Вказівник стека забезпечує використання стека в пам'яті, дозволяє тимчасово зберігати адреси і інколи дані.

Цей регістр пов’язаний з регістром SS для адресації стека.

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

Індексні регистри: SI і DI. Обидва індексні регістри придатні для розширеної адресації і для використання в операціях додавання і віднімання.

Регістр SI. Цей регістр є індексом джерела і застосовується для деяких операцій над ланцюжками з простих елементів даних. У даному контексті регістр SI пов'язаний з регістром DS.

Регістр DI. Цей регістр є індексом призначення і застосовується також для ланцюжкових операцій. У даному контексті регістр DI пов'язаний з регістром ES.

Регістр командного покажчика: IP. Регістр IP містить зміщення на команду, яка має бути виконана. Зазвичай цей регістр в програмі не використовується, але він може змінювати своє значення при використанні відладчика DOS DEBUG для тестування програми.

Регістр прапорів Flags. Дев'ять з 16 бітів регістра прапорів є активними і визначають поточний стан процесу і результатів виконання. Багато арифметичних команд і команди порівняння змінюють значення прапорів.

Призначення прапорових бітів:

O (Переповнення). Вказує на переповнення розрядної сітки при арифметичних командах.

D (Направлення). Позначає ліве або праве направлення сканування адрес при пересиланні або обробці рядкових даних (даних в пам'яті, що перевищують довжину одного елемента).

I (Переривання). Вказує на можливість зовнішніх переривань.

T (Покроковий режим). Забезпечує можливість роботи процесора в покроковому режимі. Наприклад, програма DOS DEBUG встановлює даний прапор так, що можливе покрокове виконання кожної команди для перевірки зміни вмісту регістрів і комірок пам'яті.

S (Знак). Містить результуючий знак після арифметичних операцій (0 — плюс, 1 — мінус).

Z (Нуль). Показує результат арифметичних операцій і операцій порівняння (0 — ненульовий, 1 — нульовий результат).

A (Міжтетрадне перенесення). Містить перенесення з 3-го біта в 4-й для 8-бітних даних, використовується для спеціальних арифметичних операцій.

P (Контроль парності). Показує парність кількості одиничних бітів в молодшому байті даних (1 — парна і 0 — непарна кількість).

C (Перенесення). Містить перенесення зі старшого біта після арифметичних операцій, а також останній біт при зсувах, лінійних або циклічних. При програмуванні на асемблері найчастіше використовуються прапори O, S, Z, і C для арифметичних операцій і операцій порівняння, а прапор D для визначення направлення в операціях над рядками.

Примітка. Починаючи з моделі i80386DX, мікропроцесори Intel мають, в основному, 32-розрядні регістри. Їхня кількість, за винятком сегментних регістрів, така ж як і у і8086, але розмірність вдвічі більша, що і відображено в їхніх позначеннях, - вони мають приставку Е (Extended): EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI, EІP і EFlags. До сегментних регістрів CS, DS, SS, ES, які залишилися без розширення, додалися ще два регістри додаткових сегментів даних - FS і GS.

Ключові моменти

  • Включення комп'ютера вводить процесор в стан запуску, всі комірки пам'яті встановлюються в 0, проводиться перевірка парності пам'яті, а регістри CS і IP встановлюються в значення, відповідні початковій адресі BIOS в ПЗУ.

  • Для системного програмування найбільш важливим елементом ROM є BIOS (Basic Input/Output System) - базова система вводу/виводу.

  • Процесор зберігає слово даних в комірках пам’яті в зворотній послідовності: молодший байт за меншою адресою, а старший – за більшою адресою.

  • Сегменти – це спеціальні ділянки пам’яті, визначувані в програмі для зберігання коду, даних і стека.

  • Є два види (типа) виконуваних програм - .СОМ і .ЕХЕ.

  • Для того щоб завантажити на виконання програму типу .ЕХЕ, завантажувач створює 256-байтний (100Н) заголовок PSP на межі параграфа в пам'яті і розміщує програму відразу після PSP. Потім він завантажує aдpecу PSP в регістри DS і ES, завантажує адресу сегменту коду в CS, встановлює IP на першу інструкцію, що підлягає виконанню, завантажує адресу стека в SS і вказує в SP розмір стека. Після цього завантажувач передає управління виконуваній програмі.

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

  • Завантажувач програм визначає стек для програми типу .СОМ, але ви повинні явно визначати стек для програми типу .ЕХЕ.

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

  1. Покажіть розподіл адрес внутрішньої пам'яті комп'ютера.

  2. Поясніть інверсний порядок запису байтів в комірки пам'яті.

  3. Проілюструйте дві основні схеми адресації.

  4. Як визначаються сегменти, межі сегментів, зміщення в сегментах?

  5. Визначте 5 основних функцій операційної системи.

  6. Вкажіть кроки, зроблені системою при початковому завантаженні.

  7. Поясніть взаємодію DOS, BIOS і пристроїв вводу-виводу.

  8. У чому відмінність програм типу .СОМ від програм типу .ЕХЕ?

  9. Завантажувач створює і заповнює область даних перед виконуваним модулем, завантажуючи цей модуль для виконання. (а) Як називається ця область даних? (б) Який її розмір?

  10. Завантажувач програм виконує деякі дії при завантаженні програми типу .ЕХЕ. Які значення він записує в (a) SS і SР? (б) CS і IP? (в) DS і ES?

  11. Поясніть особливості захищеного режиму на відміну від реального режиму.

  12. Поясніть призначення стека, що таке кадр стека?.

  13. Як працюють команди PUSH і POP?

  14. Поясніть, яким чином визначається стек для (а) програми типу .Еxe, (б) програми типу .СОМ.

  15. (а) Де спочатку знаходиться вершина стека і як вона адресується? (б) Який розмір кожного запису в стеку?

  16. Охарактеризуйте групу сегментних регістрів.

  17. Охарактеризуйте групу регістрів загального призначення.

  18. Охарактеризуйте групу регістрів-покажчиків SP і BP.

  19. Охарактеризуйте групу індексних регістрів.

  20. Навіщо потрібний регістр ІР? Поясніть призначення прапорів регістра Flags.

10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]