Смекни!
smekni.com

Програмування універсальних мікропроцесорів на мовах Асемблер (стр. 2 из 3)

У захищеному режимі також можливе переключення 16-и і 32-бітної адресації.

Розходження між режимами адресації при використанні 16-и і 32-бітної адресації показані в таблиці 2.

Таблиця 2.

Компонент 16-бітна адресація 32-бітна адресація
Базовий регістр ВХ або ВР Будь-який 32-бітний регістр загального призначення.
Індексний регістр SI або DI Будь-який 32-бітний регістр загального призначення, крім ESP
Масштаб Немає (завжди 1) 1, 2, 4, 8
Зсув 0, 8, 16 біт 0, 8, 32 біт

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

2. Класифікація і формати команд МП IA-32

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

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

Система команд МП сімейства Іntel 80X86 містить кілька сотень інструкцій, що мають різне функціональне призначення.

Можна навести таку класифікацію команд МП сімейства Іntel 80X86:

- інструкції пересилання даних,

- інструкції введення-виведення,

- інструкції двійкової арифметики,

- інструкції десяткової арифметики,

- інструкції логічних операцій,

- зсуви й обертання (циклічні зсуви),

- інструкції обробки біт і байт,

- команди передачі керування,

- умовні переходи,

- інструкції виклику процедури,

- строкові операції,

- операції з прапорами,

- інструкції завантаження покажчиків,

- інструкції математичного співпроцесора,

- інструкції пакетів мультимєдійних розширень (MMX, SSE),

- системні інструкції.

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

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

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

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

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

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

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

Рис. 2.Формат речень асемблера.

Синтаксичні діаграми, що пояснюють формат директив, команд і макрокоманд асемблера, представлені на рис. 3 і 4 відповідно.

Рис. 3.Формат директив асемблера.



Рис. 4. Формат команд і макрокоманд

На цих рисунках:

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

- ім'я -- ідентифікатор, що відрізняє дану директиву від інших директив;

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

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

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

Припустимими символами при написанні тексту програм є:

1. усі латинські букви: A-Z, a-z. При цьому заголовні і малі літери вважаються еквівалентними;

2. цифри від 0 до 9;

3. знаки ?, @, $, _, &;

4. роздільники , . [ ] ( ) < > { } + / * % ! ' " ? &bsol; = # ^.

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

Лексемами є:

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

- ланцюжки символів - послідовності символів, укладені в одинарних або подвійних лапках;

- цілі числа в одній з наступних систем числення: двійкової, десяткової, шістнадцяткової.

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

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

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

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

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

Можливо провести наступну класифікацію операндів:

- постійні або безпосередні операнди,

- адресні операнди,

- переміщувані операнди,

- лічильник адреси,

- регістровий операнд,

- базовий і індексний операнди,

- структурні операнди,

- записи.

Перелічимо тепер можливі типи операторів асемблера.

- арифметичні оператори,

- оператори зсуву,

- оператори порівняння,

- логічні оператори,

- індексний оператор,

- оператор перевизначення типу,

- оператор перевизначення сегмента,

- оператор іменування типу структури,

- оператор одержання сегментної складової адреси виразу,

- оператор одержання зсуву виразу.

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

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

Розглянемо декілька базових операторів найбільш простих і розповсюджених типів, що дозволяють створювати найпростіші програми. Усі приклади подані для реального режиму роботи МП ІA-32. Крім того, усі числа в цих прикладах є шістнадцятковими, однак буква h наприкінці числа опущена, а також не використовуються мітки й імена констант і змінних.

1. mov < операнд призначення (приймач) >, < операнд – джерело >. Це -- основна команда пересилання даних загального призначення. Вона реалізує найрізноманітніші варіанти пересилання.

Наприклад:

MOV AL,03 - помістити число 03 у молодшу половину (байт) регістра АХ. Тут 03 - безпосередній операнд, а AL - регістровий операнд. Регістровий операнд -- це просте ім'я регістра. У програмі на асемблері можна використовувати імена всіх регістрів загального призначення і більшості системних регістрів.