МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ...

78
МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ЗАПОРІЗЬКИЙ ДЕРЖАВНИЙ УНІВЕРСИТЕТ КАФЕДРА ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ КОНСПЕКТ ЛЕКЦІЙ ЗА КУРСОМ Архітектура ЕОМ та АсемблерЧастина 1 Для студентів спеціальностей: «Прикладна математика»; «Інформатика» Затверджено вченою радою ЗДУ Протокол від .04.2004 ЗАПОРОЖЖЯ – 2004

Upload: others

Post on 25-May-2020

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ЗАПОРІЗЬКИЙ ДЕРЖАВНИЙ УНІВЕРСИТЕТ КАФЕДРА ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ

КОНСПЕКТ ЛЕКЦІЙ ЗА КУРСОМ

“Архітектура ЕОМ та Асемблер”

Частина 1

Для студентів спеціальностей: «Прикладна математика»; «Інформатика»

Затверджено вченою радою ЗДУ Протокол № від .04.2004

ЗАПОРОЖЖЯ – 2004

Page 2: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

2

УДК: 004.72:004.4’424(075.8)

ББК З973.2-02я73

Методичний посібник за курсом «Архітектура ЕОМ та Асемблер. Частина 1» для

студентів спеціальностей «Прикладна математика» та « Інформатика ».

Укладачі: Бровченко Є.Е.

Запоріжжя: ЗДУ, 2004. –с. 78

У конспекті лекцій доводяться основні теоретичні та практичні положення

архітектури ЕОМ та мікропроцесорів Intel 80/х86 та мови програмування асемблер.

Укладачі: Є.Е. Бровченко;

Рецензент: В.А. Ермолаєв;

Коректор: Є.Е. Бровченко;

Відповідальний за випуск: Є.Е. Бровченко

Page 3: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

3

Зміст Зміст................................................................................................................................................. 3 Введення. Функціонування обчислювальних машин з шинною організацією. ...................... 4

Шинна організація IBM PC............................................................................................... 4 Організація системи шин L, S, X і M в комп'ютері РС/АТ............................................ 5 Еволюція шинної архітектури .......................................................................................... 8 Розвиток архітектури IA-32 в сімействі Pentium.......................................................... 10 Мікроархітектура процесорів Pentium 4........................................................................ 13 Архітектура систем на базі Pentium 4............................................................................ 17

Програмна модель мікропроцесора............................................................................................ 18 Призначені для користувача регістри............................................................................ 18 Регістри загального призначення ................................................................................... 19 Сегментні регістри........................................................................................................... 20 Регістри полягання і управління .................................................................................... 21 Системні регістри мікропроцесора ................................................................................ 24 Регістри управління ......................................................................................................... 24 Регістри системних адрес................................................................................................ 25 Регістри відладки ............................................................................................................. 25

Організація пам'яті ....................................................................................................................... 26 Структура програми на асемблері .............................................................................................. 29

Синтаксис асемблера ....................................................................................................... 29 Директиви сегментації .................................................................................................... 38

Типи даних .................................................................................................................................... 44 Масиви .............................................................................................................................. 50 Структури ......................................................................................................................... 60 Об'єднання ........................................................................................................................ 64 Записи ............................................................................................................................... 65

Структура машинної команди .................................................................................................... 71 Способи завдання операндів команди ........................................................................... 74 Пряма адресація ............................................................................................................... 75 Непряма базова (регістрова) адресація.......................................................................... 77 Непряма базова (регістрова) адресація із зсувом ......................................................... 77 Непряма індексна адресація із зсувом ........................................................................... 77 Непряма базова індексна адресація ............................................................................... 77 Непряма базова індексна адресація із зсувом ............................................................... 78

Література ..................................................................................................................................... 78

Page 4: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

4

Введення. Функціонування обчислювальних машин з шинною організацією. На початку ми познайомимося з основними принципами схемної (шинної) організації

серійних ЕОМ сімейства IBM PC. Ви познайомитеся з тими етапами еволюції, які пройшли сучасні мікрокомп’ютери у міру вдосконалення їх елементної бази, дізнаєтеся про структурні зміни, що забезпечують досягнення максимально можливої швидкодії ЕОМ. В процесі вивчення ви познайомитеся з основними шинами - локальної, системної і іншими, їх призначенням і конкретною схемотехнічною реалізацією. Для швидкого і якісного засвоєння матеріалу вам будуть потрібно певні знання, придбані при вивченні дисциплін “Електроніка” (знання регістрів, шинних формувачів, буферних елементів) і “Організація ЕОМ” ( шини і шинні протоколи).

Шинна організація IBM PC. У основу архітектури IBM PC спочатку був встановлений принцип відвертості, який

став її відмінною рисою. Основні конкуренти IBM в області персональних машин дійшли цього тільки через декілька років після того, як вказаний принцип дозволив персональним комп'ютерам фірми IBM практично завоювати комп'ютерний ринок.

Принцип відвертості грунтується по-перше, на надзвичайно розвиненій в IBM PC системі переривань, яка дозволяє “підключати” програми користувача до всіх ресурсів системи на усякому рівні, доступному користувачу, а по-друге, на системі шин, організуючій інформаційні потоки так, щоб не лише дозволити користувачу підключати до ресурсів процесора свої апаратні засоби (можливо, нестандартні), але і дати можливість самій архітектурі удосконалюватися і розвиватися за рахунок введення додаткових або нових компонентів без яких-небудь принципових змін в організації інформаційних потоків.

Зупинимося на шинній організації інформаційних потоків, яка бере свій початок з першої моделі IBM PC і еволюціонує сьогодні. Шину мікрокомп'ютера утворює група ліній передачі сигналів з адресною інформацією, інформацією про передавані дані, а також

управляючих сигналів. Фактично її можна розділити на три частини: адресну шину, шину даних і шину управління.

Рівні цих сигналів в кожний момент часу визначають полягання всієї обчислювальної системи у цей момент. Далі ми прив'яжемо обговорення цих принципів функціонування до конкретної архітектури ЕОМ, сумісних з IBM PC AT-286 і 386. На рис.1. зображено ядро гіпотетичної обчислювальної системи, що включає синхрогенератор i82284, мікропроцесор i80286 і математичний співпроцесор i80287, а також шинний контроллер i82288.

Page 5: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

5

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

На адресну шину, що складається з 24 ліній, мікропроцесор i80286 виставляє адресу байта або слова, які пересилатимуться по шині даних в процесор або з нього. Крім того, шина адреси використовується мікропроцесором для вказівки адрес (номерів) периферійних портів, з якими проводиться обмін даними.

Шина даних складається з 16 ліній, по яких можлива передача як окремих байтів, так і двобайтових слів. При пересилці байтів можлива передача окремо як по старших 8 лініях, так і по молодших. Шина даних двунаправлена, оскільки передача байтів і слів може проводитися як в мікропроцесор, так і з нього. Шина управління формується сигналами, по-перше, поступаючими безпосередньо від мікропроцесора, по-друге, сигналами, сформованими системним контроллером, і, по-третє, сигналами, що йдуть до мікропроцесора від інших мікросхем і периферійних адаптерів. Мікропроцесор використовує системний контроллер для формування управляючих сигналів, що визначають правила перенесення даних по шині. Він виставляє три сигнали S0, S1, M/IO (висновки 5, 4 і 65), які визначають тип циклу шини (підтвердження переривання, читання порту уведення-виведення, запис в порт уведення-виведення, останов, читання пам'яті, запис в пам'ять). На підставі значень цих сигналів системний контроллер формує управляючі сигнали, що визначають послідовність процесів даного типу циклу шини.

Для того, щоб зрозуміти динаміку роботи шини, розберемо, яким чином процесор здійснює читання слова з оперативної пам'яті. Це відбувається протягом чотирьох тактів CLK (тактових імпульсів на вході 31 мікропроцесора), або двох внутрішніх полягань процесора (тобто кожне полягання процесора триває 2 такти синхросигналу CLK). Під час першого полягання, що позначається як Ts, процесор виставляє на адресну шину значення адреси, по якій читатиметься слово. Крім того, він формує на шині спільно з шинним контроллером відповідні значення управляючих сигналів. Ці сигнали і адреса обробляються схемою управління пам'яттю, внаслідок чого, починаючи з середини другого полягання процесора Ts (тобто на початку четвертого такту CLK) на шині даних з'являється значення вмісту відповідного слова з оперативної пам'яті. І, нарешті, процесор прочитує значення цього слова з шини даних. На цьому перенесення (копіювання) значення слова з пам'яті в процесор закінчується.

Таким чином, якщо частота кварцового генератора Y1 визначаюча частоту CLK, рівна 12 Мгц, то максимальна пропускна спроможність шини даних нашої ЕОМ рівна (12/4) мільйонів слів в секунду, або 6 МВ/сек. Реальна пропускна спроможність істотно нижче (нагадаємо, що йдеться про дуже стару ЕОМ). Вся подальша історія розвитку ЕОМ, по суті, є нескінченною чередою інженерних рішень, що підвищують швидкість циркуляції інформації усередині обчислювальної машини, і швидкість обміну інформацією із зовнішнім світом.

Організація системи шин L, S, X і M в комп'ютері РС/АТ. Слід зазначити, що описана вище система з однієї, розбитої на три секції, шини,

використовувалася лише в стародавніх ЕОМ класу IBM PC XT. Маючи назву “Загальна шина”, вона і насправді пронизувала весь комп'ютер, дозволяючи з'єднати в кожний момент часу процесор з одним з приладів пам'яті або одним з контроллерів периферійних пристроїв. Насправді в нашому комп'ютері є не одна, а декілька шин (см.рис.2.). Основних шин чотири, і позначаються вони як L-шина, S-шина, М-шина і X-шина. Нами тільки що

Page 6: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

6

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

Основною шиною, що зв'язує комп'ютер в єдине ціле, є S-шина, або системна шина, до якої, крім того, підключаються адаптери периферійних пристроїв, що не входять до складу системного ядра. Протоколи і номенклатура сигналів цієї шини детально висловлені в розділі “Системна шина ЕОМ”. Саме вона виведена на 8 спеціальних роз'ємів-слоти. Ці слоти добре видні на системній платні комп'ютера: в них встановлена платня периферійних адаптерів (дисплея, флоппи-диска, вінчестера, миші і т.д.).

При переході з шини L на шину S сигнали процесора повинні зазнати певну трансформацію. Зокрема, максимальна здатність навантаження ліній мікропроцесора не перевищує одного TTL входу, оскільки максимальний вихідний струм цих ліній не повинен перевищувати 1мА. Тому між лініями L - шини і S - шини повинні розташовуватися буферні елементи, що підвищують потужність висновків як мінімум в сто разів. Крім того, шина даних мікропроцесора, як ми побачимо надалі, не завжди повинні з'єднуватися з рештою частин ЕОМ. При виконанні так званого позапроцесорного обміну мікропроцесор взагалі повинен бути відключений від решти схем комп'ютера. Підвищення здатності навантаження шини даних L на стику з шиною даних S при забезпеченні реверсивності напряму переміщення інформації досягається вживанням двох мікросхем двонаправлених шинних формувачів U100 типа LS245 і U102 типа ALS646. Перша з них є приладом з найпростішою логікою управління. Інверсний вхід Біля включає мікросхему при появі на ньому рівня логічного нуля, а вхід X забезпечує перемикання напряму переміщення інформації - зліва направо (від ліній D(0) - D(15) до ліній SD(0) - SD(15), тобто від локальної шини L до системної шини S) або справа наліво (в протилежному напрямі).

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

Лінії адреси, що йдуть від мікропроцесора, утворюють так звану локальну адресну шину. Її не прийнято іменувати LA - шиною, оскільки цей термін використовується для

інших цілей. Для передачі адреси на системну шину адреси або SА-шину є спеціальні буферні регістри-клямки. Ці регістри-клямки не лише передають адресу з L-шины на S-шину, але також роз'єднують їх у разі потреби. Така необхідність виникає, наприклад, коли здійснюється прямий доступ до пам'яті. В цьому випадку адреси на S-шину виставляють контроллер прямого доступу i8237А5 і так звані сторінкові регістри. Вони підключені до X-шине, яка також через буферні регістри сполучена з системною S-шиной. Таким чином, наявність трьох шин - джерел адресної інформації - дозволяє виставляти адреси на системну шину різним мікросхемам.

Page 7: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

7

Защипування (цей поширений в середовищі інженерів - електронщиків термін позначає збереження інформації в регістрі) коду адреси необхідне з наступної причини. До того моменту, коли на шинах даних з'являється інформація, що підлягає переміщенню в мікропроцесор або з нього, повинен бути вже підготовлений тракт передачі цієї інформації від джерела до приймача, що проходить через систему шин і утворений цілим набором буферних підсилювачів і шинних формувачів. Як відомо, перемикання виведень мікросхем з високоімпедансного полягання в робоче, а також перемикання напряму передачі інформації вимагає певного часу. Крім того, час затрачується на дешифрацію елементів, що беруть участь в даному обміні. Отже, адресна інформація повинна бути виставлена на шину завчасно - ще в кінці машинного циклу, передуючого циклу даного обміну, і зберігатися в регістрі. Крім того, для максимально можливого збільшення швидкості обміну адресна інформація, необхідна для дешифрації периферійних мікросхем, взагалі фіксується і бере участь в підготовці обміну починаючи приблизно з середини попереднього циклу. Цей варіант адреси, що утворюється на лініях LA(17) - LA(23), і відповідний адресі обміну в наступному циклі, міняється вже тоді, коли на решті ліній адреси системної шини ще присутня інформація, відповідна адресі обміну в поточному циклі.

Третім компонентом з'єднання локальної і системної шин є пристрій формування сигналів шини управління - так званий системний контроллер, реалізований на мікросхемі i82288. Формування сигналів на цій шині ускладнюється тим, що сигнали управління процесом переміщення інформації по шинах комп'ютера формуються на виведеннях мікропроцесора в кодованому вигляді: по суті, мікропроцесор інформує обчислювальну систему про номер типу машинного циклу, виконуваного в даний момент часу. Ця інформація для подальшого використовування в системі з розділеною шиною повинна дешифруватися і стосовно кожного типу машинного циклу необхідно сформувати певну послідовність управляючих сигналів. Найважливішими з них є сигнали управління читання з пам'яті MEMR, записи в пам'ять MEMW, введення з порту IOR, висновку в порт IOW, а також строб циклу вектора переривання INTA.

Всі мікросхеми на системній платні, окрім процесора, співпроцесора і пам'яті, підключені до X-шине, в якій є адресна частина (XA-шина), лінії даних (XD-шина) і управляючі сигнали (XCTRL-шина). Тому вони відокремлені від процесора двома буферами: між ХА - і SА - шинами і між SD- і XD-шинами

Узгодження системної адресної шини з шиною адреси Х дещо відрізняється від відповідного стику між локальною і системною шинами. В даному випадку відсутня необхідність защипування інформації (це вже зроблено), зате з'являється необхідність двонаправленої передачі адресної інформації. Остання обставина пояснюється наступними причинами. Пряма передача - від шини S до шини Х - відповідає варіанту обміну, вироблюваному під управлінням мікропроцесора. В цьому випадку адреса периферійного пристрою формується в мікропроцесорі і передається по ланцюжку L - S - X. Зворотна передача - від шини Х до шини S - відповідає варіанту обміну, вироблюваного під управлінням контроллера прямого доступу в пам'ять. В цьому випадку адреса елементу пам'яті формується в контроллері ПДП і передається по ланцюжку X - S - M. Певні особливості характерні для з'єднання шин даних S і Х. Відзначимо, що ширина шин даних LD і SD рівна 16 біт, а ширина XD-шини складає 8 біт, що знайшло віддзеркалення в її назві - "восьмирозрядне відгалуження системної шини". Необхідність вказаного з'єднання пояснюється тим, що розробники IBM PC AT 286 застосували значне (більше десять) число периферійних контроллерів, розроблених ще в сімдесятих років і мають восьмирозрядну архітектуру. Для забезпечення зв'язку між шинами використовуються мікросхеми U97 і U99.

Page 8: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

8

Якщо взаємодія шин L і S проводиться як словами, так і байтами, то по шині Х інформація може переміщатися тільки байтами. Тому можливі два варіанти роботи схеми. В першому випадку, при переміщенні інформації від молодших розрядів шини S (SD(0) - SD(7)), спрацьовує елемент U97, і обмін йде звичним порядком.

У другому випадку, при переміщенні старшого байта SD(8) - SD(15), шлях подовжується. Спочатку інформація за допомогою елементу U99 переміщається із старших на молодші розряди шини S. При цьому повинна виключатися поява інформації від мікропроцесора на молодшій частині шини S. Досягається це особливим алгоритмом відключення одного з буферів між шинами L і S (мікросхема U102, схема 2 Додатки А). Після цього з молодших розрядів системної шини інформація звичним порядком переміщається на шину Х.

Окрім цих трьох L -, S -, X - шин в комп'ютері IBM PC AT 286 є М - шина, призначена для відділення системної S-шины від оперативної пам'яті. Перехід між шинами даних SD і MD показаний на схемі 6 (шинні формувачі F245 - U95 і U48), причому ширина MD-шини складає 16 ліній, як і ширина SD-шини.

Проте ширина адресної MA-шини рівна 10 лініям, оскільки перехід адреси на неї від SA-шини відбувається через мультиплексори (див. схему 8 “Додатку А”, мультиплексори F158 - U107 і U104, F153 - U106). Спочатку на MA-шину виставляються молодші 10 розрядів адреси, сформованої до цього моменту на шині S, а потім 10 старших розрядів. Ширина цієї шини може розрізнятися в різних реалізаціях IBM РС АТ і визначається типом елементів динамічної пам'яті, на яких реалізована оперативна пам'ять комп'ютера. В найпершій моделі РС/АТ виробництва фірми IBM вона рівна 8 лініям.

Еволюція шинної архітектури Коли мікропроцесор з розглянутою шинною архітектурою виконує, наприклад,

команду читання з пам'яті, дія (адреса і сигнали управління) з локальної L шини потрапляє на системну S шину, а тільки потім на шину пам'яті M. Після цього дані, лічені з пам'яті, знову-таки потрапляють на системну шину, а з неї - на локальну. Очевидно, що кожне перенесення інформації через той або інший буферний елемент супроводжується певною затримкою. І хай одна затримка невелика (не більше 10 наносекунд), але сумарно їх набирається досить багато, що і визначає ту досить низьку тактову частоту, на якій працювали перші IBM PC, - 12, або навіть 8 Мгц.

Для усунення таких втрат в більш пізніх моделях IBM PC AT 286 основна оперативна пам'ять виділяється в особливу підсистему і доступ до неї здійснюється не через системну шину, а паралель з доступом до системної шини. Як правило, це пов'язано з наявністю інтегрованого контроллера шини даних, такого як наприклад ST62BC004 в комплекті БІС SUNTAС 286. Сумарна затримка передачі даних в цьому випадку скорочується приблизно до 20 нс, а тактова частота підвищується до 25 Мгц. Подальше вдосконалення систем в цьому напрямі привело до тому, що перехід від шини даних LD локальної шини до шини MD шини пам'яті спростився до межі.

Page 9: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

9

Функцію контролеру шини даних в цьому випадку виконує звичний шинний

