- •Затверджую Начальник спеціальної кафедри № 5
- •Методична розробка
- •Тема 1. Мови асемблера та їх використання для побудови базових елементів системних програм.
- •Тема 1/1
- •Контрольні запитання з попереднього знайомства з системними програмами
- •Мета дисципліни
- •Призначення системних програм в захищених системах та технологіях комунікацій
- •Системні управляючі та обробляючі програми
- •2. Типова структура системних програм
- •3. Особливості архітектури і адресації даних в різних режимах роботи процесорів
- •Розрахунки логічних і фізичних адрес даних в пам'яті
3. Особливості архітектури і адресації даних в різних режимах роботи процесорів
Апаратура типового ВК на базі процесорів ix86 (як між іншим і на основі будь-якого іншого процесора) с точки зору програміста на Асемблері складається з центрального процесора (ЦП), що включає команди арифметики з плаваючою точкою, головної пам’яті (ГП), підсистеми введення-виведення. Такі складові частини обладнання як внутрішні робочі регістри, кеш-пам’ять, буфери, схеми синхронізації, внутрішня і системна шини, а також пристрої управління ними, як і їх конструктивна побудова залишаються недоступними або непомітними для програміста на Асемблері. Сукупність всіх програмно доступних апаратних засобів процесора прийнято називати архітектурою. Архітектура визначається форматами даних, що обробляються операційним блоком, і представленнями адресної інформації. При описі архітектури базового процесора будемо використовувати позначення, стандартизовані в мові Асемблера, виділяючи їх великими латинськими буквами, а позначення, що використовуються тільки в описовому плані – маленькими. Відзначимо, що для більшості трансляторів з мови Асемблера різниця між великими і маленькими буквами неістотна. Для метапозначень, які заміщаються в програмі конкретним текстом, будемо використовувати курсив.
Адресовані дані мінімального розміру базового ЦП сімейства Pentium займають один байт (BYTE), який складається з восьми бітів або двійкових розрядів даних. Більш складні дані ГП і арифметичного пристрою з плаваючою точкою FPU мають такі назви і символічні позначення типів: слово (WORD) – два байта для зберігання цілих чисел і частин адреси: сегмента і зміщення; подвійне слово (DWORD) – чотири байта для зберігання цілих і дійсних чисел і повних адрес пам’яті; 8-байтні (QWORD) і 10-байтні (TBYTE) дані для цілих і дійсних чисел, причому операції над даними двох останніх груп типів використовуються в основному в FPU. Всі багатобайтні дані і аналогічні елементи команд зберігаються в пам’яті так, що байти з молодшими розрядами розміщаються за меншими адресами, тому байти в машинному форматі представляються в зворотній послідовності відносно традиційного запису даних в позиційних системах числення. Такий спосіб подання надавав деякі переваги в процесорах малої розрядності і був успадкований в процесорах сімейства Pentium.
Архітектура базових процесорів сімейства Pentium і сумісних комп’ютерів показана на рис. 1.2. В 16-бітовому режимі процесори сімейства Pentium включають регістр прапорців стану f, покажчик адреси поточної команди ip, дві групи 16-розрядних регістрів, скорочено пойменованих англійською мовою у відповідності з їх призначенням. Регістри загального призначення AX, BX, CX, DX, а також базові і індексні регістри BP, SP, SI і DI, які зберігають операнди і результати операцій і можуть використовуватися для прискореного виконання окремих специфічних функцій. Так, регістр AX розглядається як акумулятор (Accumulator), куди зручно поміщати результати операцій, регістр ВХ використовується як базовий при обчисленні адреса (Base), CX – як лічильник (Counter) в спеціальних командах, а DX – може включати старші розряди вхідних арифметичних даних (Data) і результатів деяких операцій і включають адресу порту введення-виведення.
Зміщення в сегменті стану |
Мнемоніка 32-бітових розширень 32 16 |
Мнемоніки та номери 16-бітових регістрів 15 0 |
Призначення або назва регістра |
20h/0Eh |
EIP |
IP |
Покажчик команд |
24h/10h |
EFLAGS |
FLAGS |
Регістр прапорців |
28h/12h |
EAX {0} |
AH{4} AX{0} AL{0} |
Акумулятор |
2Сh/14h |
ECX {1} |
CH{5} CX{1} CL{1} |
Лічильник |
30h/16h |
EDX {2} |
DH{6} DX{2} DL{2} |
Регістр даних |
34h/18h |
EBX {3} |
BH{7} BX{3} BL{3} |
Регістр бази |
38h/1Ah |
ESP {4} |
SP{4} |
Покажчик стека |
3Сh/1Ch |
EBP {5} |
BP{5} |
Покажчик бази в стеку |
40h/1Eh |
ESI {6} |
SI{6} |
Індекс джерела |
44h/29h |
EDI {7} |
DI{7} |
Індекс приймача |
48h/22h |
0 |
ES{0} |
Додаткових даних |
4Сh/24h |
0 |
CS{1} |
Сегмент кодів |
50h/26h |
0 |
SS{2} |
Сегмент стека |
54h/28h |
0 |
DS{3} |
Сегмент даних |
58h |
0 |
FS |
Додаткові |
5Сh |
0 |
GS |
сегменти даних |
60h/2Ah |
0 |
LDTR |
Регістр локальної таблиці дескрипторів |
64h |
T 0 |
Двійковий блок |
Карта дозволу введення-виведення |
Рис. 1.2. Збереження програмно-доступних регістрів задачі в сегменті стану TSS
В 32-бітовому режимі замість них використовуються аналогічні імена регістрів з попередньою буквою E (Extended) EAX, EBX, ECX, EDX, EBP, ESP, ESI і EDI, з цих регістрів тільки ESP не може використовуватися як індексний або базовий. Можна окремо звертатися до їх старших і молодших байтів перших чотирьох регістрів, названих AH, BH, CH, DH (High) і AL, BL, CL, DL (Low), відповідно. Інші чотири регістри доцільно використовувати для зберігання адрес або покажчиків: SP (Stack Pointer) – як покажчик верхівки стека; BP (Base Pointer) – базовий покажчик при роботі зі стеком за непрямою адресою; SI (Source Index) і DI (Destination Index) – індексні регістри джерела і приймача інформації, які використовуються для визначення бази і індексу при непрямій і індексній адресаціях. Останні регістри найбільш ефективні в командах операцій над рядками.
Адресний простір раннього процесора 8086 і реальних режимів удосконалених процесорів утворюється в вигляді сегментів розміром до 64 Кбайтів. Доступ к байту або слову в пам’яті можливий, якщо адресований елемент знаходиться в межах одного з чотирьох (в процесорах Pentium – шести) поточних сегментів, адресованих сегментними регістрами. Кожний байт в межах сегмента адресується за допомогою шістнадцяти бітів відносної адреси (зміщення). За загальним правилом для процесорів сімейства Pentium в двобайтному слові за меншою адресою розміщується молодший байт, а за більшою – старший. Слово адресується через покажчик на адресу молодшого байта. Для визначення сегмента, в якому знаходяться дані, використовується 16-бітова сегментна адреса, яка розміщується в одному з сегментних регістрів.
Кожний байт пам’яті має фізичну і відповідну йому логічну адресу. Початкова фізична адреса сегмента реального режиму визначається як сегментна адреса, помножена на 16, а фізична адреса байта в сегменті визначається як сума початкової фізичної адреси сегмента і зміщення даного байта відносно початку сегмента.
Таким чином, фізична, ефективна або виконавча адреса в реальному режимі процесорів сімейства Pentium представляється 20-розрядним двійковим числом і використовується для читання і запису інформації в пам’яті. Однак в машинній програмі указуються не фізичні, а більш короткі частини логічних адрес в середині сегмента, які забезпечують гнучку адресацію. Логічна адреса складається з покажчика на сегментний регістр і зміщення (OFFSET) в середині сегмента.