формувач. На перший погляд, в ньому немає необхідності і можна б було просто об'єднати шини LD і MD. Але по міркуваннях узгодження електричних сигналів цього не можна робити. Вона характерна для IBM PC AT 386. Подальші можливості підвищення продуктивності процесора пов'язані з пошуками рішень в області архітектури РС АТ. Введення кеш- пам'яті дозволило ослабити вимоги за часом доступу до основної оперативної пам'яті (кеш-пам'ять - це статична пам'ять з малим часом доступу, яка не “видна” для програмного забезпечення. Об'єм її коливається від 128Кбайт до 1 Мбайт). При цьому на локальній шині, окрім мікропроцесора і співпроцесора, з'являється контроллер управління кеш- пам'яттю. При об'ємі пам'яті 128 Кбайт вірогідність того, що необхідна мікропроцесору інформація опиниться в кеш-пам'яті, складає 95-98%. Ефективність кеш-пам'яті стає значною на частотах вище 20 Мгц, оскільки в цьому випадку втрати продуктивності через затримки доступу до оперативної пам'яті дуже чутливі.

Найвідомішим є контроллер кеш-пам'яті 82385 фірми Intel. Але деяке спізнення з

його появою на ринку і сумнів в тому, що він відповідатиме по параметрах на робочих частотах 25 і 33 Мгц, примусило деякі фірми, такі як ALR, COMPAQ, розробити свої контроллери кеш-пам'яті.

Page 10: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

10

Подальші архітектурні зміни пов'язані з переходом від процесорів, що мають 32 розрядні шини даних (i80386 і i80486), до процесорів, що мають 64 розрядні шини, а саме до процесорів Pentium, Pentium Pro і Pentium II.

Розвиток архітектури IA-32 в сімействі Pentium Будучи випущеним в 1995 році, процесор Intel Pentium Pro став першим CPU з

архітектурою P6. З тих пір пройшло вже достатньо багато часу, змінилося декілька поколінь процесорів, проте, по суті архітектура не мінялася. Сімейства Pentium II, Pentium III і Celeron мають всю ту ж будову ядра, відрізняючись по суті тільки розміром і організацією кеша другого рівня і наявністю набору команд SSE, що з'явився в Pentium III. Природно, рано чи пізно архітектура P6 повинна була застаріти. І справа тут зовсім не в неможливості подальшого нарощування тактових частот і навіть не в тій, що загострилася останнім часом конкуренцією з AMD. Звичайно, не можна заперечувати той факт, що досягнувши частоти в 1 ГГц Intel зіткнувся з проблемами в подальшому нарощуванні частоти своїх процесорів: Pentium III 1.13 ГГц навіть довелося відкликати у зв'язку з його нестабільністю. Проте, цю проблему легко можна розв'язати переходом на 0.13 мкм процес - тим паче, що його повсюдне упровадження не за горами. Справжня причина необхідності нової архітектури криється глибше. На жаль, подальше нарощування частоти існуючих процесорів приводить все до меншого зростання їх продуктивності. Проблема в тому, що латентності, тобто затримки, що виникають при зверненні до тих або інших вузлів процесора, за нинішніми мірками в P6 вже дуже великі. Саме це з'явилося основною причиною, по якій Intel затіяв розробку Pentium 4, яка виконана з чистого листа. Таким чином, анонсований сьогодні Pentium 4 - абсолютно новий процесор, нічого загального не має з своїми попередниками. Внутрішня структура (мікроархітектура) процесора Pentuim 4 значно відрізняється від мікроархітектури попередніх моделей Pentium II, Pentium III, Celeron. В його основі лежить архітектура, названа Intel NetBurst architecture. Цією назвою Intel хотів підкреслити, що основна мета нового процесора - прискорити виконання задач потокової обробки даних, напряму пов'язаних з Internet, що бурхливо розвивається.

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

У процесорі Pentium 4 реалізується архітектура IA-32 (Intel Architеcture-32), загальна для всіх 32-розрядних мікропроцесорів Intel, починаючи з i386. В табл. 1 приведені основні моделі процесорів, в яких використовується ця архітектура, і деякі їх характеристики. Треба відзначити, що моделі Pentium II Xeon і Pentium III Xeon орієнтовані на роботу у високопродуктивних мультипроцесорних системах (серверах, робочих станціях). Для цих же додатків планується випуск в 2001 році модифікації процесора Pentium 4 з підтримкою мультипроцесорного режиму роботи (назва проекту — Foster).

Таблиця 1. Деякі характеристики процесорів архітектури IA-32

Модель, початок випуску

Число транзисторів

Тактова частота, Мгц

Об'єм внутрішньої кеш-пам'яті

i386, жовтень 1985 р. 275 тис. до 40 Ні

i486, квітень 1989 р. 1,2 млн. до 100 8 Кбайт - команди 8 Кбайт - дані

Pentium, березень 1993 3,1 млн. до 200 8 Кбайт - команди

Page 11: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

11

р. 8 Кбайт - дані

Pentium Pro, листопад 1995 р.

5,5 млн. до 200 8 Кбайт - команди 8 Кбайт - дані

Pentium MMX, січень 1997 р.

4,5 млн. до 233 8 Кбайт - команди 8 Кбайт - дані

Pentium II, травень 1997 р. (Xeon, червень 1998 р.)

7,5 млн. до 450 16 Кбайт - команди 16 Кбайт - дані

Celeron, квітень 1998 р. до 750 128 Кбайт - загальний

Pentium III, лютий 1999 р. (Xeon, березень 1999 р.)

8,5 млн. до 1000 (до 700) 16 Кбайт - команди 16 Кбайт - дані

Pentium 4, листопад 2000 р. (Foster, 2001 р.)

42 млн. до 1500 (2000) 256 Кбайт - загальний 12 До - мікрокоманди 8 Кбайт - дані

Історія архітектури IA-32 налічує вже більше 15 років, і її основні риси достатньо повно описані. Тому обмежимося їх коротким оглядом.

У процесі розвитку IA-32 проводилося розширення можливостей обробки даних, представлених в різних форматах (мал. 1). Процесори i386 виконували обробку тільки цілочисельних операндів. Для обробки чисел з “плаваючою крапкою” використовувався зовнішній співпроцесор i387, що підключається до мікропроцесора. До складу процесорів i486 і подальших моделей Pentium введений спеціальний блок FPU (Floating-Point Unit), що виконує операції над числами з “плаваючою крапкою”. В процесорах Pentium MMX була вперше реалізована групова обробка декількох цілочисельних операндів розрядністю 1, 2, 4 або 8 байт за допомогою однієї команди. Така обробка забезпечується введенням додаткового блоку MMX (Milti-Media Extension — Мультимедійне Розширення). Назва блоку відображає його спрямованість на обробку відео- і аудіоданих, коли одночасне виконання однієї операції над декількома операндами дозволяє істотно підвищити швидкість обробки зображень і звукових сигналів. Починаючи з моделі Pentium III, в процесори вводиться блок SSE (Streaming SIMD Extension — Потокове SIMD-розширення) для групової обробки чисел з “плаваючою крапкою”.

Мал. 1. Еволюція архітектури IA-32

Таким чином, якщо перші моделі процесорів Pentium виконували тільки пооперандну обробку даних за принципом “Одна команда – Одні дані” (SISD — Single Instruction – Single Data), то, починаючи з процесора Pentium MMX, реалізується також їх групова обробка за принципом “Одна команда – Багато даних” (SIMD — Single Instruction – Multiple Data).

Page 12: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

12

Відповідно, розширяється і набір регістрів процесора, що використовуються для проміжного зберігання даних (мал. 2). Окрім 32-розрядних регістрів для зберігання цілочисельних операндів, процесори Pentium містять 80-розрядні регістри, які обслуговують блоки FPU і MMX. При роботі FPU регістри ST0-ST7 утворюють кільцевий стек, в якому бережуться числа з “плаваючою крапкою”, представлені у форматі з розширеною точністю (80 розрядів). При реалізації MMX-операцій вони використовуються як 64-розрядні регістри MM0-MM7, де можуть берегтися декілька операндів (8 8-розрядних, 4 16-розрядних, 2 32-розрядних або один 64-розрядний), над якими одночасно виконується команда, що поступила в процесор (арифметична, логічна, зсув і ряд інших).

Мал. 2. Регістри зберігання даних в процесорах Pentium

Блок SSE-2, введений до складу процесора Pentium 4, значно розширює можливості обробки декількох операндів за принципом SIMD, в порівнянні з блоком SSE в моделі Pentium III. Цей блок реалізує 144 нові команди, що забезпечують одночасне виконання операцій над декількома операндами, які розташовуються в пам'яті і в 128-розрядних регістрах XMM0-XMM7. В регістрах можуть берегтися і одночасно оброблятися 2 числа з "плаваючою крапкою" у форматі подвійної точності (64 розряди) або 4 числа у форматі одинарної точності (32 розряди). Цей блок може також одночасно обробляти цілочисельні операнди: 16 8-розрядних, 8 16-розрядних, 4 32-розрядних або 2 64-розрядних. В результаті продуктивність процесора Pentium 4 при виконанні таких операцій виявляється удвічі вище, ніж Pentium III. SSE2 же оперує з тими ж самими регістрами і назад сумісний з SSE процесора Pentium III. Тобто, тепер SSE2 будучи симбіоз MMX і SSE і дозволяє працювати з будь-якими типами даних, що влізають в 128-бітові регістри.

Мал. 3. SSE2

Таким чином, SSE2 набагато більш гнучкий, дозволяючи добиватися вражаючого приросту в продуктивності. Операції SSE-2 дозволяють істотно підвищити ефективність процесора при реалізації тривимірної графіки і інтернет-додатків, забезпеченні стиснення і кодування аудіо- і відеоданих і у ряді інших вживань.Проте, використовування нового набору команд вимагає спеціальної оптимізації програм, тому чекати його упровадження відразу після виходу нового процесора не варто. З часом же, SSE2 має достатньо великі перспективи. Старі ж програми, не використовуючі SSE2, а що покладаються на звичний арифметичний співпроцесор, ніякого приросту в продуктивності при використовуванні Pentium 4 не одержать. Введення великої групи команд SSE-2 є основною особливістю реалізованого в Pentium 4 варіанту архітектури IA-32. Що стосується базового набору команд і способів адресації операндів, що використовуються, то вони практично повністю співпадають з набором команд і способів адресації в попередніх моделях Pentium.

Page 13: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

13

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

Мікроархітектура процесорів Pentium 4 Основні особливості процесора Pentium 4 пов'язані з його мікроархітектурою.

Мікроархітектура процесора визначає реалізацію його внутрішньої структури, принципи виконання поступаючих команд, способи розміщення і обробки даних. Як анонсувала компанія Intel, нова мікроархітектура процесора Pentium 4, що одержала назву NetBurst (пакетно-мережна), орієнтована на ефективну роботу з інтернет-додатками. Необхідно відзначити, що в мікроархітектурі NetBurst реалізовано багато принципів, використаних в попередній моделі Pentium III (мікроархітектура P6 [2]). Характерними рисами цієї мікроархітектури є:

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

паралельно працюючих виконавчих пристроях; динамічна зміна послідовності команд (виконання команд з випередженням —

спекулятивне виконання); конвейєрне виконання команд; прогноз напряму галужень. Практична реалізація даних принципів в структурі процесора Pentium 4 має ряд

істотних особливостей (мал. 4).

Мал. 4. Загальна структура Pentium 4

Гарвардська внутрішня структура реалізується шляхом розділення потоків команд і даних, що поступають від системної шини через блок зовнішнього інтерфейсу і розміщену на кристалі процесора загальну кеш-пам'ять 2-го рівня (L2- Advanced Transfer Cache) місткістю 256 Кбайт. Таке розміщення дозволяє скоротити час вибірки команд і даних в порівнянні з Pentuim III, де ця кеш-пам'ять розташовується на окремому кристалі,

Page 14: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

14

змонтованому в загальному корпусі (картріджі) з процесором. Оскільки Pentium 4 розрахований на обробку потокових даних, швидкість роботи L2-кеша для нього є одним з ключових моментів. Тому, Intel збільшив пропускну спроможність кеша другого рівня в Pentium 4 в два рази. Це удосконалення було зроблено завдяки передачі даних з L2-кеша на кожний процесорний такт, в той час, як дані з L2-кеша Pentium III передаються тільки на кожний другий такт. Таким чином, пропускна спроможність L2-кеша Pentium 4, працюючого, наприклад, з частотою 1.4 ГГц має тепер значну величину 44.8 Мбайт/с. Для порівняння - пропускна спроможність Advanced Transfer Cache біля Pentium III 1 ГГц складає 16 Гбайт/с. Також як і в Pentium III, L2 кеш має вісім областей асоціативності і рядка завдовжки 128 байт. Проте, на відміну від Pentium III, кожний рядок може бути вилучена не цілком, а по 64-байтових половинках.

Блок зовнішнього інтерфейсу реалізує обмін процесора з системною шиною, до якої підключається пам'ять, контроллери уведення-виведення і інші активні пристрої системи. Обмін по системній шині здійснюється за допомогою 64-розрядної двонаправленої шини даних, 41-розрядної шини адреси (33 адресні лінії А35-3 і 8 ліній вибору байтів BE7-0#), що забезпечує адресацію до 64 Гбайт зовнішньої пам'яті.

Дешифратор команд працює разом з пам'яттю мікропрограм, формуючи послідовність мікрокоманд, що забезпечують виконання команд, що поступили. Декодовані команди завантажуються в кеш-пам'ять мікрокоманд, звідки вони вибираються для виконання. Замість звичного L1 кеша, який в Pentium III був роздільний на область інструкцій і область даних в Pentium 4 застосований новий підхід. Інструкції в L1 кеші не зберігаються, він призначений тепер тільки для даних. Для кешування інструкцій тепер використовується Trace Cache, проте в порівнянні із звичним L1-кешем він має багато переваг, направлених знову ж таки на мінімізацію простоїв процесора при виконанні неправильних прогнозів переходів. Перше, і основне - в Trace Cache зберігаються вже декодовані інструкції. Це значить, що в ньому бережуться не класичні x86 інструкції, а так звані мікрокоманди, більш прості операції якими безпосередньо оперує процесорне ядро. Збереження в Trace Cache мікрооперацій дозволяє уникнути повторного декодування x86 інструкцій при повторному виконанні тієї ж ділянки програми або при неправильному прогнозі переходів. Отже після заповнення Trace Cache практично будь-яка команда берегтиметься в ній в декодованом вигляді. Тому під час вступу чергової команди блок трасування вибирає з цієї кеш-пам'яті необхідні мікрокоманди, що забезпечують її виконання. Друга перевага Trace Cache полягає в тому, що мікрооперації в ньому зберігаються саме в тому порядку, в якому вони виконуються. Якщо в потоці команд опиняється команда умовного переходу (галуження програми), то включається механізм прогнозу галуження, який формує адресу наступної вибираної команди до того, як буде визначена умова виконання переходу. Вірогідність того, що переходи передбачаються неправильно, достатньо мала для того, щоб відмовитися від очевидного виграшу, одержуваного шляхом відмови від повторних декодувань і прогнозів переходів. Кеш-пам'ять може берегти до 12000 мікрокоманд. Після формування потоків мікрокоманд проводиться виділення регістрів, необхідних для виконання декодованих команд. Ця процедура реалізується блоком розподілу регістрів, який виділяє для кожного вказаного в команді логічного регістра (регістра цілочисельних операндів EAX, ЕСX і інших, регістра операндів з плаваючою крапкою ST0-ST7 або регістра блоків MMX, SSE, мал. 2) один з 128 фізичних регістрів, що входять до складу блоків регістрів заміщення (БРЗ). Ця процедура дозволяє виконувати команди, що використовують одні і ті ж логічні регістри, одночасно або із зміною їх послідовності. Вибрані мікрокоманди розміщуються в черзі мікрокоманд. В ній містяться мікрокоманди, що реалізовують виконання 126 команд, які потім прямують у виконавчі пристрої у міру готовності операндів, що поступили і декодованих. Відзначимо, що в процесорах Pentium III в черзі знаходяться мікрокоманди

Page 15: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

15

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

Суперскалярна архітектура реалізується шляхом організації виконавчого ядра процесора у вигляді ряду паралельно працюючих блоків. Арифметико-логічні блоки ALU проводять обробку цілочисельних операндів, які поступають із заданих регістрів БРЗ. В ці ж регістри заноситься і результат операції. При цьому перевіряються також умови галуження для команд умовних переходів і видаються сигнали перезавантаження конвейєра команд у разі неправильно передбаченого галуження. Виконавче ядро працює з підвищеною швидкістю виконання операцій (удвічі по відношенню до самого процесора, Intel називає це Rapid Execute Engine). (Рис.5).

Мал. 5. Rapid Execute Engine

Наприклад, мікрокоманда складання цілочисельних операндів при тактовій частоті процесора 1,5 Мгц виконується всього за 0,36 нс.

Адреси операндів, вибираних з пам'яті, обчислюються блоком формування адреси (БФА), яка реалізує інтерфейс з кеш-пам'яттю даних 1-го рівня (L1) місткістю 8 Кбайт. Відповідно до заданих в декодованих командах способів адресації формуються 48 адрес для завантаження операндів з пам'яті в регістр БРЗ і 24 адреси для запису з регістра в пам'ять (в Pentium III формуються 16 адрес для завантаження регістрів і 12 адрес для запису в пам'ять). При цьому БФА формує адреси операндів для команд, які ще не поступили на виконання. При зверненні до пам'яті БФА одночасно видає адреси двох операндів: один для завантаження операнда в заданий регістр БРЗ, другий - для пересилки результату з БРЗ в пам'ять. Таким чином реалізується процедура попереднього читання даних для подальшої їх обробки у виконавчих блоках, яка називається спекулятивною вибіркою.

Аналогічним чином організовується паралельна робота блоків SSE, FPU, MMX, які використовують окремий набір регістрів і блок формування адрес операндів. При вибірці операнда з пам'яті проводиться звернення до кеш-пам'яті даних (L1), яка має окремі порти для читання і запису, для збільшення продуктивності, Intel застосував для доступу до L1-

Page 16: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

16

кешу новий алгоритм, чим зменшив в Pentium 4 латентність цього кеша до двох процесорних тактів замість трьох тактів в Pentium III. За один такт проводиться вибірка операндів для двох команд. Час звернення до цієї кеш-пам'яті складає 1,42 нс при тактовій частоті 1,5 ГГц, що в 2,1 рази менше ніж при зверненні до кеш-пам'яті даних в процесорі Pentium III, що працює на частоті 1,0 ГГц.

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

У Pentuim 4 використовується гіперконвейєрна технологія виконання команд, при якій число ступенів конвейєра досягає 20 (в Pentium - 5 ступенів, в Pentium III - 11). Таким чином одночасно в процесі виконання може знаходитися до 20 команд, що знаходяться на різних стадіях (ступенях) їх реалізації. Чого ж досяг Intel, так подовживши конвейєр? Завдяки декомпозиції виконання кожної команди на більш дрібні етапи, кожний з цих етапів тепер може виконуватися швидше, що дозволяє безперешкодно збільшувати частоту процесора. Так, якщо при технологічному процесі, що використовується сьогодні, 0.18 мкм гранична частота для Pentium III складає 1 ГГц (ну або, за більш оптимістичними оцінками, 1.13 ГГц), Pentium 4 зможе досягти частоти 2 ГГц

Мал. 6. Конвейєр Pentium 4 в порівнянні з попередниками

Проте, біля надмірно довгого конвейєра є і свої недоліки. Ефективність конвейєра різко знижується через необхідність його перезавантаження при виконанні умовних галужень, коли вимагається провести очищення всіх попередніх ступенів і вибрати команду з іншої гілки програми. Щоб скоротити втрати часу, пов'язані з перезавантаженням конвейєра, використовується блок прогнозу галужень. Його основною частиною є асоціативна пам'ять, звана буфером адрес галужень (BTB - Branch Target Buffer), в якій бережуться 4092 адреси раніше виконаних переходів. Відзначимо, що в BTB процесора Pentium III бережуться адреси тільки 512 переходів. Крім того, BTB містить біти, що бережуть передісторію галуження, які указують, чи виконувався перехід при попередніх вибірках даної команди. Під час вступу чергової команди умовного переходу вказана в ній адреса порівнюється з вмістом BTB. Якщо ця адреса не міститься в BTB, тобто раніше не проводилися переходи за даною адресою, то передбачається відсутність галуження. В цьому випадку продовжується вибірка і декодування команд, наступних за командою переходу. При збігу вказаного в команді адреси переходу з яким-небудь з адрес, що бережуться в BTB, проводиться аналіз передісторії. В процесі аналізу визначається частіше за все реалізовуваний напрям галуження, а також виявляються чергуючі переходи. Якщо передбачається виконання галуження, то вибирається і завантажується в конвейєр команда, розміщена за передбаченою адресою. Вдосконалений блок прогнозу галуження, що використовується в Pentuim 4, забезпечує 90-% вірогідність правильного прогнозу. Таким чином різко зменшується число перезавантажень конвейєра при неправильному прогнозі галуження.

Page 17: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

17

Архітектура систем на базі Pentium 4 Архітектура систем на базі Pentium 4 що випускаються компанією Intel, забезпечують

значне підвищення продуктивності - від 23 до 87% при рішенні різного класу задач. В 2001 році планується швидке зростання виробництва Pentium 4 і підвищення його тактової частоти до 2 ГГц. В 2002 році об'єм випуску Pentium 4 перевищить Pentium III, і цей процесор стане основною продукцією компанії Intel. Практична реалізація потенційних можливостей процесора Pentium 4 забезпечується при використовуванні набору спеціалізованих мікросхем, необхідних для побудови на його основі цифрових систем різного призначення. Для реалізації систем на базі Pentium 4 компанія Intel випускає набір мікросхем Chipset 850, в який входять:

контроллер-концентратор пам'яті MCH (Memory Controller Hub) типа Intel 82850; контроллер-концентратор для пристроїв уведення-виведення ICH2 (I/O Controller

Hub) типа Intel 82801BA; контроллер мікрокоду FWH (FirmWare Hub) типа Intel 82802AB. Типова архітектура систем, реалізованих на базі процесора Pentium 4 з використанням

набору Chipset 850, показана на мал. 9. Основною особливістю цієї архітектури є використовування нової системної шини FSB, що забезпечує обмін із швидкістю 3,2 Гбайт/с, що відповідають частоті передачі даних 400 Мгц. Така швидкість реалізується шляхом вживання нового типу надшвидкодіючої двохканальної пам'яті RDRAM і контроллера-концентратора MCH, що забезпечує 4 канали обміну з пам'яттю цього типу.

Мал. 9. Типова архітектура систем на базі Pentium 4

Контроллер MCH виконує обмін з оперативною пам'яттю типа Direct RAMBUS місткістю від 128 Мбайт (мінімально допустимий об'єм) до 2 Гбайт за допомогою здвоєних каналів. Пам'ять реалізується на основі мікросхем швидкодійної двохканальної RDRAM-пам'яті типа PC800 або PC600, що випускається компанією RAMBUS. Таким чином загальний доступ до оперативної пам'яті здійснюється з використанням чотирьох каналів обміну. При тактовій частоті каналу 100 Мгц забезпечуються загальна частота обміну, еквівалентна 400 Мгц, що в 3 рази вище, ніж для самої швидкодійної сучасної системної платні, що працює на частоті 133 Мгц.

При використовуванні в системах мікросхем пам'яті типа RDRAM можуть виникнути проблеми, які пов'язані з їх високою вартістю і певними складнощами їх поставки. Тому в даний час розробляються варіанти вживання інших типів швидкодійних мікросхем динамічної пам'яті, що випускаються компаніями NEC, Toshiba, Samsung, Hyndai, Infineon.

До контроллера MCH підключається також універсальний роз'єм AGP4X, що використовується для зв'язку з графічним адаптером при швидкості передачі даних більше 1 Гбайт/с.

Контроллер ICH2 служить для підключення різних зовнішніх пристроїв з використанням інтерфейсу ULTRA ATA/66/100. Цей інтерфейс реалізує обмін з жорстким

Page 18: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

18

диском із швидкістю 66 або 100 Мбайт/с. ICH2 також забезпечує прямий доступ зовнішніх пристроїв до пам'яті із швидкістю 33 Мбайт/с за допомогою інтерфейсу ULTRA DMA/33. Контроллер служить для підключення послідовних портів з шиною USB, зв'язку з локальною мережею Ethernet і паралельного обміну по шині PCI. Забезпечується можливість реалізації каналів для передачі аудіоданих.

Для створення систем на базі Pentim 4 компанія Intel випускає системну (“материнські”) платню типа D850GB. На платні розміром 30,5ґ24,4 см2 вмонтовується мікропроцесор і інші необхідні мікросхеми, є 4 роз'єми для включення RIMM-модулів пам'яті RDRAM. На платні розміщуються також флэш-пам'ять місткістю 4 Мбіт, що береже систему уведення-виведення BIOS, 5 слотів шини PCI і 2 контроллери послідовної шини USB, обслуговуючі 4 USB-порти. Крім того, є порти для підключення клавіатури і миші, 2 інтерфейси для підключення жорстких дисків і один для гнучких дисків, один послідовний (COM) і один паралельний (LPT) порти.

Програмна модель мікропроцесора На сучасному комп'ютерному ринку спостерігається велика різноманітність різних

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

Різними є способи, засоби і ресурси, за допомогою яких комп'ютер функціонує як єдиний механізм, що використовуються. Щоб зібрати воєдино всі поняття, що характеризують комп'ютер з погляду його функціональних програмно-керуємих властивостей, існує спеціальний термін — архітектура ЕОМ.

Вперше поняття архітектура ЕОМ стало згадуватися з появою машин 3-го покоління для їх порівняльної оцінки.

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

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

Більшість регістрів має певне функціональне призначення.

Призначені для користувача регістри Як випливає з назви, призначеними для користувача регістри називаються тому, що

програміст може використовувати їх при написанні своїх програм. До цих регістрів відносяться (мал. 10):

вісім 32-бітових регістрів, які можуть використовуватися програмістами для зберігання даних і адрес (їх ще називають регістрами загального призначення (Рон)):

eax/ax/ah/al; ebx/bx/bh/bl; edx/dx/dh/dl; ecx/cx/ch/cl; ebp/bp; esi/si; edi/di;

Page 19: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

19

esp/sp. шість регістрів сегментів: cs, ds, ss, es, fs, gs;

• регістри полягання і управління: o регістр прапорів eflags/flags; o регістр покажчика команди eip/ip.

Мал. 10. Призначені для користувача регістри мікропроцесорів i486 і Pentium

Чому багато хто з цих регістрів приведений з похилою розділовою межею? Ні, це не різні регістри — це частини одного великого 32-розрядного регістра. Їх можна використовувати в програмі як окремі об'єкти. Так зроблено для забезпечення працездатності програм, написаних для молодших 16-розрядних моделей мікропроцесорів фірми Intel, починаючи з i8086. Мікропроцесори i486 і Pentium мають в основному 32-розрядні регістри. Їх кількість, за винятком сегментних регістрів, таке ж, як і біля i8086, але розмірність більше, що і відображено в їх позначеннях — вони мають приставку e (Extended).

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

Регістри загального призначення Всі регістри цієї групи дозволяють звертатися до своїх “молодших” частин (див. мал.

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

Перерахуємо регістри, що відносяться до групи регістрів загального призначення. Оскільки ці регістри фізично знаходяться в мікропроцесорі усередині арифметико-логічного пристрою (АЛЛУ), то їх ще називають регістрами АЛЛУ:

Page 20: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

20

• eax/ax/ah/al (Accumulator register) — акумулятор. Застосовується для зберігання проміжних даних. В деяких командах використовування цього регістра обов'язкове;

• ebx/bx/bh/bl (Base register) — базовий регістр. Застосовується для зберігання базової адреси деякого об'єкту в пам'яті;

• ecx/cx/ch/cl (Count register) — регістр-лічильник. Застосовується в командах, що проводять деякі дії, що повторюються. Його використовування часто неявно і приховано в алгоритмі роботи відповідної команди. Наприклад, команда організації циклу loop окрім передачі управління команді, що знаходиться за деякою адресою, аналізує і зменшує на одиницю значення регістра ecx/cx;

• edx/dx/dh/dl (Data register) — регістр даних. Так само, як і регістр eax/ax/ah/al, він береже проміжні дані. В деяких командах його використовування обов'язкове; для деяких команд це відбувається неявно.

Наступні два регістри використовуються для підтримки так званих цепочечных операцій, тобто операцій, що проводять послідовну обробку ланцюжків елементів, кожний з яких може мати довжину 32, 16 або 8 біт:

• esi/si (Source Index register) — індекс джерела. Цей регістр в ланцюжкових операціях містить поточну адресу елементу в ланцюжку-джерелі;

• edi/di (Destination Index register) — індекс приймача (одержувача). Цей регістр в ланцюжкових операціях містить поточну адресу в ланцюжку-приймачі.

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

• esp/sp (Stack Pointer register) — регістр покажчика стека. Містить покажчик вершини стека в поточному сегменті стека.

• ebp/bp (Base Pointer register) — регістр покажчика бази кадру стека. Призначений для організації довільного доступу до даних усередині стека.

Не поспішайте лякатися такого жорсткого функціонального призначення регістрів АЛЛУ. Насправді, більшість з них може використовуватися при програмуванні для зберігання операндів практично в будь-яких поєднаннях. Але, як ми відзначили вище, деякі команди використовують фіксовані регістри для виконання своїх дій. Це потрібно обов'язково враховувати. Використовування жорсткого закріплення регістрів для деяких команд дозволяє більш компактно кодувати їх машинне уявлення. Знання цих особливостей дозволить вам при необхідності хоча б на декілька байт заощадити пам'ять, займану кодом програми.

Сегментні регістри У програмній моделі мікропроцесора є шість сегментних регістрів: cs, ss, ds, es, gs, fs.

Їх існування обумовлено специфікою організації і використовування оперативної пам'яті мікропроцесорами Intel. Вона полягає в тому, що мікропроцесор апаратний підтримує структурну організацію програми у вигляді трьох частин, званих сегментами. Відповідно, така організація пам'яті називається сегментною.

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

1. Сегмент коду. Містить команди програми. Для доступу до цього сегменту служить регістр cs (code segment register) — сегментний регістр коду. Він містить адресу

Page 21: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

21

сегменту з машинними командами, до якого має доступ мікропроцесор (тобто ці команди завантажуються в конвейєр мікропроцесора).

2. Сегмент даних. Містить оброблювані програмою дані. Для доступу до цього сегменту служить регістр ds (data segment register) — сегментний регістр даних, який береже адресу сегменту даних поточної програми.

3. Сегмент стека. Цей сегмент є областю пам'яті, званою стеком. Роботу із стеком мікропроцесор організовує за наступним принципом: останній записаний в цю область елемент вибирається першим. Для доступу до цього сегменту служить регістр ss (stack segment register) — сегментний регістр стека, що містить адресу сегменту стека.

4. Додатковий сегмент даних. Неявно алгоритми виконання більшості машинних команд припускають, що оброблювані ними дані розташовані в сегменті даних, адреса якого знаходиться в сегментному регістрі ds. Якщо програмі недостатньо одного сегменту даних, то вона має нагоду використовувати ще три додаткові сегменти даних. Але на відміну від основного сегменту даних, адреса якого міститься в сегментному регістрі ds, при використовуванні додаткових сегментів даних їх адреси вимагається указувати явно за допомогою спеціальних префіксів перевизначення сегментів в команді. Адреси додаткових сегментів даних повинні міститися в регістрах es, gs, fs (extension data segment registers).

Регістри полягання і управління У мікропроцесор включено декілька регістрів (див. мал. 10), які постійно містять

інформацію про полягання як самого мікропроцесора, так і програми, команди якої в даний момент завантажені на конвейєр. До цих регістрів відносяться:

• регістр прапорів eflags/flags; • регістр покажчика команди eip/ip. Використовуючи ці регістри, можна одержувати інформацію про результати

виконання команд і впливати на полягання самого мікропроцесора. Розглянемо докладніше призначення і вміст цих регістрів:

eflags/flags (flag register) — регістр прапорів. Розрядність eflags/flags — 32/16 біт. Окремі біти даного регістра мають певне функціональне призначення і називаються прапорами. Молодша частина цього регістра повністю аналогічна регістру flags для i8086. На мал. 11 показаний вміст регістра eflags.

Мал. 11. Вміст регістра eflags

Page 22: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

22

Виходячи з особливостей використовування, прапори регістра eflags/flags можна розділити на три групи:

8 прапорів полягання. Ці прапори можуть змінюватися після виконання машинних команд. Прапори полягання регістра eflags відображають особливості результату виконання арифметичних або логічних операцій. Це дає можливість аналізувати полягання обчислювального процесу і реагувати на нього за допомогою команд умовних переходів і викликів підпрограм. В табл. 2 приведені прапори полягання і вказано їх призначення;

1 прапор управління. Позначається df (Directory Flag). Він знаходиться в 10-у біті регістра eflags і використовується ланцюжковимі командами. Значення прапора df визначає напрям поелементної обробки в цих операціях: від початку рядка до кінця або навпаки, від кінця рядка до їого початку (df = 1). Для роботи з прапором df існують спеціальні команди: cld (зняти прапор df) і std (встановити прапор df). Вживання цих команд дозволяє привести прапор df у відповідність з алгоритмом і забезпечити автоматичне збільшення або зменшення лічильників при виконанні операцій з рядками;

5 системних прапорів, що управляють уведення-виведенням, маскованими перериваннями, відладкою, перемиканням між задачами і віртуальним режимом 8086. Прикладним програмам не рекомендується модифікувати без необхідності ці прапори, оскільки в більшості випадків це приведе до переривання роботи програми. В табл. 3 перераховані системні прапори, їх призначення.

Таблиця 2. Прапори полягання

Мнемоніка прапора

Прапор Номер біта в eflags

Зміст і призначення

Cf Прапор перенесення (Carry Flag)

0

1 — арифметична операція провела перенесення із старшого біта результату. Старшим є 7, 15 або 31-й біт залежно від розмірності операнда;

Pf Прапор паритету (Parity Flag)

2

1 — 8 молодших розрядів (цей прапор — тільки для 8 молодших розрядів операнда будь-якого розміру) результату містять парне число одиниць;

Af

Допоміжний прапор перенесення (Auxiliary carry Flag)

4

Тільки для команд працюючих з BCD-числами. Фіксує факт позики з молодшої тетради результату: 1 — в результаті операції складання був проведено перенесення з розряду 3 в старший розряд або при відніманні була позика в розряд 3 молодшої тетради із значення в старшій тетраді; 0 — перенесень і позик в(з) 3 розряд(а) молодшої тетради результату не було

Zf Прапор нуля (Zero Flag)

6 1 — результат нульовий; 0 — результат ненульовий

Sf Прапор знаку (Sign Flag)

7

Відображає полягання старшого біта результату (биті 7, 15 або 31 для 8, 16 або 32-розрядних операндів відповідно): 1 — старший біт результату рівний 1; 0 — старший біт результату рівний 0

Of Прапор переповнювання

11 Прапор використовується для фіксації факту втрати значущого біта при

Page 23: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

23

(Overflow Flag) арифметичних операціях: 1 — в результаті операції відбувається перенесення (заїм) в(з) старшого, знакового біта результату (биті 7, 15 або 31 для 8, 16 або 32-розрядних операндів відповідно); 0 — у результаті операції не відбувається перенесення (позику) в(з) старшого, знакового біта результату

Iopl

Рівень Привілеїв уведення-виведення (Input/Output Privilege Level)

12, 13

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

Nt

Прапорець вкладеності задачі (Nested Task)

14 Використовується в захищеному режимі роботи мікропроцесора для фіксації того факту, що одна задача вкладена в іншу

Таблиця 3. Системні прапори

Мнемоніка прапора

Прапор Номер біта в eflags

Зміст і призначення

tf Прапор трасування (Trace Flag)

8

Призначений для організації покрокової роботи мікропроцесора. 1 — мікропроцесор генерує переривання з номером 1 після виконання кожної машинної команди. Може використовуватися при відладці програм, зокрема відладчиками; 0 — звична робота

if

Прапор переривання (Interrupt enable Flag)

9

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

rf Прапор відновлення (Resume Flag)

16 Використовується при обробці переривань від регістрів відладки.

vm

Прапор віртуального (Virtual 8086 Mode)

17

Ознака роботи мікропроцесора в режимі віртуального 8086. 1 — процесор працює в режимі віртуального 8086; 0 — процесор працює в реальному або захищеному режимі

ас Прапор контролю вирівнювання (Alignment Check)

18

Призначений для дозволу контролю вирівнювання при зверненнях до пам'яті. Використовується спільно з бітом am в системному регістрі cr0. Наприклад, Pentium дозволяє розміщувати команди і дані з будь-якої адреси. Якщо вимагається контролювати вирівнювання даних і команд за адресами кратними 2 або 4, то установка даних бітів

Page 24: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

24

приведе до того, що весь обіг за некратними адресами порушуватиме виняткову ситуацію

eip/ip (Instraction Pointer register) — регістр-покажчик команд. Регістр eip/ip має розрядність 32/16 біт і містить зсув наступної належної виконанню команди щодо вмісту сегментного регістра cs в поточному сегменті команд. Цей регістр безпосередньо неприступний програмісту, але завантаження і зміна його значення проводяться різними командами управління, до яких відносяться команди умовних і безумовних переходів, виклику процедур і повернення з процедур. Виникнення переривань також приводить до модифікації регістра eip/ip.

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

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

Системні регістри можна розділити на три групи: • чотири регістри управління; • чотири регістри системних адрес; • вісім регістрів відладки.

Регістри управління До групи регістрів управління входять 4 регістри: cr0, cr1, cr2, cr3. Ці регістри призначені для загального управління системою. Регістри управління

доступні тільки програмам з рівнем привілеїв 0. Хоча мікропроцесор має чотири регістри управління, доступними є тільки три з них

— виключається cr1, функції якого поки не визначені (він зарезервований для майбутнього використовування).

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

ре (Protect Enable), битий 0 — дозвіл захищеного режиму роботи. Полягання цього прапора показує, в якому з двох режимів — реальному (pe=0) або захищеному (pe=1) — працює мікропроцесор в даний момент часу.

mp (Math Present), битий 1 — наявність співпроцесора. Завжди 1. ts (Task Switched), битий 3 — перемикання задач. Процесор автоматично встановлює

цей біт при перемиканні на виконання іншої задачі. am (Aligment Mask), битий 18 — маска вирівнювання. Цей біт дозволяє (am = 1) або

забороняє (am = 0) контроль вирівнювання. cd (Cache Disable), битий 30, — заборона кеш-пам'яті. За допомогою цього біта

можна заборонити (cd = 1) або дозволити (cd = 0) використовування внутрішньої кеш-пам'яті (кеш-пам'яті першого рівня).

pg (PaGing), битий 31, — дозвіл (pg = 1) або заборона (pg = 0) сторінкового перетворення. Прапор використовується при сторінковій моделі організації пам'яті.

Регістр cr2 використовується при сторінковій організації оперативної пам'яті для реєстрації ситуації, коли поточна команда звернулася за адресою, що міститься в сторінці пам'яті, відсутньої в даний момент часу в пам'яті. В такій ситуації в мікропроцесорі виникає виняткова ситуація з номером 14, і лінійна 32-бітова адреса команди, що викликала це виключення, записується в регістр cr2. Маючи цю інформацію, обробник

Page 25: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

25

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

Регістр cr3 також використовується при сторінковій організації пам'яті. Це так званий регістр каталога сторінок першого рівня. Він містить 20-бітову фізичну базову адресу каталога сторінок поточної задачі. Цей каталог містить 1024 32-бітові дескриптори, кожний з яких містить адресу таблиці сторінок другого рівня. У свою чергу кожна з таблиць сторінок другого рівня містить 1024 32-бітові дескриптори, що адресують сторінкові кадри в пам'яті. Розмір сторінкового кадру — 4 Кбайт.

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

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

системних регістрів: регістра таблиці глобальних дескрипторів gdtr (Global Descriptor Table Register) має

розмір 48 біт і що містить 32-бітову (биті 16—47) базову адресу глобальної дескрипторної таблиці GDT і 16-бітове (биті 0—15) значення межі, що є розміром в байтах таблиці GDT;

регістра таблиці локальних дескрипторів ldtr (Local Descriptor Table Register) має розмір 16 біт і дескриптор локальної дескрипторної таблиці LDT, що містить так званий селектор. Цей селектор є покажчиком в таблиці GDT, який і описує сегмент, що містить локальну дескрипторну таблицю LDT;

регістра таблиці дескрипторів переривань idtr (Interrupt Descriptor Table Register) має розмір 48 біт і що містить 32-бітову (биті 16–47) базову адресу дескрипторної таблиці переривань IDT і 16-бітове (биті 0—15) значення межі, що є розміром в байтах таблиці IDT;

16-бітового регістра задачі tr (Task Register), який подібно регістру ldtr, містить селектор, тобто покажчик на дескриптор в таблиці GDT. Цей дескриптор описує поточний сегмент полягання задачі (TSS — Task Segment Status). Цей сегмент створюється для кожної задачі в системі, має жорстко регламентовану структуру і містить контекст (поточне полягання) задачі. Основне призначення сегментів TSS — зберігати поточне полягання задачі у момент перемикання на іншу задачу.

Регістри відладки Це дуже цікава група регістрів, призначених для апаратної відладки. Засоби апаратної

відладки вперше з'явилися в мікропроцесорі i486. Апаратний мікропроцесор містить вісім регістрів відладки, але реально з них використовуються тільки 6.

Регістри dr0, dr1, dr2, dr3 мають розрядність 32 біт і призначені для завдання лінійних адрес чотирьох точок переривання. Механізм, що використовується при цьому, наступний: будь-яка формована поточною програмою адреса порівнюється з адресами в регістрах dr0...dr3, і при збігу генерується виключення відладки з номером 1.

Регістр dr6 називається регістром полягання відладки. Біти цього регістра встановлюються відповідно до причин, які викликали виникнення останнього виключення з номером 1.

Перерахуємо ці біти і їх призначення: b0 — якщо цей біт встановлений в 1, то останнє виключення (переривання) виникло в

результаті досягнення контрольної крапки, визначеної в регістрі dr0; b1 — аналогічно b0, але для контрольної крапки в регістрі dr1;

Page 26: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

26

b2 — аналогічно b0, але для контрольної крапки в регістрі dr2; b3 — аналогічно b0, але для контрольної крапки в регістрі dr3; bd (битий 13) — служить для захисту регістрів відладки; bs (битий 14) — встановлюється в 1, якщо виключення 1 було викликано поляганням

прапора tf = 1 в регістрі eflags; bt (битий 15) встановлюється в 1, якщо виключення 1 було викликано перемиканням

на задачу зі встановленим бітом пастки в TSS t = 1. Вся решта біт в цьому регістрі заповнюється нулями. Обробник виключення 1 по

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

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

місце реєстрації контрольної крапки — тільки в поточній задачі або в будь-якій задачі. Ці біти займають молодші вісім біт регістра dr7 (по два біти на кожну контрольну крапку (фактично точку переривання), що задається регістрами dr0, dr1, dr2, dr3 відповідно). Перший біт з кожної пари — цей так званий локальний дозвіл; його установка говорить про те, що точка переривання діє якщо вона знаходиться в межах адресного простору поточної задачі. Другий біт в кожній парі визначає глобальний дозвіл, який говорить про те, що дана контрольна крапка діє в межах адресних просторів всіх задач, що знаходяться в системі;

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

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

Організація пам'яті Пам'ять для процесорів 80х86 підрозділяється на байти (8 біт), слова (16 біт), подвійні

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

Більш крупними одиницями є сторінки і сегменти. Пам'ять може логічно організовуватися у вигляді одного або безліч сегментів змінної довжини (в реальному режимі — фіксованої). Сегменти можуть вивантажуватися на диск і в міру необхідності з нього підкачуватися у фізичну пам'ять. Окрім сегментації, в захищеному режимі можливе розбиття логічної пам'яті на сторінки розміром 4 Кб (Paging), кожна з яких може відображатися на будь-яку область фізичної пам'яті. Сегментація і розбиття на сторінки можуть застосовуватися в будь-яких поєднаннях. Сегментація є засобом організації логічної пам'яті, що використовується на прикладному рівні. Розбиття на сторінки застосовується на системному рівні для управління фізичною пам'яттю.

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

Логічна адреса, також звана віртуальним, складається з селектора (в реальному режимі — просто адреси сегменту) і зсуву. Зсув формується підсумовуванням компонентів (base, index, disp) на ефективну адресу. Оскільки кожна задача може мати до 16К селекторів, а зсув, обмежений розміром сегменту, може досягати 4 Гб, логічний адресний

Page 27: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

27

простір для кожної задачі може досягати 64 Тб. Весь цей простір віртуальної пам'яті у принципі доступний програмісту (цей “принцип” повинна реалізувати операційна система).

Блок сегментації транслює логічний адресний простір в 32-бітовий простір лінійних адрес. Лінійна адреса утворюється складанням базової адреси сегменту з ефективною адресою. Базова адреса сегменту в реальному режимі утворюється множенням вмісту сегментного регістра, що використовується, на 16 (як і в 8086). В захищеному режимі базова адреса завантажується з дескриптора, що бережеться в таблиці, по селектору, завантаженому в сегментний регістр, що використовується.

Фізична 32-бітова адреса пам'яті утворюється після перетворення лінійної адреси блоком сторінкової переадресації. В найпростішому випадку (при відключеному блоці сторінкової переадресації) лінійна адреса співпадає з фізичним — присутнім на зовнішній шині адреси процесора. Включений блок сторінкової переадресації здійснює трансляцію лінійної адреси у фізичний блоками (сторінками) розміром 4 Кб. Цей блок може включатися тільки в захищеному режимі, докладніше його призначення і робота будуть розглянуті в п. 3.8.6.

Як і біля процесорів 8086/8088, для звернення до пам'яті процесор (сумісно із зовнішньою схемою) формує шинні сигнали MEMWR# (Memory Write) і MEMRD# (Memory Read) для операцій запису і прочитування відповідно. Шина адреси розрядністю 32 біти дозволяє адресувати 4 Гб фізичній пам'яті, але в реальному режимі доступний тільки 1 Мб, що починається з молодших адрес.

У реальному режимі по адресації пам'яті забезпечується сумісність з процесором 8086, який своєю 16-бітовою адресною шиною охоплює простір фізичної пам'яті в 1 Мб. Для забезпечення сумісності з 80286 32-розрядні процесори реалізують його помилку, пов'язану з переповнюванням, що виникає при складанні адреси сегменту з ефективною адресою. При обчисленні фізичної адреси (див. мал. 2.1) можливе виникнення переповнювання, яке викличе появу одиниці на лінії А20 шини адреси. Максимальне значення адреси в реальному режимі 10FFEF досягається при Seg=FFFFh і EA=FFFFh. Для забезпечення повної програмної сумісності з 8086 в PC використовується вентиль Gate A20, що примусово обнуляє біт А20 системної шини адреси. Вентиль в PC управляється через програмно-керуємий біт контроллера клавіатури 8042 або більш швидким способом (Gate A20 Fast Control), визначуваним чипсетом системної платні.

У реальному режимі розмір сегменту фіксований — як і біля 8086, він складає 64 Кб (FFFFh). Спроба використовування ефективної адреси, що виходить за межу сегменту, при 32-бітовій адресації викликає виключення типу 13. При 16-бітовій адресації при обчисленні ефективної адреси можливе перенесення в розряд А16 ігнорується, і сегмент “згортається кільцем” (як і в 8086). Засоби контролю стежать і за переходом через межу сегменту під час обігу за “прикордонною” адресою. При спробі адресації до слова, що має зсув FFFFh, або подвійного слова із зсувом FFFDh-FFFFh

(їх старші байти виходить за межу сегменту), або виконання інструкції, всі байти якої не уміщаються в даному сегменті, процесор виробляє переривання - виключення типу 13 (ODh) — Segment Overrun Exception. При спробі виконання інструкції ESCAPE з операндом пам'яті, що не уміщається в сегменті, виробляється виключення типу 9 - Processor Extension Segment Overrun Interrupt (тільки для 386-го).

Система команд 32-розрядних процесорів передбачає 11 режимів адресації операндів. З них тільки двох не мають відношення до пам'яті:

• операнд-регістр, який може знаходитися в будь-кому 8, 16 або 32-бітовому регістрі процесора; • безпосередній операнд (8, 16 або 32 біт), який може міститися в самій команді.

Page 28: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

28

Решта дев'яти режимів (табл. 3,2) використовується при формуванні ефективної адреси операнда з пам'яті.

Ефективна адреса обчислюється з використанням комбінації наступних компонентів: Зсув (Displacement або Disp) - 8-, 16- або 32-бітове число, включене в команду. База (Base) — вміст базового регістра. Звичайно використовується для вказівки па

початок деякого масиву. Індекс (Index) — вміст індексного регістра. Звичайно використовується для вибору

елементу масиву. Масштаб (Scale) — множник (1, 2, 4 або 8), вказаний в коді інструкції. Цей елемент

використовується для вказівки розміру елементу масиву. Доступний тільки в 32-бітовому режимі адресації. Ефективна адреса обчислюється по формулі EA=Base+Index*Scale + Disp. Окремі доданки в цій формулі можуть і бути відсутній. Можливі режими адресації приведені в табл.4.

Таблиця 4. Режими адресації пам'яті 33-бітових процесорів

Пряма адресація Direct Mode EA=Disp

Непряма регістрова адресація Register Indirect Mode

EA=Base

Базова адресація Based Mode EA=Base+Disp

Індексна адресація Index Mode EA=Indcx+Disp

Масштабована індексна адресація Scaled Index Mode

EA= ScalexIndcx+Disp*

Базово-індексна адресація Based Index Mode EA=Base+Index

Масштабована базово-індексна адресація Based Scaled Index Mode

EA= Basc+ScalexIndex*

Базово-індексна адресація із зсувом Based Index Mode with Displacement

EA=Base+Index+Disp

Масштабована базово-індексна адресація із зсувом Scaled Index Mode with Displacement

EA=Base+ScalexIndex+Disp*

*Масштабирование індексу можливо тільки в 32-бітовому режимі адресації. Процесор може використовувати режими 32-бітової або 16-бітової адресації. Режим

16-бітової адресації відповідає режимам процесорів 8086 і 80286 при цьому як компоненти адреси використовуються молодші 16 біт відповідних

регістрів. Режим 32-бітової адресації використовує розширені 32-розрядні регістри і має додаткові режими, що використовують масштабування індексу.

У реальному режимі за умовчанням використовується 16-бітова адресація, але за допомогою префікса зміни розрядності адреси (Address Length Prefix) для поточної інструкції можна перемкнутися в 32-бітовий режим. При цьому з'являються додаткові можливості адресації (масштабування), але обчислене значення ефективної адреси все одно не може подолати 64-кілобайтний бар'єр — при такій спробі генерується виключення 13 — General Protection Fault.

У захищеному режимі адресація за умовчанням визначається бітом D дескриптора кодового сегменту, що використовується: при D=0 — 16 біт, при D=l — 32 біти. Префікс розрядності адреси перемикає розрядність для поточної інструкції на протилежну.

Page 29: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

29

При зверненнях до пам'яті використовування сегментних регістрів за умовчанням визначається типом обігу (табл. 5). На час поточної інструкції при необхідності для більшості типів обігу можливе використовування альтернативного сегментного регістра, на що указує префікс заміни сегменту (CS:, DS:, ES:, SS:, FS: або GS:) перед кодом інструкції.

Таблиця 5. Використовування сегментних регістрів при адресації пам'яті

Тип звернення до пам'яті Сегментний регістр

за умовчанням

альтернативний

Вибірка команд CS Ні

Стекові операції SS Ні

Рядок-приймач ES Ні

Будь-які посилання до пам'яті, окрім використо-вуючих як базове регістри ВР, ЕВР або ESP

DS CS, ES, SS, FS,GS

Посилання до пам'яті, що використовують як базове регістри ВР, ЕВР або ESP

SS CS, DS,ES, FS, GS

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

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

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

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

макрокоманди — оформляються певним чином пропозиції тексту програми, що заміщаються під час трансляції іншими пропозиціями;

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

рядки коментарів, що містять будь-які символи, у тому числі і букви російського алфавіту. Коментарі ігноруються транслятором.

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

відповідною команді, макрокоманді, директиві або коментарю. Для того, щоб транслятор асемблера міг розпізнати їх, вони повинні формуватися за певними синтаксичними правилами. Для цього краще всього використовувати формальний опис синтаксису мови на зразок правил граматики. Найпоширеніші способи подібного опису мови програмування — синтаксичні діаграми і розширені форми Бэкуса—Наура. Для практичного використовування більш зручні синтаксичні діаграми. Наприклад, синтаксис

Page 30: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

30

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

Мал. 12. Формат пропозиції асемблера

Рис.13. Формат директив

Мал. 14. Формат команд і макрокоманд

На цих малюнках: ім'я мітки — ідентифікатор, значенням якого є адреса першого байта тієї пропозиції

початкового тексту програми, яку він позначає; ім'я — ідентифікатор, що відрізняє дану директиву від інших однойменних директив.

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

код операції (КОП) і директива — це мнемонічні позначення відповідної машинної команди, макрокоманди або директиви транслятора;

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

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

Допустимими символами при написанні тексту програм є: всі латинські букви: A—Z, а—z. При цьому заголовні і рядкові букви вважаються

еквівалентними; цифри від 0 до 9; знаки ? @ $ _ &; роздільники . [ ] ( ) < > { } + / * % ! ' " ? \ = # ^.

Page 31: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

31

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

Лексемами є: ідентифікатори - послідовності допустимих символів, що використовуються для

позначення таких об'єктів програми, як коди операцій, імена змінних і назви міток. Правило запису ідентифікаторів полягає в наступному: ідентифікатор може складатися з одного або декількох символів. Як символи можна використовувати букви латинського алфавіту, цифри і деякі спеціальні знаки: _ ? $ @. Ідентифікатор не може починатися символом цифри. Довжина ідентифікатора може бути до 255 символів, хоча транслятор сприймає лише перші 32, а інші ігнорує. Регулювати довжину можливих ідентифікаторів можна з використанням опції командного рядка mv. Окрім цього існує можливість вказати транслятору на те, щоб він розрізняв прописні і рядкові букви або ігнорував їх відмінність (що і робиться за умовчанням). Для цього застосовуються опції командного рядка /mu, /ml, /mx; ланцюжки символів - послідовності символів, ув'язнені в одинарні або подвійні лапки; цілі числа в одній з наступних систем счислення: двійкової, десяткової, шістнадцятирічної. Ототожнення чисел при записі їх в програмах на асемблері проводиться за певними правилами:

Десяткові числа не вимагають для свого ототожнення вказівки яких-небудь додаткових символів, наприклад 25 або 139.

Для ототожнення в початковому тексті програми двійкових чисел необхідно після запису нулів і одиниць, що входять в їх склад, поставити латинське “b”, наприклад 10010101b.

Шестнадцатерічниє числа мають більше умовностей при своєму записі: По-перше, вони складаються з цифр 0...9, рядкових і прописних букв латинського

алфавіту а, b, з, d, e, f або А, B, З, D, E, F. По-друге, у транслятора можуть виникнути труднощі з розпізнаванням

шістнадцятирічних чисел через те, що вони можуть полягати як з одних цифр 0...9 (наприклад 190845), так і починатися з букви латинського алфавіту (наприклад ef15). Для того, щоб "пояснити" транслятору, що дана лексема не є десятковим числом або ідентифікатором, програміст винний спеціальним чином виділяти шістнадцятирічне число. Для цього на кінці послідовності шістнадцятирічних цифр, що становлять шістнадцятирічне число, записують латинську букву “h”. Це обов'язкова умова. Якщо шістнадцятирічне число починається з букви, то перед ним записується ведучий нуль: 0ef15h.

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

Практично кожна пропозиція містить опис об'єкту, над яким або за допомогою якого виконується деяка дія. Ці об'єкти називаються операндами. Їх можна визначити так: операнди — це об'єкти (деякі значення, регістри або елементи пам'яті), на які діють інструкції або директиви, або це об'єкти, які визначають або уточнюють дію інструкцій або директив.

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

Можливо провести наступну класифікацію операндів: постійні, або безпосередні, операнди адресні операнди переміщувані операнди лічильник адреси регістровий операнд

Page 32: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

32

базовий і індексний операнди структурні операнди Записи Розглянемо докладніше характеристику операндів з приведеної класифікації: Постійні або безпосередні операнди — число, рядок, ім'я або вираз, що має деяке

фіксоване значення. Ім'я не повинне бути переміщуваним, тобто залежати від адреси завантаження програми в пам'ять. Наприклад, воно може бути визначено операторами equ або =.

num equ 5 imd = num-2 mov al,num ;эквивалентно mov al,5 ;5 тут безпосередній операнд add [si],imd ; imd=3 - безпосередній операнд mov al,5 ;5 - безпосередній операнд У даному фрагменті визначаються дві константи, які потім використовуються як

безпосередні операнди в командах пересилки mov і складання add. Адресні операнди — задають фізичне розташування операнда в пам'яті за допомогою

вказівки двох складових адреси: сегменту і зсуву (мал. 15).

Мал. 15. Синтаксис опису адресних операндів

Наприклад: mov ах,0000h mov ds,ax mov ах,ds:0000h ;записать слово в ах з області пам'яті по ;физическому

адресі 0000:0000 Тут третя команда mov має адресний операнд. Переміщувані операнди — будь-які символьні імена, що представляють деякі адреси

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

Наприклад: data segment mas_w dw 25 dup (0) . code segment . lea si,mas_w ;mas_w - переміщуваний операнд У цьому фрагменті mas_w — символьне ім'я, значенням якого є початкова адреса

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

Page 33: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

33

Лічильник адреси — специфічний вид операнда. Він позначається знаком $. Специфіка цього операнда в тому, що коли транслятор асемблера зустрічає в початковій програмі цей символ, то він підставляє замість нього поточне значення лічильника адреси. Значення лічильника адреси, або, як його іноді називають, лічильника розміщення, є зсувом поточної машинної команди щодо початку сегменту коду. У форматі лістингу лічильнику адреси відповідає друга або третя колонка (залежно від того, присутній чи ні в лістингу колонка з рівнем вкладеності). Якщо узяти в якості приклад будь-який лістинг, то видно, що при обробці транслятором чергової команди асемблера лічильник адреси збільшується на довжину сформованої машинної команди. Важливо правильно розуміти цей момент. Наприклад, обробка директив асемблера не спричиняє за собою зміни лічильника. Директиви, на відміну від команд асемблера, — це лише вказівки транслятору на виконання певних дій по формуванню машинного представлення програми, і для них транслятором не генерується ніяких конструкцій в пам'яті. Як приклад використовування в команді значення лічильника адреси можна привести наступний:

jmp $+3 ;безусловный перехід на команду mov cld ;длина команди cld складає 1 байт mov al,1 При використовуванні подібного виразу для переходу не забувайте про довжину

самої команди, в якій цей вираз використовується, оскільки значення лічильника адреси відповідає зсуву в сегменті команд даної, а не наступної за нею команди. В нашому прикладі команда jmp займає 2 байти. Але будьте обережні, довжина команди залежить від того, які в ній використовуються операнди. Команда з регістровими операндами буде коротше за команду, один з операндів якої розташований в пам'яті. В більшості випадків цю інформацію можна одержати, знаючи формат машинної команди і аналізуючи колонку лістингу з об'єктним кодом команди.

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

mov al,4 ;константу 4 заносимо в регістр al mov dl,pass+4 ;байт за адресою pass+4 в регістр dl add al,dl ;команда з регістровими операндами Базовий і індексний операнди. Цей тип операндів використовується для реалізації

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

складного типу даних, званого структурою. Записи (аналогічно структурному типу) використовуються для доступу до бітового

поля деякого запису. Операнди є елементарними компонентами, з яких формується частина машинної

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

Результатом обчислення виразу може бути адреса деякого елементу пам'яті або деяке константне (абсолютне) значення.

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

Арифметичні оператори Оператори зсуву Оператори порівняння Логічні оператори Індексний оператор Оператор перевизначення типу

Page 34: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

34

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

пріоритети. Дамо коротку характеристику операторів: Арифметичні оператори. До них відносяться: Арифметичні оператори. До них

відносяться: унарні “+” і “–”; бінарні “+” і “–”; множення “*”; цілочисельного розподілу “/”; отримання залишку від розподілу “mod”. Ці оператори розташовані на рівнях пріоритету 6, 7, 8 в табл. 7. Наприклад tab_size equ 50 ;размер масиву в байтах size_el equ 2 ;размер елементів ;вычисляется число елементів масиву і заноситься в регістр cx mov cx,tab_size / size_el ;оператор “/”

Мал. 16. Синтаксис арифметичних операцій

Оператори зсуву виконують зсув виразу на вказану кількість розрядів (мал. 17).

Наприклад mask_b equ 10111011 mov al,mask_b shr 3 ;al=00010111

• Мал. 17. Синтаксис операторів зсуву

• Оператори порівняння (повертають значення “істина” або “брехня”) призначені для

формування логічних виразів (див. мал. 18 і табл. 6). Логічне значення “істина” відповідає цифровій одиниці, а “брехня” — нулю. Наприклад

tab_size equ 30 ;размер таблиці mov al,tab_size ge 50 ;загрузка розміру таблиці в al cmp al,0 ;если tab_size < 50, то je m1 ;переход на m1 m1: . У даному прикладі якщо значення tab_size більше або рівно 50, то результат в al

рівний 0ffh, а якщо tab_size менше 50, то al рівно 00h. Команда cmp порівнює значення al з нулем і встановлює відповідні прапори в flags/eflags. Команда je на основі аналізу цих прапорів передає або не передає управління на мітку m1.

Page 35: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

35

• Мал. 18. Синтаксис операторів порівняння

Таблиця 6. Оператори порівняння

Оператор Значення

Eq ІСТИНА, якщо выражение_1 рівне выражение_2

Ne ІСТИНА, якщо выражение_1 не рівне выражение_2

Lt ІСТИНА, якщо выражение_1 менше выражение_2>ИСТИНА, якщо выражение_1 не рівне выражение_2

Le ІСТИНА, якщо выражение_1 менше або рівне выражение_2

Gt ІСТИНА, якщо выражение_1 більше выражение_2

Ge ІСТИНА, якщо выражение_1 більше або рівне выражение_2

Логічні оператори виконують над виразами побітові операції (мал. 19). Вирази повинні бути абсолютними, тобто такими, чисельне значення яких може бути обчислено транслятором. Наприклад:

flags equ 10010011 mov al,flags xor 01h ;al=10010010;пересылка в al поля flags з ;инвертированным правим бітом

• Мал. 19. Синтаксис логічних операторів

Індексний оператор [ ]. Не дивуйтеся, але дужки теж є оператором, і транслятор

їх наявність сприймає як вказівку скласти значення выражение_1 за цими дужками з выражение_2, укладеним в дужки (мал. 20).

Наприклад mov ах,mas[si] ;пересылка слова за адресою mas+(si) в регістр ах

• Мал. 20. Синтаксис індексного оператора

Помітимо, що в літературі по асемблеру прийнято наступне позначення: коли в тексті

йдеться про вміст регістра, ту його назву беруть в круглі дужки. Ми також дотримуватимемося цього позначення. Наприклад, в нашому випадку запис в коментарях останнього фрагмента програми mas + (si) означає обчислення наступного виразу: значення зсуву символічного імені mas плюс вміст регістра si.

Page 36: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

36

Оператор перевизначення типу ptr застосовується для перевизначення або уточнення типу мітки або змінної, визначуваної виразом (мал. 21). Тип може приймати одне з наступних значень: byte, word, dword, qword, tbyte, near, far. Наприклад

d_ wrd dd 0 mov al,byte ptr d_wrd+1 ;пересылка другого байта з подвійного слова Пояснимо цей фрагмент програми. Змінна d_wrd має тип подвійного слова. Що

робити, якщо виникне необхідність обігу не до всієї змінної, а тільки до одного з вхідних в неї байтів (наприклад, до другого)? Якщо спробувати зробити це командою mov al,d_wrd+1, то транслятор видасть повідомлення про неспівпадання типів операндів. Оператор ptr дозволяє безпосередньо в команді перевизначити тип і виконати команду.

• Мал. 21. Синтаксис оператора перевизначення типу

Оператор перевизначення сегменту : (двокрапка) примушує обчислювати фізичну

адресу щодо сегментної складової, що конкретно задається: “ім'я сегментного регістра”, “ім'я сегменту” з відповідної директиви SEGMENT або “ім'я групи” (мал. 11). Цей момент дуже важливий, тому поясню його докладніше. При обговоренні сегментації ми говорили про те, що мікропроцесор на апаратному рівні підтримує три типи сегментів — коду, стека і даних. В чому полягає така апаратна підтримка? Наприклад, для вибірки на виконання чергової команди мікропроцесор повинен обов'язково подивитися вміст сегментного регістра cs і лише його. А в цьому регістрі, як ми знаємо, міститься (поки що не зсунутий) фізична адреса початку сегменту команд. Для отримання адреси конкретної команди мікропроцесору залишається помножити вміст cs на 16 (що означає зсув на чотири розряди) і скласти набуте 20-бітове значення з 16-бітовим вмістом регістра ip. Приблизно те ж саме відбувається і тоді, коли мікропроцесор обробляє операнди в машинній команді. Якщо він бачить, що операнд — це адреса (ефективна адреса, яка є тільки частиною фізичної адреси), то він знає, в якому сегменті його шукати — за умовчанням це сегмент, адреса початку якого записана в сегментному регістрі ds. А що ж з сегментом стека? Подивіться розділ "Програмна модель мікропроцесора", там, де ми описували призначення регістрів загального призначення. В контексті нашого розгляду нас цікавлять регістри sp і bp. Якщо мікропроцесор бачить як операнд (або його частини, якщо операнд — вираз) один з цих регістрів, то за умовчанням він формує фізичну адресу операнда використовуючи як його сегментна складова вміст регістра ss. Що має на увазі термін “за умовчанням”? Пригадайте “рефлекси”, про які ми говорили на уроці 1. Це набір мікропрограм в блоці мікропрограмного управління, кожна з яких виконує одну з команд в системі машинних команд мікропроцесора. Кожна мікропрограма працює по своєму алгоритму. Змінити його, звичайно ж, не можна, але можна трохи підкоригувати. Робиться це за допомогою необов'язкового поля префікса машинної команди (див. формат машинної команди). Якщо ми згодні з тим, як працює команда, то це поле відсутнє. Якщо ж ми хочемо внести поправку (якщо, звичайно, вона допустима для конкретної команди) в алгоритм роботи команди, то необхідно сформувати відповідний префікс. Префікс є однобайтовою величиною, чисельне значення якої визначає її призначення. Мікропроцесор розпізнає по вказаному значенню, що цей байт є префіксом, і подальша робота мікропрограми виконується з урахуванням вказівки, що поступила, на коректування її роботи. Зараз нас цікавить один з них - префікс заміни (перевизначення) сегменту. Його призначення полягає в тому, щоб вказати мікропроцесору (а по суті, мікропрограмі) на те, що ми не хочемо використовувати сегмент за умовчанням. Можливості для подібного перевизначення, звичайно, обмежені. Сегмент команд перевизначити не можна, адреса

Page 37: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

37

чергової виконуваної команди однозначно визначається парою cs:ip. А ось сегменти стека і даних — можна. Для цього і призначений оператор “:”. Транслятор асемблера, обробляючи цей оператор, формує відповідний однобайтовий префікс заміни сегменту. Наприклад

.code

... jmp met1 ;обход обов'язковий, інакше поле ind трактуватиметься ;как чергова команда ind db 5 ;описание поля даних в сегменті команд met1: ... mov al,cs:ind ;переопределение сегменту дозволяє працювати з ;данными, визначеними

усередині сегменту коду

Мал. 22. Синтаксис оператора перевизначення сегменту Оператор іменує типу структури . (крапка) також примушує транслятор проводити

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

сегменту для виразу (мал. 23), як який можуть виступати мітка, змінна, ім'я сегменту, ім'я групи або деяке символічне ім'я.

Мал. 23. Синтаксис оператора отримання сегментної складової Оператор отримання зсуву виразу offset дозволяє набути значення зсуву виразу (мал.

24) в байтах щодо початку того сегменту, в якому вираз визначений.

Мал. 24. Синтаксис оператора отримання зсуву Наприклад .data pole dw 5 ... .code ... mov ах,seg pole mov es,ax mov dx,offset pole ;теперь в парі es:dx повна адреса pole Як і в мовах високого рівня, виконання операторів асемблера при обчисленні виразів

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

Page 38: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

38

Таблиця 7. Оператори і їх пріоритет

Оператор Пріоритет

length, size, width, mask, ( ), [ ] < > 1

. 2

: 3

ptr, offset, seg, type, this 4

high, low 5

+, - (унарні) 6

* /, mod, shl, shr 7

+, - (бінарні) 8

eq, ne, lt, le, gt, ge 9

not 10

and 11

or, xor 12

short, type 13

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

операндів в програмі на асемблері. Відкритим залишилося питання про те, як правильно оформити послідовність команд, щоб транслятор міг їх обробити, а мікропроцесор — виконати.

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

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

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

Синтаксичний опис сегменту на асемблері є конструкцією, зображеною на мал. 25:

Мал. 25. Синтаксис опису сегменту

Page 39: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

39

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

Атрибут вирівнювання сегменту (тип вирівнювання) повідомляє компонувальник про те, що потрібно забезпечити розміщення початку сегменту на заданій межі. Це важливо, оскільки при правильному вирівнюванні доступ до даних в процесорах i80х86 виконується швидше. Допустимі значення цього атрибуту наступні:

BYTE — вирівнювання не виконується. Сегмент може починатися з будь-якої адреси пам'яті;

WORD — сегмент починається за адресою, кратною двом, тобто останній (молодший) значущий біт фізичної адреси рівний 0 (вирівнювання на границю слова);

DWORD — сегмент починається за адресою, кратною чотирьом, тобто два останні (молодших) значущі біти рівні 0 (вирівнювання на границю подвійного слова);

PARA — сегмент починається за адресою, кратною 16, тобто остання шістнадцятирічна цифра адреси повинна бути 0h (вирівнювання на межу параграфа);

PAGE — сегмент починається за адресою, кратною 256, тобто дві останні шістнадцятирічні цифри повинні бути 00h (вирівнювання на межу 256-байтної сторінки);

MEMPAGE — сегмент починається за адресою, кратною 4 Кбайт, тобто три останні шістнадцятирічні цифри повинні бути 000h (адреса наступної 4-Кбайтної сторінки пам'яті).

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

як потрібно комбінувати сегменти різних модулів, що мають одне і те ж ім'я. Значеннями атрибуту комбінування сегменту можуть бути:

PRIVATE — сегмент не об'єднуватиметься з іншими сегментами з тим же ім'ям зовні даного модуля;

PUBLIC — примушує компонувальник з'єднати всі сегменти з однаковими іменами. Новий з'єднаний сегмент буде цілим і безперервним. Всі адреси (зсуви) об'єктів, а це можуть бути, залежно від типу сегменту, команди і дані, обчислюватимуться щодо початку цього нового сегменту;

COMMON — розташовує всі сегменти з одним і тим же ім'ям за однією адресою. Всі сегменти з даним ім'ям перекриватимуться і спільно використовуватимуть пам'ять. Розмір одержаного в результаті сегменту буде рівний розміру найбільшого сегменту;

AT xxxx — розташовує сегмент за абсолютною адресою параграфа (параграф — об'єм пам'яті, кратний 16; тому остання шістнадцятирічна цифра адреси параграфа рівна 0). Абсолютна адреса параграфа задається виразом xxx. Компонувальник розташовує сегмент за заданою адресою пам'яті (це можна використовувати, наприклад, для доступу до відеопам'яті або області ПЗП), враховуючи атрибут комбінування. Фізично це означає, що сегмент при завантаженні в пам'ять буде розташований, починаючи з цієї абсолютної адреси параграфа, але для доступу до нього у відповідний сегментний регістр повинне бути завантажено задане в атрибуті значення. Всі мітки і адреси в певному таким чином сегменті відлічуються щодо заданої абсолютної адреси;

STACK — визначення сегменту стека. Примушує компонувальник з'єднати всі однойменні сегменти і обчислювати адреси в цих сегментах щодо регістра ss. Комбінований тип STACK (стік) аналогічний комбінованому типу PUBLIC, за винятком того, що регістр ss є стандартним сегментним регістром для сегментів стека. Регістр sp

Page 40: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

40

встановлюється на кінець з'єднаного сегменту стека. Якщо не вказано жодного сегменту стека, компонувальник видасть попередження, що стековий сегмент не знайдений. Якщо сегмент стека створений, а комбінований тип STACK не використовується, програміст повинен явно завантажити в регістр ss адресу сегменту (подібно тому, як це робиться для регістра ds).

За умовчанням атрибут комбінування приймає значення PRIVATE. Атрибут класу сегменту (тип класу) — це укладений в лапки рядок, що допомагає

компонувальнику визначити відповідний порядок проходження сегментів при збиранні програми з сегментів декількох модулів. Компонувальник об'єднує разом в пам'яті всі сегменти з одним і тим же ім'ям класу (ім'я класу, в загальному випадку, може бути будь-ким, але краще, якщо воно відображатиме функціональне призначення сегменту). Типовим прикладом використовування імені класу є об'єднання в групу всіх сегментів коду програми (звичайно для цього використовується клас “code”). За допомогою механізму типізації класу можна групувати також сегменти даних, що ініціалізували і неініціалізованих;

Атрибут розміру сегменту. Для процесорів i80386 і вище сегменти можуть бути 16 або 32-розрядними. Це впливає, перш за все, на розмір сегменту і порядок формування фізичної адреси усередині нього. Атрибут може приймати наступні значення:

USE16 — це означає, що сегмент допускає 16-розрядну адресацію. При формуванні фізичної адреси може використовуватися тільки 16-розрядний зсув. Відповідно, такий сегмент може містити до 64 Кбайт коду або даних;

USE32 — сегмент буде 32-розрядним. При формування фізичної адреси може використовуватися 32-розрядний зсув. Тому такий сегмент може містити до 4 Гбайт коду або даних.

Всі сегменти самі по собі рівноправні, оскільки директиви SEGMENT і ENDS не містять інформації про функціональне призначення сегментів. Для того, щоб використовувати їх як сегменти коду, даних або стека, необхідно заздалегідь повідомити транслятор про це, для чого використовують спеціальну директиву ASSUME, що має формат, показаний на мал. 15. Ця директива повідомляє транслятор про те, який сегмент до якого сегментного регістра прив'язаний. У свою чергу, це дозволить транслятору коректно зв'язувати символічні імена, визначені в сегментах. Прив'язка сегментів до сегментних регістрів здійснюється за допомогою операндів цієї директиви, в яких им'я_сегменту повинне бути ім'ям сегменту, визначеним в початковому тексті програми директивою SEGMENT або ключовим словом nothing. Якщо як операнд використовується тільки ключове слово nothing, то попередні призначення сегментних регістрів анулюються, причому відразу для всіх шести сегментних регістрів. Але ключове слово nothing можна використовувати замість аргументу ім'я сегменту; в цьому випадку вибірково розриватиметься зв'язок між сегментом з ім'ям ім'я сегменту і відповідним сегментним регістром (див. мал. 26).

Page 41: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

41

Мал. 26. Директива ASSUME

На уроці 3 ми розглядали приклад програми з директивами сегментації. Ці директиви

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

Для простих програм, що містять по одному сегменту для коду, даних і стека, хотілося б спростити її опис. Для цього в транслятори MASM і TASM ввели можливість використовування спрощених директив сегментації. Але тут виникла проблема, зв'язана з тим, що необхідно було якось компенсувати неможливість напряму управляти розміщенням і комбінуванням сегментів. Для цього сумісно із спрощеними директивами сегментації сталі використовувати директиву вказівки моделі пам'яті MODEL, яка частково стала управляти розміщенням сегментів і виконувати функції директиви ASSUME (тому при використовуванні спрощених директив сегментації директиву ASSUME можна не використовувати). Ця директива зв'язує сегменти, які у разі використовування спрощених директив сегментації мають приречені імена, з сегментними регістрами (хоча явно ініціалізувати ds все одно доведеться).

У лістингу 1 приведений приклад програми з використанням спрощених директив сегментації:

Лістинг 1. Використовування спрощених директив сегментації ;---------Prg_3_1.asm------------------------------- masm ;режим роботи TASM: ideal або masm model small ;модель пам'яті .data ;сегмент даних message db 'Введіть дві шістнадцятирічні цифры,$' .stack ;сегмент стека db 256 dup ('?') ;сегмент стека .code ;сегмент коду main proc ;начало процедури main mov ах,@data ;заносим адреса сегменту даних в регістр ах mov ds,ax ;ax в ds ;далее текст програми (див. сегменту коду в лістингу 3.1 книги) mov ах,4c00h ;пересылка 4c00h в регістр ах int 21h ;вызов переривання з номером 21h main endp ;конец процедури main end main ;конец програми з точкою входу main Синтаксис директиви MODEL показаний на мал. 27.

Page 42: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

42

Мал. 27. Синтаксис директиви MODEL

Обов'язковим параметром директиви MODEL є модель пам'яті. Цей параметр

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

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

Формат директиви (режим MASM)

Формат директиви (режим IDEAL)

Призначення

.CODE [ім'я] CODESEG[ім'я] Почало або продовження сегменту коду

.DATA DATASEG Почало або продовження сегменту даних, що ініціалізували. Також використовується для визначення даних типу near

.CONST CONST Почало або продовження сегменту постійних даних (констант) модуля

.DATA? UDATASEG Почало або продовження сегменту неініціалізованих даних. Також використовується для визначення даних типу near

.STACK [розмір] STACK [розмір] Почало або продовження сегменту стека модуля. Параметр [розмір] задає розмір стека

.FARDATA [ім'я]

FARDATA [ім'я] Почало або продовження сегменту даних типу far, що ініціалізували

.FARDATA? [ім'я]

UFARDATA [ім'я] Почало або продовження сегменту неініціалізованих даних типу far

Наявність в деяких директивах параметра [ім'я] говорить про те, що можливе визначення декількох сегментів цього типу. З другого боку, наявність декількох видів сегментів даних обумовлена вимогою забезпечити сумісність з деякими компіляторами мов високого рівня, які створюють різні сегменти даних для даних, що ініціалізували і неініціалізованих, а також констант.

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

Таблиця 9. Ідентифікатори, створювані директивою MODEL

Ім'я ідентифікатора Значення змінної

@code Фізична адреса сегменту коду

@data Фізична адреса сегменту даних типу near

@fardata Фізична адреса сегменту даних типу far

@fardata? Фізична адреса сегменту неініціалізованих даних типу far

Page 43: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

43

@curseg Фізична адреса сегменту неініціалізованих даних типу far

@stack Фізична адреса сегменту стека

Якщо ви подивитеся на текст лістингу 1, то побачите приклад використовування одного з цих ідентифікаторів. Це @data; з його допомогою ми набули значення фізичної адреси сегменту даних нашої програми.

Тепер можна закінчити обговорення директиви MODEL. Операнди директиви MODEL використовують для завдання моделі пам'яті, яка визначає набір сегментів програми, розміри сегментів даних і коду, спосіб скріплення сегментів і сегментних регістрів. В табл. 10 приведені деякі значення параметра модель пам'яті директиви MODEL.

Таблиця 10. Моделі пам'яті

Модель Тип коду

Тип даних

Призначення моделі

TINY near near Код і дані з'єднані в одну групу з ім'ям DGROUP. Використовується для створення програм формату .com.

SMALL near near

Код займає один сегмент, дані з'єднані в одну групу з ім'ям DGROUP. Цю модель звичайно використовують для більшості програм на асемблері

MEDIUM far near

Код займає декілька сегментів, поодинці на кожний об'єднуваний програмний модуль. Всі посилання на передачу управління — типу far. Дані з'єднані в одній групі; всі посилання на них — типу near

COMPACT near far Код в одному сегменті; посилання на дані — типу far

LARGE far far Код в декількох сегментах, поодинці на кожний об'єднуваний програмний модуль

Параметр модифікатор директиви MODEL дозволяє уточнити деякі особливості використовування вибраної моделі пам'яті (табл. 11).

Таблиця 11. Модифікатори моделі пам'яті

Значення модифікатора

Призначення

use16 Сегменти вибраної моделі використовуються як 16-бітові

(якщо відповідною директивою вказаний процесор i80386 або i80486)

use32 Сегменти вибраної моделі використовуються як 32-бітові

(якщо відповідною директивою вказаний процесор i80386 або i80486)

dos Програма працюватиме в MS-DOS

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

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

Page 44: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

44

повний контроль над розміщенням сегментів в пам'яті і їх комбінуванням з сегментами інших модулів.

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

Типи даних При програмуванні на мові асемблера використовуються дані наступних типів: Безпосередні дані, що є числовими або символьними значеннями, що є частиною

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

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

Ці два типи даних є елементарними, або базовими; робота з ними підтримується на рівні системи команд мікропроцесора. Використовуючи дані цих типів, можна формалізувати і запрограмувати практично будь-яку задачу. Але наскільки це буде зручно — ось питання.

2. Дані складного типу, які були введені в мову асемблера з метою полегшення розробки програм. Складні типи даних будуються на основі базових типів, які є як би цеглою для їх побудови. Введення складних типів даних дозволяє дещо згладити відмінності між мовами високого рівня і асемблером. У програміста з'являється можливість поєднання переваг мови асемблера і мов високого рівня (у напрямі абстракції даних), що зрештою підвищує ефективність кінцевої програми.

Обробка інформації, в загальному випадку, процес дуже складний. Це побічно підтверджує популярність мов високого рівня. Одне з безперечних достоїнств мов високого рівня — підтримка розвинених структур даних. При їх використовуванні програміст звільняється від рішення конкретних проблем, пов'язаних з представленням числових або символьних даних, і дістає можливість оперувати інформацією, структура якої більшою мірою відображає особливості наочної області вирішуваної задачі. В той же самий час, чим вище рівень такої абстракції даних від конкретного їх уявлення в комп'ютері, тим більше навантаження лягає на компілятор з метою створення дійсно ефективного коду. Адже нам вже відомо, що зрештою все написане на мові високого рівня в комп'ютері буде представлене на рівні машинних команд, що працюють тільки з базовими типами даних. Таким чином, найефективніша програма — програма, написана в машинних кодах, але писати сьогодні велику програму в машинних кодах — заняття не має дуже великого сенсу.

Поняття простого типу даних носить подвійний характер. З погляду розмірності (фізична інтерпретація), мікропроцесор апаратний підтримує наступні основні типи даних (мал. 28):

байт — вісім послідовно розташованих бітів, пронумерованих від 0 до 7, при цьому біт 0 є наймолодшим значущим бітом;

слово — послідовність з двох байт, мають послідовні адреси. Розмір слова — 16 біт; біти в слові нумеруються від 0 до 15. Байт, що містить нульовий біт, називається молодшим байтом, а байт, що містить 15-й біт - старшим байтом. Мікропроцесори Intel мають важливу особливість — молодший байт завжди бережеться за меншою адресою.

Page 45: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

45

Адресою слова вважається адреса його молодшого байта. Адреса старшого байта може бути використаний для доступу до старшої половини слова.

подвійне слово — послідовність з чотирьох байт (32 біти), розташованих за послідовними адресами. Нумерація цих біт проводиться від 0 до 31. Слово, що містить нульовий біт, називається молодшим словом, а слово, що містить 31-й біт, - старшим словом. Молодше слово бережеться за меншою адресою. Адресою подвійного слова вважається адреса його молодшого слова. Адреса старшого слова може бути використаний для доступу до старшої половини подвійного слова.

збільшене учетверо слово — послідовність з восьми байт (64 біти), розташованих за послідовними адресами. Нумерація біт проводиться від 0 до 63. Подвійне слово, що містить нульовий біт, називається молодшим подвійним словом, а подвійне слово, що містить 63-й біт, — старшим подвійним словом. Молодше подвійне слово бережеться за меншою адресою. Адресою збільшеного учетверо слова вважається адреса його молодшого подвійного слова. Адреса старшого подвійного слова може бути використаний для доступу до старшої половини збільшеного учетверо слова.

Мал. 28. Основні типи даних мікропроцесора

Окрім трактування типів даних з погляду їх розрядності, мікропроцесор на рівні

команд підтримує логічну інтерпретацію цих типів (мал. 29): Цілий тип із знаком — двійкове значення із знаком, розміром 8, 16 або 32 біта. Знак в

цьому двійковому числі міститься в 7, 15 або 31-у біті відповідно. Нуль в цих бітах в операндах відповідає позитивному числу, а одиниця — негативному. Негативні числа представляються в додатковому коді. Числові діапазони для цього типу даних наступні:

8-розрядне ціле — від –128 до +127; 16-розрядне ціле — від –32 768 до +32 767; 32-розрядне ціле — від –231 до +231–1. Цілий тип без знаку — двійкове значення без знаку, розміром 8, 16 або 32 біта.

Числовий діапазон для цього типу наступний: байт — від 0 до 255; слово — від 0 до 65 535; подвійне слово — від 0 до 232–1. Покажчик на спомин двох типів: ближнього типу — 32-розрядна логічна адреса, що є відносним зсувом в байтах від

початку сегменту. Ці покажчики можуть також використовуватися в суцільній (плоскої) моделі пам'яті, де сегментні складові однакові;

дальнього типу — 48-розрядна логічна адреса, що складається з двох частин: 16-розрядної сегментної частини — селектора, і 32-розрядного зсуву.

Ланцюжок — є деяким безперервним набором байтів, слів або подвійних слів максимальної довжини до 4 Гбайт.

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

Page 46: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

46

Неупакований двійково-десятковий тип — байтове представлення десяткової цифри від 0 до 9. Неупаковані десяткові числа бережуться як байтові значення без знаку по одній цифрі в кожному байті. Значення цифри визначається молодшим півбайтом.

Упакований двійково-десятковий тип є упакованим представленням двох десяткових цифр від 0 до 9 в одному байті. Кожна цифра бережеться в своєму півбайті. Цифра в старшому півбайті (биті 4–7) є старшою.

Мал. 29. Основні логічні типи даних мікропроцесора

Відзначимо, що “Зн” на мал. 29 означає знаковий біт. Після всього сказаного було б логічним виникнення у читача питання: як описати ці

прості типи даних асемблера, а потім і скористатися ними в програмі? Адже будь-яка програма призначена для обробки деякої інформації, тому питання про те, як описати дані з використанням засобів мови звичайно встає одним з перших.

TASM надає дуже широкий набір засобів опису і обробки даних, який цілком порівнянний з аналогічними засобами деяких мов високого рівня.

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

Директиви резервування і ініціалізації даних простих типів мають формат, показаний на мал. 30.

Мал. 30. Директиви опису даних простих типів

На мал. 30 використані наступні позначення:

Page 47: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

47

• ? показує, що вміст поля не визначений, тобто при завданні директиви з таким значенням виразу вміст виділеної ділянки фізичної пам'яті змінюватися не буде. Фактично, створюється неініціалізована змінна;

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

• вираз — ітеративна конструкція з синтаксисом, описаним вище. Ця конструкція дозволяє повторити послідовне занесення у фізичну пам'ять виразу в дужках n раз.

• ім'я — деяке символічне ім'я мітки або елементу пам'яті в сегменті даних, що використовується в програмі.

На мал. 30 представлені наступні підтримувані TASM директиви резервування і ініціалізації даних:

• db — резервування пам'яті для даних розміром 1 байт. Директивою db можна задавати наступні значення:

o вираз або константу, що приймає значення з діапазону: � для чисел із знаком –128...+127; � для чисел без знаку 0...255;

o 8-бітовий відносний вираз, що використовує операції HIGH і LOW; o символьний рядок з одного або більш символів. Рядок полягає в лапки. В

цьому випадку визначається стільки байт, скільки символів в рядку. • dw — резервування пам'яті для даних розміром 2 байти.

Директивою dw можна задавати наступні значення: o вираз або константу, що приймає значення з діапазону:

� для чисел із знаком –32 768...32 767; � для чисел без знаку 0...65 535;

o вираз, що займає 16 або менш біт, як який може виступати зсув в 16-бітовому сегменті або адреса сегменту;

o 1- або 2-байтовий рядок, укладена в лапки. • dd — резервування пам'яті для даних розміром 4 байти.

Директивою dd можна задавати наступні значення: o вираз або константу, що приймає значення з діапазону:

� для i8086: � для чисел із знаком –32 768...+32 767; � для чисел без знаку 0...65 535;

� для i386 і вище: � для чисел із знаком –2 147 483 648...+2 147 483 647; � для чисел без знаку 0...4 294 967 295;

o відносний або адресний вираз, що складається з 16-бітової адреси сегменту і 16-бітового зсуву;

o рядок завдовжки до 4 символів, укладений в лапки. • df — резервування пам'яті для даних розміром 6 байт; • dp — резервування пам'яті для даних розміром 6 байт.

Директивами df і dp можна задавати наступні значення: o вираз або константу, що приймає значення з діапазону:

� для i8086: � для чисел із знаком –32 768...+32 767; � для чисел без знаку 0...65 535;

� для i386 і вище: � для чисел із знаком –2 147 483 648...+2 147 483 647;

Page 48: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

48

� для чисел без знаку 0...4 294 967 295; o відносний або адресний вираз, що складається з 32 або менш битий (для

i80386) або 16 або менш битий (для молодших моделей мікропроцесорів Intel);

o адресний вираз, що складається з 16-бітового сегменту і 32-бітового зсуву; o константу із знаком з діапазону –247...247–1; o константу без знаку з діапазону 0...248-1; o рядок завдовжки до 6 байт, укладену в лапки.

• dq — резервування пам'яті для даних розміром 8 байт. Директивою dq можна задавати наступні значення:

o вираз або константу, що приймає значення з діапазону: � для МП i8086:

� для чисел із знаком –32 768...+32 767; � для чисел без знаку 0...65 535;

� для МП i386 і вище: � для чисел із знаком –2 147 483 648...+2 147 483 647; � для чисел без знаку 0...4 294 967 295;

o відносний або адресний вираз, що складається з 32 або менш битий (для i80386) або 16 або менш битий (для молодших моделей мікропроцесорів Intel);

o константу із знаком з діапазону –263...263–1; o константу без знаку з діапазону 0...264–1; o рядок завдовжки до 8 байт, укладену в лапки.

• dt — резервування пам'яті для даних розміром 10 байт. Директивою dt можна задавати наступні значення:

o вираз або константу, що приймає значення з діапазону: � для МП i8086:

� для чисел із знаком –32 768...+32 767; � для чисел без знаку 0...65 535;

� для МП i386 і вище: � для чисел із знаком –2 147 483 648...+2 147 483 647; � для чисел без знаку 0...4 294 967 295;

o відносний або адресний вираз, що складається з 32 або менш битий (для i80386) або 16 або менш битий (для молодших моделей);

o адресний вираз, що складається з 16-бітового сегменту і 32-бітового зсуву; o константу із знаком з діапазону –279...279-1; o константу без знаку з діапазону 0...280-1; o рядок завдовжки до 10 байт, укладену в лапки; o упаковану десяткову константу в діапазоні 0...99 999 999 999 999 999 999.

Дуже важливо з'ясувати собі порядок розміщення даних в пам'яті. Він напряму пов'язаний з логікою роботи мікропроцесора з даними. Мікропроцесори Intel вимагають проходження даних в пам'яті за принципом: молодший байт за молодшою адресою.

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

Лістинг 1. Приклад використовування директив резервування і ініціалізації даних .masm. .model small .stack 100h .data message db 'Запустіть цю програму в отладчике’,’$'

Page 49: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

49

perem_1 db 0ffh perem_2 dw 3a7fh perem_3 dd 0f54d567ah mas db 10 dup (' ') pole_1 db 5 dup (?) adr dw perem_3 adr_full dd perem_3 fin db 'Кінець сегменту даних програми $' .code start: mov ах,@data mov ds,ax mov ah,09h mov dx,offset message int 21h mov ах,4c00h int 21h end start Тепер наша мета — подивитися, як виглядає сегмент даних програми лістингу 1 в

пам'яті комп'ютера. Це дасть нам можливість обговорити практичну реалізацію позначеного нами принципу розміщення даних. Для цього запустимо відладчик TD.EXE, що входить в комплект поставки TASM. Результат показаний на мал. 31.

Мал. 31. Вікно дампу пам'яті для програми лістингу 1

Обговоримо мал. 31. На ньому ви бачите дані вашого сегменту в двох уявленнях: шестнадцатеричном і символьному. Видно, що із зсувом 0000 розташовані символи, що входять в рядок message. Вона займає 34 байти. Після неї слідує байт, що має в сегменті даних символічне ім'я perem_1, вміст цього байта offh. Тепер звернете увагу на те, які розміщені в пам'яті байти, що входять в слово, позначене символічним ім'ям perem_2. Спочатку слідує байт із значенням 7fh, а потім із значенням 3ah. Як бачите, в пам'яті дійсно спочатку розташований молодший байт значення, а потім старший. Тепер подивіться і самостійно проаналізуйте розміщення байтів для поля, позначеного символічним ім'ям perem_3. Частину сегменту даних, що залишилася, ви можете тепер проаналізувати самостійно. Зупинимося лише на двох специфічних особливостях використовування директив резервування і ініціалізації пам'яті. Йдеться про випадок використовування в полі операндів директив dw і dd символічного імені з поля ім'я цієї або

Page 50: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

50

іншої директиви резервування і ініціалізації пам'яті. В нашому прикладі сегменту даних це директиви з іменами adr і adr_full. Коли транслятор зустрічає директиви опису пам'яті з подібними операндами, то він формує в пам'яті значення адрес тих змінних, чиї імена були вказані як операнди. Залежно від директиви, вживаної для отримання такої адреси, формується або повна адреса (директива dd) у вигляді двох байтів сегментної адреси і двох байтів зсуву, або тільки зсув (директива dw). Знайдіть в дампі на мал. 4 поля, відповідні іменам adr і adr_full, і проаналізуйте їх вміст.

_Будь-якої змінної, оголошеної за допомогою директив опису простих типів даних, асемблер привласнює три атрибути:

1. Сегмент (seg) — адреса початку сегменту, що містить змінну; 2. Зсув (offset) в байтах від початку сегменту із змінною; 3. Тип (type) — визначає кількість пам'яті, змінної, що виділяється, відповідно

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

розглянутих нами операторів асемблера seg, offset і type. TASM підтримує наступні складні типи даних: масиви; структури; об'єднання; записи. Розберемося більш детально з тим, як визначити дані цих типів в програмі і

організувати роботу з ними.

Масиви Дамо формальне визначення: масив - структурований тип даних, що складається з

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

програмах на асемблері, потрібно відповісти на наступні питання: • Як описати масив в програмі? • Як ініціалізувати масив, тобто як задати початкові значення його елементів? • Як організувати доступ до елементів масиву? • Як організувати масиви з розмірністю більш однією? • Як організувати виконання типових операцій з масивами? Опис і ініціалізація масиву в програмі Спеціальних засобів опису масивів в програмах асемблера, звичайно, ні. При

необхідності використовувати масив в програмі його потрібно моделювати одним з наступних способів:

1. Переліком елементів масиву в полі операндів однієї з директив опису даних. При переліку елементи розділяються комами. Наприклад:

;массив з 5 елементів.Розмір кожного елементу 4 байти: mas dd 1,2,3,4,5

Використовуючи оператор повторення dup. Наприклад: ;массив з 5 нульових елементів. ;Размер кожного елементу 2 байти: mas dw 5 dup (0) Такий спосіб визначення використовується для резервування пам'яті з метою

розміщення і ініціалізації елементів масиву. 2. Використовуючи директиви label і rept. Пара цих директив може полегшити

опис великих масивів в пам'яті і підвищити наочність такого опису. Директива rept

Page 51: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

51

відноситься до макрозасобів мови асемблера і викликає повторення вказане число раз рядків, укладених між директивою і рядком endm. Наприклад, визначимо масив байт в області пам'яті, позначеної ідентифікатором mas_b. В даному випадку директива label визначає символічне ім'я mas_b, аналогічно тому, як це роблять директиви резервування і ініціалізації пам'яті. Гідність директиви label в тому, що вона не резервує пам'ять, а лише визначає характеристики об'єкту. В даному випадку об'єкт — це елемент пам'яті. Використовуючи декілька директив label, записаних одна за одною, можна привласнити одній і тій же області пам'яті різні імена і різний тип, що і зроблено в наступному фрагменті:

... n=0 ... mas_b label byte mas_w label word rept 4 dw 0f1f0h endm У результаті в пам'яті буде створена послідовність з чотирьох слів f1f0. Цю

послідовність можна трактувати як масив байт або слів залежно від того, яке ім'я області ми використовуватимемо в програмі — mas_b або mas_w.

3. Використовування циклу для ініціалізації значеннями області пам'яті, яку можна буде згодом трактувати як масив. Подивимося на прикладі лістингу 2, яким чином це робиться.

Лістинг 2 Ініціалізація масиву в циклі ;prg_12_1.asm .MASM .MODEL small .STACK 256 .data mes db 0ah,0dh,'Массив- ','$' mas db 10 dup (?) ;исходный масив

i db 0 .code main: mov ах,@data mov ds,ax xor ах, ах ;обнуление ах mov cx,10 ;значение лічильника циклу в cx mov si,0 ;индекс початкового елементу в cx go: ;цикл ініціалізації mov bh,i ;i в bh mov mas[si],bh ;запись в масив i inc i ;инкремент i inc si ;продвижение до наступного елементу масиву loop go ;повторить цикл ;вывод на екран масиву, що вийшов mov cx,10 mov si,0 mov ah,09h lea dx,mes int 21h show:

Page 52: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

52

mov ah,02h ;функция виведення значення з al на екран mov dl,mas[si] add dl,30h ;преобразование числа в символ int 21h inc si loop show exit: mov ах,4c00h ;стандартный вихід int 21h end main ;конец програми Доступ до елементів масиву При роботі з масивами необхідно чітко уявляти собі, що всі елементи масиву

розташовуються в пам'яті комп'ютера послідовно. Саме по собі таке розташування нічого не говорить про призначення і порядок використовування цих елементів. І лише лише програміст за допомогою складеного їм алгоритму обробки визначає, як потрібно трактувати цю послідовність байт, складових масив. Так, одну і ту ж область пам'яті можна трактувати як одновимірний масив, і одночасно ті ж самі дані можуть трактуватися як двомірний масив. Все залежить тільки від алгоритму обробки цих даних в конкретній програмі. Самі по собі дані не несуть ніякої інформації про своє “смислове”, або логічне, типі. Пам'ятайте про цей принциповий момент.

Ці ж міркування можна розповсюдити і на індекси елементів масиву. Асемблер не підозрює про їх існування і йому абсолютно все одно, які їх чисельні смислові значення. Для того, щоб локалізувати певний елемент масиву, до його імені потрібно додати індекс. Оскільки ми моделюємо масив, то повинні поклопотатися і про моделювання індексу. В мові асемблера індекси масивів — це звичні адреси, але з ними працюють особливим чином. Іншими словами, коли при програмуванні на асемблері ми говоримо про індекс, то швидше маємо на увазі під цим не номер елементу в масиві, а деяка адреса.

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

mas dw 0,1,2,3,4,5 Хай ця послідовність чисел трактується як одновимірний масив. Розмірність кожного

елементу визначається директивою dw, тобто вона рівна 2 байти. Щоб дістати доступ до третього елементу, потрібно до адреси масиву додати 6. Нумерація елементів масиву в асемблері починається з нуля. Тобто в нашому випадку, фактично, йдеться про 4 елементи масиву — 3, але про це знає тільки програміст; мікропроцесору в даному випадку все одно — йому потрібна тільки адреса.

У загальному випадку для отримання адреси елементу в масиві необхідно початкову (базовий) адресу масиву скласти з твором індексу (номер елементу мінус одиниця) цього елементу на розмір елементу масиву:

база + (индекс*размер елементу) Архітектура мікропроцесора надає достатньо зручні програмно-апаратні засоби для

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

індексна адресація із зсувом — режим адресації, при якому ефективна адреса формується з двох компонентів:

постійного (базового) — вказівкою прямої адреси масиву у вигляді імені ідентифікатора, що позначає початок масиву;

змінного (індексного) — вказівкою імені індексного регістра. Наприклад:

mas dw 0,1,2,3,4,5...

Page 53: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

53

mov si,4 mov ах,mas[si];поместить 3-й елемент масиву mas в регістр ах: базова індексна адресація із зсувом — режим адресації, при якому ефективна адреса

формується максимум з трьох компонентів: o постійного (необов'язковий компонент), як яка може виступати пряма адреса

масиву у вигляді імені ідентифікатора, що позначає початок масиву, або безпосереднє значення;

o змінного (базового) — вказівкою імені базового регістра; o змінного (індексного) — вказівкою імені індексного регістра.

Цей вид адресації зручно використовувати при обробці двомірних масивів. Приклад використовування цієї адресації ми розглянемо далі при вивченні особливостей роботи з двомірними масивами.

Нагадаємо, що як базовий регістр може використовуватися будь-який з восьми регістрів загального призначення. Як індексний регістр також можна використовувати будь-який регістр загального призначення, за винятком esp/sp.

Мікропроцесор дозволяє масштабувати індекс. Це означає, що якщо вказати після імені індексного регістра знак множення “*” з подальшою цифрою 2, 4 або 8, то вміст індексного регістра умножатиметься на 2, 4 або 8, тобто масштабуватиметься.

Вживання масштабування полегшує роботу з масивами, які мають розмір елементів, рівний 2, 4 або 8 байт, оскільки мікропроцесор сам проводить корекцію індексу для отримання адреси чергового елементу масиву. Нам потрібно лише завантажити в індексний регістр значення необхідного індексу (вважаючи від 0). До речі сказати, можливість масштабування з'явилася в мікропроцесорах Intel, починаючи з моделі i486. З цієї причини в прикладі програми, що розглядається тут, стоїть директива .486. Її призначення, як і раніше директиви .386, що використалася, в тому, щоб вказати асемблеру при формуванні машинних команд на необхідність обліку і використовування додаткових можливостей системи команд нових моделей мікропроцесорів.

Як приклад використовування масштабування розглянемо лістинг 3, в якому є видимим масив, що складається із слів, і проводиться порівняння цих елементів з нулем. Виводиться відповідне повідомлення.

Лістинг 3. Проглядання масиву слів з використанням масштабування ;prg_12_2.asm .MASM .MODEL small .STACK 256 .data ;начало сегменту даних тексты повідомлень: mes1 db 'не рівний 0!$',0ah,0dh mes2 db 'рівний 0!$',0ah,0dh mes3 db 0ah,0dh,'Элемент $' mas dw 2,7,0,0,1,9,3,6,0,8 ;исходный масив .code .486 ;это обов'язково main: mov ах,@data mov ds,ax ;связка ds з сегментом даних xor ах, ах ;обнуление ах prepare: mov cx,10 ;значение лічильника циклу в cx mov esi,0 ;индекс в esi compare:

Page 54: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

54

mov dx,mas[esi*2] ;первый елемент масиву в dx cmp dx,0 ;сравнение dx з 0 je equal ;переход, якщо рівно not_equal: ;не рівно mov ah,09h ;вывод повідомлення на екран lea dx,mes3 int 21h mov ah,02h ;вывод номери елементу масиву на екран mov dx,si add dl,30h int 21h mov ah,09h lea dx,mes1 int 21h inc esi ;на наступний елемент dec cx ;условие для виходу з циклу jcxz exit ;cx=0? Якщо та — на вихід jmp compare ;нет — повторити цикл equal: ;равно 0 mov ah,09h ;вывод повідомлення mes3 на екран lea dx,mes3 int 21h mov ah,02h mov dx,si add dl,30h int 21h mov ah,09h ;вывод повідомлення mes2 на екран lea dx,mes2 int 21h inc esi ;на наступний елемент dec cx ;все елементи оброблені? jcxz exit jmp compare exit: mov ах,4c00h ;стандартный вихід int 21h end main ;конец програми Ще декілька слів про угоди: Якщо для опису адреси використовується тільки один регістр, то йдеться про базову

адресацію і цей регістр розглядається як базовий: ;переслать байт з області даних, адреса якої знаходиться в регістрі ebx: mov al,[ebx] Якщо для завдання адреси в команді використовується пряма адресація (у вигляді

ідентифікатора) в поєднанні з одним регістром, то йдеться про індексну адресацію. Регістр вважається індексним, і тому можна використовувати масштабування для отримання адреси потрібного елементу масиву:

add eax,mas[ebx*4];сложить вміст eax з подвійним словом в пам'яті ;по адресі mas + (ebx)*4 Якщо для опису адреси використовуються два регістри, то йдеться про базово-

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

Page 55: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

55

Пам'ятайте, що вживання регістрів ebp/bp і esp/sp за умовчанням має на увазі, що сегментна складова адреси знаходиться в регістрі ss.

Помітимо, що базово-індексну адресацію не забороняється поєднувати з прямою адресацією або вказівкою безпосереднього значення. Адреса тоді формуватиметься як сума всіх компонентів.

Наприклад: mov ах,mas[ebx][ecx*2] ;адрес операнда рівний [mas+(ebx)+(ecx)*2] sub dx,[ebx+8][ecx*4] ;адрес операнда рівний [(ebx)+8+(ecx)*4] Але майте у вигляді, що масштабування ефективне лише тоді, коли розмірність

елементів масиву рівна 2, 4 або 8 байт. Якщо ж розмірність елементів інша, то організовувати звернення до елементів масиву потрібно звичайним способом, як описано раніше.

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

Лістинг 4. Обробка масиву елементів з непарною довжиною ;prg_11_3.asm .MASM .MODEL small ;модель пам'яті .STACK 256 ;размер стека .data ;начало сегменту даних N=5 ;количество елементів масиву mas db 5 dup (3 dup (0)) .code ;сегмент коду main: ;точка входу в програму mov ах,@data mov ds,ax xor ах, ах ;обнуление ах mov si,0 ;0 в si mov cx,N ;N в cx go: mov dl,mas[si] ;первый байт поля в dl inc dl ;увеличение dl на 1 (по умові) mov mas[si],dl ;заслать назад в масив add si,3 ;сдвиг на наступний елемент масиву loop go ;повтор циклу mov si,0 ;подготовка до висновку на екран mov cx,N show: ;вывод на екран вмісту ;первых байт полів mov dl,mas[si] add dl,30h mov ah,02h int 21h loop show exit: mov ах,4c00h ;стандартный вихід int 21h end main ;конец програми Двомірні масиви

Page 56: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

56

З представленням одновимірних масивів в програмі на асемблері і організацією їх обробки все достатньо просто. А як бути якщо програма повинна обробляти двомірний масив? Всі проблеми виникають через те, що спеціальних засобів для опису такого типу даних в асемблері немає. Двомірний масив потрібно моделювати. На описі самих даних це майже ніяк не відображається — пам'ять під масив виділяється за допомогою директив резервування і ініціалізації пам'яті.

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

Якщо послідовність однотипних елементів в пам'яті трактується як двомірний масив, розташований по рядках, то адреса елементу (i, j) обчислюється по формулі

(база + количество_элементов_в_строке * размер_элемента * i+j) Тут i = 0...n–1 указує номер рядка, а j = 0...m–1 указує номер стовпця. Наприклад, хай є масив чисел (розміром в 1 байт) mas(i, j) з розмірністю 4 на 4 (i=

0...3, j = 0...3): 23 04 05 67 05 06 07 99 67 08 09 23 87 09 00 08 У пам'яті елементи цього масиву будуть розташовані в наступній послідовності: 23 04 05 67 05 06 07 99 67 08 09 23 87 09 00 08 Якщо ми хочемо трактувати цю послідовність як двомірний масив, приведений вище,

і витягнути, наприклад, елемент mas(2, 3)= 23, то провівши нехитрий підрахунок, переконаємося в правильності наших міркувань:

Ефективна адреса mas(2, 3)= mas + 4 * 1 * 2 + 3 = mas + 11 Подивіться на представлення масиву в пам'яті і переконайтеся, що по цьому зсуву

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

нами раніше базово-індексну адресацію. При цьому можливі два основні варіанти вибору компонентів для формування ефективної адреси:

поєднання прямої адреси, як базового компоненту адреси, і двох індексних регістрів для зберігання індексів:

mov ах,mas[ebx][esi] поєднання двох індексних регістрів, один з яких є і базовим і індексним одночасно, а

інший — тільки індексним: mov ах,[ebx][esi] У програмі це виглядатиме приблизно так: ;Фрагмент програми вибірки елементу ;массива mas(2,3) і його обнулення .data mas db 23,4,5,67,5,6,7,99,67,8,9,23,87,9,0,8 i=2 j=3 .code ... mov si,4*1*i mov di,j mov al,mas[si][di] ;в al елемент mas(2,3) ...

Page 57: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

57

Як закінчений приклад розглянемо програму пошуку елементу в двомірному масиві чисел (лістинг 5). Елементи масиву задані статично.

Лістинг 5. Пошук елементу в двомірному масиві ;prg_11_4.asm .MASM .MODEL small .STACK 256 .data ;матрица розміром 2x5 — якщо її не ініціалізувати ;то для наочності вона може бути описана так: ;array dw 2 DUP (5 DUP (?)) ;но ми її ініціалізували: array dw 1,2,3,4,5,6,7,3,9,0 ;логически це виглядатиме так: ;array= {1 2} ; {3 4} ; {5 6} ; {7 3} ; {9 0} elem dw 3 ;элемент для пошуку failed db db 0ah,0dh,'Нет такого елементу в масиві!','$' success db 0ah,0dh,'Такой елемент в масиві присутній ','$' foundtime db ? ;количество знайдених елементів fnd db ' раз(а) ',0ah,0dh,'$' .code main: mov ах,@data mov ds,ax xor ах, ах mov si,0 ;si=столбцы в матриці mov bx,0 ;bx=строки в матриці mov cx,5 ;число для зовнішнього циклу (по рядках) external: ;внешний цикл по рядках mov ах,array[bx][si] ;в ах перший елемент матриці push cx ;сохранение в стеку лічильника зовнішнього циклу mov cx,2 ;число для внутрішнього циклу (по стовпцях) mov si,0 iternal: ;внутренний цикл по рядках inc si ;передвижение на наступний елемент в рядку ;сравниваем вміст поточного елементу в ах з шуканим елементом: cmp ах,elem ;если поточний співпав з шуканим, то перехід на here для обробки ;иначе цикл продовження пошуку je here ;иначе — цикл по рядку cx=2 раз loop iternal here: jcxz move_next ;просмотрели рядок? inc foundtime ;иначе збільшуємо лічильник співпали move_next: ;продвижение в матриці pop cx ;восстанавливаем CX із стека (5) add bx,1 ;передвигаемся на наступний рядок loop external ;цикл (зовнішній) cmp foundtime,0h ;сравнение числа співпали з 0

Page 58: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

58

ja eql ;если більше 0, то перехід not_equal: ;нет елементів, що співпали з шуканим mov ah,09h ;вывод повідомлення на екран mov dx,offset failed int 21h jmp exit ;на вихід eql: ;есть елементи, що співпали з шуканим mov ah,09h ;вывод повідомлень на екран mov dx,offset success int 21h mov ah,02h mov dl,foundtime add dl,30h int 21h mov ah,09h mov dx,offset fnd int 21h exit: ;выход mov ах,4c00h ;стандартное завершення програми int 21h end main ;конец програми При аналізі роботи програми не забувайте, що в мові асемблера прийнято елементи

масиву нумерувати з 0. При пошуку певного елементу масив є видимим від початку і до кінця. Приведена програма зберігає в полі foundtime кількість входжень шуканого елементу в масив. Як індексні регістри використовуються si і bx.

Типові операції з масивами Для демонстрації основних прийомів роботи з масивами краще всього підходять

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

(лістинг 6). Лістинг 6. Сортування масиву <1> ;prg_12_5.asm <2> MASM <3> MODEL small <4> STACK 256 <5> .data <6> mes1 db 0ah,0dh,'Исходный масив — $',0ah,0dh <7> ;некоторые повідомлення <8> mes2 db 0ah,0dh,'Отсортированный масив — $',0ah,0dh <9> n equ 9 ;количество елементів в масиві, вважаючи з 0 <10> mas dw 2,7,4,0,1,9,3,6,5,8 ;исходный масив <11> tmp dw 0 ;переменные для роботи з масивом <12> i dw 0 <13> j dw 0 <14> .code <15> main: <16> mov ах,@data <17> mov ds,ax <18> xor ах, ах <19> ;вывод на екран початкового масиву <20> mov ah,09h <21> lea dx,mes1

Page 59: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

59

<22> int 21h ;вывод повідомлення mes1 <23> mov cx,10 <24> mov si,0 <25> show_primary: ;вывод значення елементів <26> ;исходного масиву на екран <27> mov dx,mas[si] <28> add dl,30h <29> mov ah,02h <30> int 21h <31> add si,2 <32> loop show_primary <33> <34> ;строки 40-85 програми еквівалентні наступному коду на мові З: <35> ;for (i=0;i<9;i++) <36> ; for (j=9;j>i;j--) <37> ; if (mas[i]>mas[j]) <38> ; {tmp=mas[i]; <39> ; mas[i]=mas[j]; <40> ; mas[j]=tmp;} <41> mov i,0 ;инициализация i <42> ;внутренний цикл по j <43> internal: <44> mov j,9 ;инициализация j <45> jmp cycl_j ;переход на тіло циклу <46> exchange: <47> mov bx,i ;bx=i <48> shl bx,1 <49> mov ах,mas[bx] ;ax=mas[i] <50> mov bx,j ;bx=j <51> shl bx,1 <52> cmp ах,mas[bx] ;mas[i] ? mas[j] — порівняння елементів <53> jle lesser ;если mas[i] менше, то обмін не потрібен і ;переход на просування далі по масиву <54> ;иначе tmp=mas[i], mas[i]=mas[j], mas[j]=tmp: <55> ;tmp=mas[i] <56> mov bx,i ;bx=i <57> shl bx,1 ;умножаем на 2, оскільки елементи — слова <58> mov tmp,ax ;tmp=mas[i] <59> <60> ;mas[i]=mas[j] <61> mov bx,j ;bx=j <62> shl bx,1 ;умножаем на 2, оскільки елементи — слова <63> mov ах,mas[bx] ;ax=mas[j] <64> mov bx,i ;bx=i <65> shl bx,1 ;умножаем на 2, оскільки елементи — слова <66> mov mas[bx],ax ;mas[i]=mas[j] <67> <68> ;mas[j]=tmp <69> mov bx,j ;bx=j <70> shl bx,1 ;умножаем на 2, оскільки елементи — слова <71> mov ах,tmp ;ax=tmp <72> mov mas[bx],ax ;mas[j]=tmp <73> lesser: ;продвижение далі по масиву у внутрішньому циклі <74> dec j ;j--

Page 60: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

60

<75>;тело циклу по j <76> cycl_j: <77> mov ах,j ;ax=j <78> cmp ах,i ;сравнить j ? i <79> jg exchange ;если j>i, то перехід на обмін <80> ;иначе на зовнішній цикл по i <81> inc i ;i++ <82> cmp i,n ;сравнить i ? n — пройшли до кінця масиву <83> jl internal ;если i <85> ;вывод відсортованого масиву <86> mov ah,09h <87> lea dx,mes2 <88> int 21h <89> prepare: <90> mov cx,10 <91> mov si,0 <92> show: ;вывод значення елементу на екран <93> mov dx,mas[si] <94> add dl,30h <95> mov ah,02h <96> int 21h <97> add si,2 <98> loop show <99> exit: <100> mov ах,4c00h ;стандартный вихід <101> int 21h <102> end main ;конец програми У основі програми лежить алгоритм, схожий на метод бульбашкового сортування. Ця

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

Структури Розглянуті нами вище масиви є сукупністю однотипних елементів. Але часто в

додатках виникає необхідність розглядати деяку сукупність даних різного типу як деякий єдиний тип. Це дуже актуально, наприклад, для програм баз даних, де необхідно зв'язувати сукупність даних різного типу з одним об'єктом. Наприклад, раніше ми розглянули лістинг 4, в якому робота проводилася з масивом трьохбайтових елементів. Кожний елемент, у свою чергу, був двома елементами різних типів: однобайтове поле лічильника і двобайтове поле, яке могло нести ще якусь потрібну для зберігання і обробки інформацію. Якщо читач знайомий з однією з мов високого рівня, то він знає, що такий об'єкт звичайно описується за допомогою спеціального типу даних — структури. З метою підвищити зручність використовування мови асемблера в нього також був введений такий тип даних.

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

Для використовування структур в програмі необхідно виконати три дії:

Page 61: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

61

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

2. Визначити екземпляр структури. Цей етап має на увазі ініціалізацію конкретною змінною наперед певною (за допомогою шаблона) структурою.

3. Організувати звернення до елементів структури. Дуже важливо, щоб ви із самого початку з'ясували, в чому різниця між описом

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

Описати структуру в програмі можна тільки один раз, а визначити — будь-яка кількість раз.

Опис шаблона структури Опис шаблона структури має наступний синтаксис: ім'я_структури STRUC <описание полей> ім'я_структури ENDS Тут <описание полей> є послідовністю директив опису даних db, dw, dd, dq і dt. Їх

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

Як ми вже відзначили при описі шаблона, пам'ять не виділяється, оскільки це всього лише інформація для транслятора.

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

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

worker struc ;информация про співробітника nam db 30 dup (' ') ;фамилия, ім'я, по батькові sex db 'ч' ;пол, за умовчанням 'ч' — чоловічий position db 30 dup (' ') ;должность age db 2 dup(‘ ’) ;возраст standing db 2 dup(‘ ’) ;стаж salary db 4 dup(‘ ’) ;оклад в рублях birthdate db 8 dup(‘ ’) ;дата народження worker ends Визначення даних з типом структури Для використовування описаної за допомогою шаблона структури в програмі

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

[ім'я змінної] ім'я_структури <[список значень]> Тут: ім'я змінної — ідентифікатор змінної даного структурного типу. Завдання імені

змінної необов'язкове. Якщо його не вказати, буде просто виділена область пам'яті розміром в суму довжин всіх елементів структури.

Page 62: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

62

список значень — укладений в кутові дужки список початкових значень елементів структури, розділених комами. Його завдання також необов'язкове. Якщо список вказаний не повністю, то всі поля структури для даної змінної ініціалізувалися значеннями з шаблона, якщо такі задані. Допускається ініціалізація окремих полів, але в цьому випадку пропущені поля повинні відділятися комами. Пропущені поля ініціалізують значеннями з шаблона структури. Якщо при визначенні нової змінної з типом даної структури ми згодні зі всіма значеннями полів в її шаблоні (тобто заданими за умовчанням), то потрібно просто написати кутові дужки. Наприклад: victor worker <>.

Для прикладу визначимо декілька змінних з типом описаної вище структури. data segment sotr1 worker <’Гурко Андрій Вячеславович’,,’художник’,’33’,‘15’,‘1800’, ’26.01.64’< sotr2 worker <’Михайлова Наталія Геннадьевна’,’ж’,’программист’,

’30’,’10’,’1680’,’27.10.58’< sotr3 worker <’Степанов Юрій Лонгинович’,,’художник’,’38’,’20’, ’1750’,’01.01.58’< sotr4 worker <’Юрова Олена Александровна’,’ж’,’свяэист’,’32’,’2’,, ’09.01.66’< sotr5 worker <> ;здесь всі значення за умовчанням data ends Методи роботи із структурою

Ідея введення структурного типу в будь-яку мову програмування полягає в об'єднанні різнотипних змінних в один об'єкт. В мові повинні бути засоби доступу до цих змінних усередині конкретного екземпляра структури. Для того, щоб послатися в команді на полі деякої структури, використовується спеціальний оператор — символ "." (крапка). Він використовується в наступній синтаксичній конструкції:

адресное_выражение.имя_поля_структуры

Тут: • адресне_вираження — ідентифікатор змінної деякого структурного типу або вираз в

дужках відповідно до вказаних нижче синтаксичних правил (мал. 27); • ім'я_поля_структури — ім'я поля з шаблона структури.Це, насправді, теж адреса, а

точніше, зсув поля від початку структури. Таким чином оператор "." (крапка) обчислює вираз (адресне_выраження) + (им'я_поля_структури)

Мал. 32. Синтаксис адресного виразу в операторі звернення до поля структури

Продемонструємо на прикладі певної нами структури worker деякі прийоми роботи із структурами. Наприклад, витягнути в ах значення поля з віком. Оскільки навряд чи вік працездатної людини буде більше величини 99 років, то після приміщення вмісту цього символьного поля в регістр ах його буде зручно перетворити в двійкове уявлення командою aad. Будьте уважні, оскільки через принцип зберігання даних “молодший байт за молодшою адресою” старша цифра віку буде поміщений в al, а молодша — в ah. Для коректування достатньо використовувати команду xchg al,ah:

mov ах,word ptr sotr1.age ;в al вік sotr1 xchg ah,al

а можна і так: lea bx,sotr1 mov ах,word ptr [bx].age

Page 63: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

63

xchg ah,al Давайте уявимо, що співробітників не четверо, а набагато більше, і до того ж їх число

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

mas_sotr worker 10 dup (<>)

Подальша робота з масивом структур проводиться так само, як і з одновимірним

масивом. Тут виникає декілька питань:Как бути з розміром і як організувати індексацію елементів масиву?

Аналогічно іншим ідентифікаторам, визначеним в програмі, транслятор призначає імені типу структури і імені змінної з типом структури атрибут типу. Значенням цього атрибуту є розмір в байтах, займаний полями цієї структури. Витягнути це значення можна з допомогою оператор type. Після того, як став відомий розмір екземпляра структури, організувати індексацію в масиві структур не представляє особливої складності.

Наприклад: worker struc ... worker ends ... mas_sotr worker 10 dup (<>) ... mov bx,type worker ;bx=77 lea di,mas_sotr ;извлечь і вивести на екран підлогу всіх співробітників: mov cx,10 суcl: mov al,[di].sex ... ;вывод на екран вмісту поля sex структури worker add di,bx ;к наступній структурі в масиві mas_sort loop суcl Як виконати копіювання поля з однієї структури у відповідне поле іншої структури?

Або як виконати копіювання всієї структури? Давайте виконаємо копіювання поля nam третього співробітника в полі nam п'ятого співробітника:

worker struc ... worker ends ... mas_sotr worker 10 dup (<>) ... mov bx,offset mas_sotr mov si,(type worker)*2 ;si=77*2 add si,bx mov di,(type worker)*4 ;si=77*4 add di,bx mov cx,30 rep movsb Мені здається, що ремесло програміста рано чи пізно робить людину схожою на

хорошу домогосподарку. Він, подібно ній, постійно знаходиться в пошуку, де б чого-

Page 64: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

64

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

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

Об'єднання Представимо ситуацію, коли ми використовуємо деяку область пам'яті для

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

Об'єднання — тип даних, що дозволяє трактувати одну і ту ж область пам'яті як має різні типи і імена.

Опис об'єднань в програмі нагадує опис структур, тобто спочатку описується шаблон, в якому за допомогою директив опису даних перераховуються імена і типи полів:

ім'я_об'єднання UNION <описание полей> ім'я_об'єднання ENDS Відмінність об'єднань від структур полягає, зокрема, в тому, що при визначенні

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

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

16-бітового зсуву; 32-бітового зсуву; пари з 16-бітового зсуву і 16-бітової сегментної складової адреси; у вигляді пари з 32-бітового зсуву і 16-бітового селектора. Які з цих покажчиків можна застосовувати в конкретній ситуації, залежить від

режиму адресації (use16 або use32) і режиму роботи мікропроцесора. Так от, описаний в лістингу 7 шаблон об'єднання дозволяє нам полегшити формування і використовування покажчиків різних типів.

Лістинг 7 Приклад використовування об'єднання .masm

Page 65: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

65

.model small

.stack 256

.586P pnt struc ;структура pnt, що містить вкладене об'єднання union ;опис вкладеного в структуру об'єднання offs_16 dw ? offs_32 dd ? ends ;кінець описи об'єднання segm dw ? ends ;кінець описи структури .data point union ;определение об'єднання, що містить вкладену структуру off_16 dw ? off_32 dd ? point_16 pnt <> point_32 pnt <> point ends tst db "Рядок для тестування" adr_data point <> ;определение екземпляра об'єднання .code main: mov ах,@data mov ds,ax mov ах,seg tst ;записать адреса сегменту рядка tst в полі структури adr_data mov adr_data.point_16.segm,ax ;когда знадобиться, можна витягнути значення з цього поля назад, наприклад, в регістр

bx: mov bx,adr_data.point_16.segm ;формируем зсув в полі структури adr_data mov ах,offset tst ;смещение рядки в ах mov adr_data.point_16.offs_16,ax ;аналогично, коли знадобиться, ;можна витягнути

значення з цього поля: mov bx,adr_data.point_16.offs_16 exit: mov ах,4c00h int 21h end main Коли ви працюватимете в захищеному режимі мікропроцесора і використовуватимете

32-розрядні адреси, то аналогічним способом можете заповнити і використати описане вище об'єднання.

Записи Наша “господиня-програміст” стає все більш економною. Вона вже хоче працювати з

продуктами на молекулярному рівні, без будь-яких відходів і марних витрат. Подумаємо, навіщо витрачати під деякий програмний індикатор із значенням “вімкнено-вимкнено” цілі вісім розрядів, якщо цілком хапає одного? А якщо таких індикаторів дещо, то витрата оперативної пам'яті може стати вельми відчутною. Коли ми знайомилися з логічними командами, то говорили, що їх можна застосовувати для вирішення подібної проблеми. Але це не зовсім ефективно, оскільки велика вірогідність помилок, особливо при складанні бітових масок.

Page 66: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

66

TASM надає нам спеціальний тип даних, використовування якого допомагає розв'язати проблему роботи з бітами більш ефективно. Йдеться про спеціальний тип даних — записах.

Запис — структурний тип даних, що складається з фіксованого числа елементів завдовжки від одного до декілька біт. При описі запису для кожного елементу указується його довжина в бітах і, що необов'язкове, деяке значення. Сумарний розмір запису визначається сумою розмірів її полів і не може бути більше 8, 16 або 32 біт. Якщо сумарний розмір запису менше вказаних значень, то всі поля запису “притискаються” до молодших розрядів.

Використовування записів в програмі, так само, як і структур, організовується в три етапи:

1. Завдання шаблона запису, тобто визначення набору бітових полів, їх довжин і, при необхідності, ініціалізація полів.

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

3. Організація звернення до елементів запису. Компілятор TASM, окрім стандартних засобів обробки записів, підтримує також і

деякі додаткові можливості їх обробки. Опис запису Опис шаблона запису має наступний синтаксис (мал. 33): ім'я_запису RECORD <описание элементов> Тут:

<описание элементов> є послідовністю описів окремих елементів запису згідно синтаксичній діаграмі (див. мал. 33):

Мал. 33. Синтаксис опису шаблона запису

При описі шаблона пам'ять не виділяється, оскільки це всього лише інформація для транслятора асемблера про структуру запису. Так само, як і для структур, місцеположення шаблона в програмі може бути будь-ким, але при цьому необхідно враховувати логіку роботи однопрохідного транслятора.

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

типом даного запису, для чого застосовується наступна синтаксична конструкція (мал. 34):

Мал. 34. Синтаксис опису екземпляра запису

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

Page 67: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

67

Якщо ініціалізувати поля не потрібен, то достатньо вказати ? при визначенні екземпляра запису:

... iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00 ... flag iotest ? Якщо ви складете і дослідите у відладчику тестовий приклад з даним визначенням

запису, то побачите, що всі поля змінної типу запис flag обнуляються. Це відбувається не дивлячись на те, що у визначенні запису задані початкові значення полів.

Якщо потрібна часткова ініціалізація елементів, то вони полягають в кутові (< і >) або фігурні ({ і }) дужки. Відмінність тут в тому, що в кутових дужках елементи повинні бути задані в тому ж порядку, що і у визначенні запису. Якщо значення деякого елементу співпадає з початковим, то його можна не указувати, але обов'язково позначити його комі. Для останніх елементів коми, що йдуть підряд, можна опустити. Наприклад, згодитися із значеннями за умовчанням можна так:

iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00 ... flag iotest <> ;согласились із значенням за умовчанням Змінити значення поля i2 можна так: iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00 ...

flag iotest <,10,> ; перевизначили i2 Застосовуючи фігурні дужки, також можна вказати вибіркову ініціалізацію полів, але

при цьому необов'язково позначати комами поля, із значеннями за умовчанням яких ми згодні:

iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00 ... flag iotest {i2=10} ;переопределили i2, не звертаючи уваги на порядок ;следования інших компонентів запису Робота із записами Як організувати роботу з окремими елементами запису? Звичні механізми адресації

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

Кожному імені елементу запису асемблер привласнює числове значення, рівне кількості зсувів управо, які потрібно провести для того, щоб цей елемент виявився “притиснутим” до початку осередку. Це дає нам можливість локалізувати його і працювати з ним. Але для цього потрібно знати довжину елементу в бітах.

Зсув управо проводиться за допомогою команди зсуву shr. Асемблер містить оператор width, який дозволяє взнати розмір елементу запису в

бітах або повністю розмір запису. Варіанти вживання оператора width: width ім’я_елементу_запису ;значением оператора буде розмір елементу в бітах. width ім’я_екземпляра_запису або width ім’я_типу_запису ;значением оператора буде розмір всього запису в бітах. mov al,width i2

Page 68: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

68

…. mov ах,width iotest Асемблер містить оператор mask, який дозволяє локалізувати біти потрібного

елементу запису. Ця локалізація проводиться шляхом створення маски, розмір якої співпадає з розміром запису. В цій масці обнулені біти на всіх позиціях, за винятком тих, які займає елемент в записі.

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

Тепер у вас є вся інформація про засоби асемблера для роботи із записами. Ви також зрозуміли, що безпосередньо звернутися до елементу запису неможливо. Щоб провести обробку елементу, що цікавить нас, потрібно спочатку виділити, зсунути його, при необхідності, до молодших розрядів, виконати необхідні дії і помістити його назад на своє місце в записі. Тому, щоб вам не винаходити кожного разу велосипед, далі ми опишемо типові алгоритми здійснення цих операцій над елементами запису. Ваша задача — закодувати ці алгоритми тим або іншим способом відповідно до вимог задачі.

Виділення елементу запису:

Помістити запис в тимчасову пам'ять — регістр (8, 16 або 32-бітовий залежно від розміру запису).

Одержати бітову маску, відповідну елементу запису, за допомогою оператора mask. Локалізувати биті в регістрі за допомогою маски і команди and. Зсунути біти елементу до молодших розрядів регістра командою shr. Число розрядів

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

і далі з ним можна проводити будь-які дії.

Робота з елементом запису: Як ми вже з'ясували, з елементами запису проводяться будь-які дії, як над звичною

двійковою інформацією. Єдине, що потрібно відстежувати, — це розмір бітового поля. Якщо, наприклад, розмір поля збільшиться, то згодом може відбутися випадкова зміна сусідніх полів бітів. Тому бажано виключити зміну розміру поля.

Приміщення зміненого елементу на його місце в запис: Використовуючи ім'я елементу запису як лічильник зсувів, зсунути вліво біти

елементу запису. Якщо ви не упевнені в тому, що розрядність результату перетворень не перевищила

початкову, можна виконати “обрізання” зайвих бітів, використовуючи команду and і маску елементу.

Підготувати початковий запис до вставки зміненого елементу шляхом обнулення бітів в записі на місці цього елементу. Це можна зробити шляхом накладення командою and інвертованої маски елементу запису на початковий запис.

За допомогою команди or накласти значення в регістрі на початковий запис. Як приклад розглянемо лістинг 8, який обнуляє поле i2 в записі iotest. Лістинг 8. Робота з полем запису ;prg_12_7.asm .masm .model small .stack 256 iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00 .data

Page 69: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

69

flag iotest <> .code main: mov ах,@data mov ds,ax mov al,mask i2 shr al,i2 ;биты i2 на початку ах and al,0fch ;обнулили i2 shl al,i2 ;помещаем i2 на місце mov bl,[flag] xor bl,mask i2 ;сбросили i2 or bl,al ;наложили exit: mov ах,4c00h ;стандартный вихід int 21h end main ;конец програми На закінчення ще раз проаналізуйте тип запису і особливості роботи з ним. При

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

Записи: додаткові можливості обробки Розуміючи важливість для ефективного програмування такого типу даних, як запис,

розробники транслятора TASM, починаючи з версії 3.0, включили в систему його команд дві додаткові команди на правах директив. Останнє означає, що ці команди зовні мають формат звичних команд асемблера, але після трансляції вони приводяться до одній або декількох машинних команд. Введення цих команд в мову TASM підвищує наочність роботи із записами, оптимізує код і зменшує розмір програми. Ці команди дозволяють приховати від програміста дії по виділенню і установці окремих полів запису (ми їх обговорювали вище).

Для установки значення деякого поля запису використовується команда setfield з синтаксисом:

setfield им’я_елементу_записи призначеня,регістр_ джерело Для вибірки значення деякого поля запису використовується команда getfield з

синтаксисом: getfield им’я_елементу_записи регістр_призначення, джерело Робота команди setfield полягає в наступному. Місцеположення запису визначається

операндом призначення, який може бути ім'ям регістра або адресою пам'яті. Операнд им’я_елементу_записи визначає елемент запису, з яким ведеться робота (по суті, якщо ви були уважні, він визначає зсув елементу в записі щодо молодшого розряду). Нове значення, в яке необхідно встановити вказаний елемент запису, повинне міститися в операнді регістр_джерело. Обробляючи дану команду, транслятор генерує послідовність команд, які виконують наступні дії:

логічну операцію or над операндами призначення і регістр_джерело. Результат операції поміщається в операнд призначення.

Важливо відзначити, що setfield не проводить попереднього очищення елементу, в результаті після логічного складання командою or можливе накладення старого вмісту елементу і нового встановлюваного значення. Тому вимагається заздалегідь підготувати поле в записі шляхом його обнулення.

Page 70: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

70

Дія команди getfield назад setfield. Як операнд джерело може бути вказано або регістр або адреса пам'яті. В регістр, вказаний операндом регістр_призначення, поміщається результат роботи команди — значення елементу запису. Цікава особливість пов'язана з регістр_призначення. Команда getfield завжди використовує 16-бітовий регістр, навіть якщо ви вкажете в цій команді ім'я 8-бітового регістра.

Як приклад вживання команд setfield і getfield розглянемо лістинг 9. Лістинг 9. Робота з полями запису ;prg_12_8.asm .masm .model small .stack 256 iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00 .data flag iotest <> .code main: mov ах,@data mov ds,ax mov al,flag mov bl,3 setfield i5 al,bl xor bl,bl getfield i5 bl,al mov bl,1 setfield i4 al,bl setfield i5 al,bl exit: mov ах,4c00h ;стандартный вихід int 21h end main ;конец програми Результат роботи команд setfield і getfield зручніше всього вивчати у відладчику. При

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

На закінчення хотілося б привести ще один приклад використовування записів. Це опис регістра eflags. Для зручності ми розбили цей опис на три частини:

• eflags_1_7 — молодший байт eflags/flags; • eflags_8_15 — другий байт eflags/flags; • eflags_h — старша половина eflags.

eflags_l_7 record sf7:1=0,zf6:1=0,c5:1=0,af4:1=0,c3:1=0,pf2:1=0,c1:=1,cf0:1=0 eflags_l_15 record c15:1=0,nt14:1=0,iopl:2=0,of11:1=0,df10:1=0,if9:1=1,tf8:1=0 eflags_h record з:13=0,ac18:1=0,vm17:1=0,rf16:1=0 Запам'ятайте цей опис. Коли ви освоїте роботу з макрокомандами і в подальшій своїй

роботі зіткнетеся з необхідністю працювати з регістром прапорів, то у вас буквально “зачешуться” руки, щоб написати відповідну макрокоманду. Ця макрокоманда, якщо ви не забудете добре її відтестувати, позбавить вас від багато кого важко помилок, що знаходяться.

Page 71: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

71

Структура машинної команди Машинна команда є закодованою за певними правилами вказівкою мікропроцесору

на виконання деякої операції або дії. Кожна команда містить елементи, що визначають: що робити? (відповідь на це питання дає елемент команди, званий кодом операції

(КОП)); об'єкти, над якими потрібне щось робити (ці елементи називаються операндами); як робити? (ці елементи називаються типами операндів — звичайно задаються

неявно). Приведений на мал. 35 формат машинної команди є найзагальнішим. Максимальна

довжина машинної команди — 15 байт. Реальна команда може містити набагато меншу кількість полів, аж до одного — тільки КОП.

Мал. 35. Формат машинної команди Опишемо призначення полів машинної команди. Префікси. Необов'язкові елементи машинної команди, кожний з яких складається з

одного байта або може бути відсутній. В пам'яті префікси передують команді. Призначення префіксів — модифікувати операцію, виконувану командою. Прикладна програма може використовувати наступні типи префіксів:

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

2eh — заміна сегменту cs; 36h — заміна сегменту ss; 3eh — заміна сегменту ds; 26h — заміна сегменту es; 64h — заміна сегменту fs; 65h — заміна сегменту gs. Префікс розрядності адреси уточнює розрядність адреси (32 або 16-розрядний).

Кожній команді, в якій використовується адресний операнд, ставиться у відповідність розрядність адреси цього операнда. Ця адреса може мати розрядність 16 або 32 біт. Якщо розрядність адреси для даної команди 16 біт, це означає, що команда містить 16-розрядний зсув (див. мал. 35), воно відповідає 16-розрядному зсуву адресного операнда щодо початку деякого сегменту. В контексті мал. 36 цей зсув називається ефективна адреса. Якщо розрядність адреси 32 біт, це означає, що команда містить 32-розрядний зсув (див. мал. 35 ), воно відповідає 32-розрядному зсуву адресного операнда щодо початку сегменту і по його значенню формується 32-бітовий зсув в сегменті. За допомогою префікса розрядності адреси можна змінити діюче за умовчанням значення розрядності адреси. Ця зміна торкатиметься тільки тієї команди, якій передує префікс.

Page 72: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

72

Мал. 36. Механізм формування фізичної адреси в реальному режимі

o Префікс розрядності операнда аналогічний префіксу розрядності адреси, але указує на розрядність операндів (32 або 16-розрядні), з якими працює команда. Відповідно до яких правил встановлюються значення атрибутів розрядності адреси і операндів за умовчанням? У реальному режимі і режимі віртуального i8086 значення цих атрибутів — 16 біт. В захищеному режимі значення атрибутів залежать від полягання біта D в дескрипторах виконуваних сегментів (див. урок 16). Якщо D = 0, то значення атрибутів, діючі за умовчанням, рівні 16 біт; якщо D = 1, то 32 біт. Значення префіксів розрядності операнда 66h і розрядності адреси 67h. Ви можете за допомогою префікса розрядності адреси в реальному режимі використовувати 32-розрядну адресацію, але при цьому необхідно пам'ятати про обмеженість розміру сегменту величиною 64 Кбайт. Аналогічно префіксу розрядності адреси ви можете використовувати префікс розрядності операнда в реальному режимі для роботи з 32-розрядними операндами (наприклад, в арифметичних командах).

o Префікс повторення використовується з ланцюжковими командами (командами обробки рядків). Цей префікс “зациклює” команду для обробки всіх елементів ланцюжка. Система команд підтримує два типи префіксів:

� безумовні (rep — 0f3h), примушуючі повторюватися ланцюжкову команду деяка кількість раз;

� умовні (repe/repz — 0f3h, repne/repnz — 0f2h), які при зацикленні перевіряють деякі прапори, і в результаті перевірки можливий достроковий вихід з циклу.

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

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

� Байт режиму адресації modr/m. Значення цього байта визначає форму адреси операндів, що використовується. Операнди можуть знаходитися в пам'яті в одному або двох регістрах. Якщо операнд знаходиться в пам'яті, то байт modr/m визначає компоненти (зсув, базовий і індексний регістри), що використовуються для обчислення його ефективної адреси (див. рис. 36). У захищеному режимі для

Page 73: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

73

визначення місцеположення операнда в пам'яті може додатково використовуватися байт sib (Scale-Index-Base — масштаб-индекс-база). Байт modr/m складається з трьох полів (див. рис. 35):

o поле mod визначає кількість байт, займаних в команді адресою операнда (див. рис. 35, поле зсув в команді). Поле mod використовується спільно з полем r/m, яке указує спосіб модифікації адреси операнда зсув в команді. Наприклад, якщо mod = 00, це означає, що поле зсув в команді відсутнє, і адреса операнда визначається вмістом базового і (або) індексного регістра. Які саме регістри використовуватимуться для обчислення ефективної адреси, визначається значенням цього байта. Якщо mod = 01, це означає, що поле зсув в команді присутнє, займає один байт і модифікується вмістом базового і (або) індексного регістра. Якщо mod = 10, це означає, що поле зсув в команді присутнє, займає два або чотири байти (залежно від діючого за умовчанням або визначуваного префіксом розміру адреси) і модифікується вмістом базового і (або) індексного регістра. Якщо mod = 11, це означає, що операндів в пам'яті немає: вони знаходяться в регістрах. Це ж значення байта mod використовується у разі, коли в команді застосовується безпосередній операнд;

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

поле r/m використовується спільно з полем mod і визначає або регістр, що знаходиться в команді на місці першого операнда (якщо mod = 11), або базові і індексні регістри, що використовуються для обчислення ефективної адреси (сумісний з полем зсув в команді).

� Байт масштаб-индекс-база (байт sib) використовується для розширення можливостей адресації операндів. На наявність байта sib в машинній команді указує поєднання одного із значень 01 або 10 поля mod і значення поля r/m= 100. Байт sib складається з трьох полів:

• поля масштабу ss. В цьому полі розміщується масштабний множник для індексного компоненту index, що займає наступні три біти байта sib. У полі ss може міститися одне з наступних значень: 1, 2, 4, 8. При обчисленні ефективної адреси на це значення умножатиметься вміст індексного регістра. Більш детально з практичної точки зору ця розширена можливість індексації розглядається на уроці 12 при обговоренні питань роботи з масивами;

• поля index — використовується для зберігання номера індексного регістра, який застосовується для обчислення ефективної адреси операнда;

• поля base — використовується для зберігання номера базового регістра, який також застосовується для обчислення ефективної адреси операнда. Нагадаю, що як базове і індексне регістрів можуть використовуватися практично всі регістри загального призначення. Поле зсуву в команді. 8, 16 або 32-розрядне ціле число із знаком, що є, повністю або

частково (з урахуванням вищенаведених міркувань), значення ефективної адреси операнда. Поле безпосереднього операнда. Необов'язкове поле, що є 8, 16 або 32-розрядний

безпосередній операнд. Наявність цього поля, звичайно, відображається на значенні байта modr/m.

Page 74: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

74

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

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

Операнд задається неявно на мікропрограмному рівні. В цьому випадку команда явно не містить операндів. Алгоритм виконання команди використовує деякі об'єкти за умовчанням (регістри, прапори в eflags і т. д.). Наприклад, команди cli і sti неявно працюють з прапором переривання if в регістрі eflags, а команда xlat неявно звертається до регістра al і рядка в пам'яті за адресою, визначуваною парою регістрів ds:bx.

Операнд задається в самій команді (безпосередній операнд). Операнд знаходиться в коді команди, тобто є її частиною. Для зберігання такого операнда в команді виділяється поле завдовжки до 32 біт (див. мал. 35). Безпосередній операнд може бути тільки другим операндом (джерелом). Операнд одержувач може знаходитися або в пам'яті, або в регістрі.

Наприклад: mov ах,0ffffh пересилає в регістр ах шестнадцатеричную константу ffff. Команда add sum,2 складає вміст поля за адресою sum з цілим числом 2 і записує результат по місцю першого операнда, тобто в пам'ять.

Операнд знаходиться в одному з регістрів. Регістрові операнди указуються іменами регістрів. Як регістри можуть використовуватися:

• 32-розрядні регістри EAX, EBX, ЕСX, EDX, ESI, EDI, ESP, EBP; • 16-розрядні регістри АХ, BX, CX, DX, SI, DI, SP, BP; • 8-розрядні регістри AH, AL, BH, BL, CH, CL, DH, DL; • сегментні регістри CS, DS, SS, ES, FS, GS.

Наприклад, команда add ах,bx складає вміст регістрів ах і bx і записує результат в bx. Команда dec si зменшує вміст si на 1.

Операнд розташовується в пам'яті. Це найскладніший і в той же час найгнучкіший спосіб завдання операндів. Він дозволяє реалізувати наступні два основні види адресації: пряму і непряму.

У свою чергу, непряма адресація має наступні різновиди: • непряма базова адресація; інша її назва — регістрова непряма адресація; • непряма базова адресація із зсувом; • непряма індексна адресація із зсувом; • непряма базова індексна адресація; • непряма базова індексна адресація із зсувом.

Операндом є порт уведення-виведення. Як ми вже відзначали, крім адресного простору оперативної пам'яті мікропроцесор підтримує адресний простір уведення-виведення, який використовується для доступу до пристроїв уведення-виведення. Об'єм адресного простору уведення-виведення складає 64 Кбайт. Для будь-якого пристрою комп'ютера в цьому просторі виділяються адреси. Конкретне значення адреси в межах цього простору називається портом уведення-виведення. Фізично порту уведення-виведення відповідає апаратний регістр (не плутати з регістром мікропроцесора), доступ до якого здійснюється за допомогою спеціальних команд асемблера in і out.

Наприклад in al,60h ;ввести байт з порту 60h Регістри, що адресуються за допомогою порту уведення-виведення, можуть мати

розрядність 8, 16 або 32 біт, але для конкретного порту розрядність регістра фіксована.

Page 75: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

75

Команди in і out працюють з фіксованою номенклатурою об'єктів. Як джерело інформації або одержувача застосовуються так звані регістри-акумулятори eax, ах, al. Вибір регістра визначається розрядністю порту. Номер порту може задаватися безпосереднім операндом в командах in і out або значенням в регістрі dx. Останній спосіб дозволяє динамічно визначити номер порту в програмі. Наприклад:

mov dx,20h ;записать номер порту 20h в регістр dx mov al,20h ;записать значення 20h в регістр al dx,al ;вывести значення 20h в порт 20H Операнд знаходиться в стеку. Команди можуть зовсім не мати операнди, мати один або два операнди. Більшість

команд вимагає двох операндів, один з яких є операндом-джерелом, а другий — операндом призначення. Важливе те, що один операнд може розташовуватися в регістрі або пам'яті, а другий операнд обов'язково повинен знаходитися в регістрі або безпосередньо в команді. Безпосередній операнд може бути тільки операндом-джерелом. В двооперандній машинній команді можливі наступні поєднання операндів:

• регістр— регістр; • регістр— пам'ять; • пам'ять—регістр; • безпосередній операнд—регістр; • безпосередній операнд—пам'ять.

У даного правила є виключення, які торкаються: • команд роботи з ланцюжками, які можуть переміщати дані з пам'яті в пам'ять; • команд роботи із стеком, які можуть переносити дані з пам'яті в стек, що також

знаходиться в пам'яті; • команд типу множення, які окрім операнда, вказаного в команді, використовують ще і

другий, неявний операнд. З перерахованих поєднань операндів найбільш часто уживаються регістр— пам'ять і

пам'ять—регістр. Зважаючи на їх важливість розглянемо їх докладніше. Обговорення ми супроводжуватимемо прикладами команд асемблера, які показуватимуть, як змінюється формат команди асемблера при вживанні того або іншого виду адресації. У зв'язку з цим подивитеся ще раз на мал. 36, на якому показаний принцип формування фізичної адреси на адресній шині мікропроцесора. Видно, що адреса операнда формується як сума двох складових — зсунутого на 4 біт вмісту сегментного регістра і 16-бітової ефективної адреси, яка в загальному випадку обчислюється як сума трьох компонентів: бази, зсуву і індексу.

Перерахуємо і потім розглянемо особливості основних видів адресації операндів в пам'яті:

• Пряма адресація • Непряма базова (регістрова) адресація • Непряма базова (регістрова) адресація із зсувом • Непряма індексна адресація із зсувом • Непряма базова індексна адресація • Непряма базова індексна адресація із зсувом

Пряма адресація Це найпростіший вид адресації операнда в пам'яті, оскільки ефективна адреса

міститься в самій команді і для його формування не використовується ніяких додаткових джерел або регістрів. Ефективна адреса береться безпосередньо з поля зсуву машинної

Page 76: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

76

команди (див. мал. 35), який може мати розмір 8, 16, 32 біт. Це значення однозначно визначає байт, слово або подвійне слово, розташоване в сегменті даних.

Пряма адресація може бути двох типів: • Відносна пряма адресація. Використовується для команд умовних переходів, для

вказівки відносної адреси переходу. Відносність такого переходу полягає в тому, що в полі зсуву машинної команди міститься 8, 16 або 32-бітове значення, яке в результаті роботи команди складатиметься з вмістом регістра покажчика команд ip/eip. В результаті такого складання виходить адреса, по якій і здійснюється перехід. Наприклад:

jс m1 ;переход на мітку m1, якщо прапор cf = 1 mov al,2 ... m1: Не дивлячись на те, що в команді вказана деяка мітка в програмі, асемблер обчислює

зсув цієї мітки щодо наступної команди (в нашому випадку це mov al,2) і підставляє його у формовану машинну команду jc.

Абсолютна пряма адресація. В цьому випадку ефективна адреса є частиною машинної команди, але формується ця адреса тільки із значення поля зсуву в команді. Для формування фізичної адреси операнда в пам'яті мікропроцесор складає це поле із зсунутим на 4 біт значенням сегментного регістра. В команді асемблера можна використовувати декілька форм такої адресації.

Наприклад: mov ах,dword ptr [0000] ;записать слово за адресою ;ds:0000 в регістр ах Але така адресація застосовується рідко — звичайно осередкам, що

використовуються, в програмі привласнюються символічні імена. В процесі трансляції асемблер обчислює і підставляє значення зсувів цих імен у формовану їм машинну команду в полі зсув в команді (див. мал. 35). У результаті виходить так, що машинна команда прямо адресує свій операнд, маючи, фактично, в одному з своїх полів значення ефективної адреси.

Наприклад: data segment per1 dw 5 ... data ends code segment mov ах,data mov ds,ax ... mov ах,per1 ;записать слово per1 (його фізична адреса ds:0000) в ах Ми одержимо той же результат, що і при використовуванні команди mov ах,dword ptr [0000] Решта видів адресації відноситься до непрямих. Слово “непрямий” в назві цих видів

адресації означає те, що в самій команді може знаходитися лише частина ефективної адреси, а решта його компонентів знаходиться в регістрах, на які указують своїм вмістом байт modr/m і, можливо, байт sib.

Page 77: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

77

Непряма базова (регістрова) адресація При такій адресації ефективна адреса операнда може знаходитися в будь-якому з

регістрів загального призначення, окрім sp/esp і bp/ebp (це специфічні регістри для роботи з сегментом стека). Синтаксично в команді цей режим адресації виражається висновком імені регістра в квадратні дужки [ ]. Наприклад, команда mov ах,[ecx] поміщає в регістр ах вміст слова за адресою з сегменту даних із зсувом, що бережеться в регістрі ecx. Оскільки вміст регістра легко змінити в ході роботи програми, даний спосіб адресації дозволяє динамічно призначити адресу операнда для деякої машинної команди. Це властивість дуже корисно, наприклад, для організації циклічних обчислень і для роботи з різними структурами даних типу таблиць або масивів.

Непряма базова (регістрова) адресація із зсувом Цей вид адресації є доповненням попереднього і призначений для доступу до даних з

відомим зсувом щодо деякої базової адреси. Цей вид адресації зручно використовувати для доступу до елементів структур даних, коли зсув елементів відомий наперед, на стадії розробки програми, а базова (початковий) адреса структури повинна обчислюватися динамічно, на стадії виконання програми. Модифікація вмісту базового регістра дозволяє звернутися до однойменних елементів різних екземплярів однотипних структур даних. Наприклад, команда mov ах,[edx+3h] пересилає в регістр ах слова з області пам'яті за адресою: вміст edx + 3h. Команда mov ах,mas[dx] пересилає в регістр ах слово за адресою: вміст dx плюс значення ідентифікатора mas (не забувайте, що транслятор привласнює кожному ідентифікатору значення, рівне зсуву цього ідентифікатора щодо початку сегменту даних).

Непряма індексна адресація із зсувом Цей вид адресації дуже схожий на непряму базову адресацію із зсувом. Тут також для

формування ефективної адреси використовується один з регістрів загального призначення. Але індексна адресація володіє однією цікавою особливістю, яка дуже зручна для роботи з масивами. Вона пов'язана з можливістю так званого масштабування вмісту індексного регістра. Що це таке? Подивіться на мал. 35. Нас цікавить байт sib. При обговоренні структури цього байта ми відзначали, що він складається з трьох полів. Одне з цих полів — поле масштабу ss, на значення якого умножається вміст індексного регістра.

Наприклад, в команді mov ах,mas[si*2] значення ефективної адреси другого операнда обчислюється виразом mas+(si)*2. У зв'язку з тим, що в асемблері немає засобів для організації індексації масивів, то програмісту своїми силами доводиться її організовувати. Наявність можливості масштабування істотно допомагає в рішенні цієї проблеми, але за умови, що розмір елементів масиву складає 1, 2, 4 або 8 байт.

Непряма базова індексна адресація При цьому виді адресації ефективна адреса формується як сума вмісту двох регістрів

загального призначення: базового і індексного. Як ці регістри можуть застосовуватися будь-які регістри загального призначення, при цьому часто використовується масштабування вмісту індексного регістра.

Наприклад:

Page 78: МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ ...kit.znu.edu.ua/Meth/arch1.pdf · 2004-10-21 · Шинна організація ibm pc..... 4 Організація

78

mov eax,[esi][edx] У даному прикладі ефективна адреса другого операнда формується з двох

компонентів (esi)+(edx).

Непряма базова індексна адресація із зсувом Цей вид адресації є доповненням непрямої індексної адресації. Ефективна адреса

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

Наприклад, команда mov eax,[esi+5][edx] пересилає в регістр eax подвійне слово за адресою: (esi) + 5 + (edx).

Команда add ах,array[esi][ebx] проводить складання вмісту регістра ах з вмістом слова за адресою: значення ідентифікатора array + (esi) + (ebx).

Література

• Шагурин И.И. Pentium 4 - новий ступінь розвитку мікропроцесорної техніки // Chip News. - 2000. - № 9. - З. 18-20.

• Шагурин И.И., Бердышев Е.М. Процесори сімейства P6 - Pentium II, Pentium III, Celeron і інші. Архітектура, програмування, інтерфейс. - М.: Гаряча лінія - телеком. - 2000. - 248 з.

• Джим Гилл. Пам'ять. Домінанта технології // Chip News. - 2000. - № 8. - З. 52-55.