Структура команди мовою асемблера містить. Команди мови асемблера. Оперативна пам'ять, регістри, подання даних

Для того, щоб машина могла виконати команди людини на апаратному рівні, необхідно задати певну послідовність дій мовою «нуликів та одиниць». Помічником у цій справі стане Асемблер. Це утиліта, яка працює з перекладом команд машинною мовою. Проте написання програми – дуже трудомісткий та складний процес. Ця мова не призначена для створення легких та простих дій. На даний момент будь-яка мова програмування (Ассемблер працює чудово) дозволяє написати спеціальні ефективні завдання, які сильно впливають на роботу апаратної частини. Основним призначенням є створення мікрокоманд та невеликих кодів. Ця мова дає більше можливостей, ніж Паскаль або С.

Короткий опис мов Ассемблера

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

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

Коротко про структуру мови

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

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

Для кожної лінійки процесора існує своя При такому розкладі правильним буде будь-який процес, у тому числі перекладений

Мова Асемблера має кілька синтаксисів, які будуть розглянуті у статті.

Плюси мови

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

Драйвера, операційні системи, BIOS, компілятори, інтерпретатори і т. д. – це все програма на мовою Асемблера.

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

Мінуси мови

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

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

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

Команди мови

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


Використання директив

Програмування мікроконтролерів мовою (Ассемблер це дозволяє і чудово справляється з функціонуванням) найнижчого рівня найчастіше закінчується успішно. Найкраще використовувати процесори з обмеженим ресурсом. Для 32-розрядної техніки ця мовапідходить чудово. Часто в кодах можна побачити директиви. Що ж це таке? І навіщо використовується?

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


походження назви

Завдяки чому отримав назву мова - "Ассемблер"? Йдеться про транслятор і компілятор, які і роблять зашифровку даних. З англійської Assembler означає не що інше, як збирач. Програма не була зібрана вручну, використано автоматичну структуру. Більше того, на даний момент вже у користувачів та фахівців стерлася різниця між термінами. Часто Асемблером називають мови програмування, хоча це лише утиліта.

Через загальноприйнятої збірної назви у деяких виникає помилкове рішення, що існує єдина мова низького рівня (або стандартні норми для неї). Щоб програміст зрозумів, про яку структуру йдеться, необхідно уточнювати, для якої платформи використовується та чи інша мова Асемблера.

Макрозасоби

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

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

Курсова робота

За дисципліною " Системне програмування»

Тема №4: «Рішення задач на процедури»

Варіант 2

СХІДНО-СИБІРСЬКИЙ ДЕРЖАВНИЙ УНІВЕРСИТЕТ

ТЕХНОЛОГІЙ І УПРАВЛІННЯ

____________________________________________________________________

ТЕХНОЛОГІЧНИЙ КОЛЕДЖ

ЗАВДАННЯ

на курсову роботу

Дисципліна:
Тема: Вирішення задач на процедури
Виконавець(и):Главінська Аріна Олександрівна
Керівник: Дамбаєва Сесегма Вікторівна
Короткий зміст роботи: вивчення підпрограм мовою Асемблера,
розв'язання задач з використанням підпрограм
1. Теоретична частина: Основні відомості про мову Асемблер (набір
команд і т.д.), Організація підпрограм, Способи передачі параметрів
у підпрограмах
2. Практична частина: Розробити дві підпрограми, одна з яких перетворює будь-яку задану літеру в заголовну (у тому числі для російських літер), а інша перетворює літеру в рядкову.
перетворює будь-яку задану букву на головну, а інша перетворює букву на рядкову.
перетворює букву на рядкову.
Терміни виконання проекту за графіком:
1. Теоретична частина – 30 % до 7 тижня.
2. Практична частина – 70 % до 11 тижня.
3. Захист – 100% до 14 тижня.
Вимоги до оформлення:
1. Розрахунково-пояснювальна записка курсового проекту має бути представлена ​​в
електронної та твердої копії.
2. Обсяг звіту повинен бути не менше 20 машинописних сторінок без урахування додатків.
3. РПЗ оформляється за ГОСТом 7.32-91 та підписується у керівника.

Керівник роботи __________________

Виконавець __________________

Дата видачі " 26 " вересня 2017 р.


Вступ. 2

1.1 Основні відомості про мову Асемблер. 3

1.1.1 Набір команд. 4

1.2 Організація підпрограм у мові Ассемблер. 4

1.3 Способи передачі параметрів підпрограмах. 6

1.3.1 Передача параметрів через регістри.

1.3.2 Передача параметрів через стек. 7

2 ПРАКТИЧНИЙ РОЗДІЛ 9

2.1 Постановка задачі. 9

2.2 Опис розв'язання задачі. 9

2.3 Тестування програми.

Висновок. 8

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


Вступ

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

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

Друга сфера застосування Асемблера пов'язана з оптимізацією виконання програм. Дуже часто програми-перекладачі (компілятори) з мов високого рівня дають дуже неефективну програму машинною мовою. Зазвичай це стосується програм обчислювального характеру, у яких більшу частину часу виконується дуже невелика (близько 3-5%) ділянка програми (головний цикл). Для вирішення цієї проблеми можуть використовуватися так звані багатомовні системи програмування, які дозволяють записувати частини програми різними мовами. Зазвичай основну частину програми записується мовою програмування високого рівня (Фортране, Паскале, З повагою та ін.), а критичні за часом виконання ділянки програми – на Асемблері. Швидкість роботи всієї програми може значно збільшитися. Часто це єдиний спосіб змусити програму дати результат за прийнятний час.

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

Завдання роботи:

1. Вивчити основні відомості про мову Ассемблер (структура та компоненти програми на Ассемблері, формат команд, організація підпрограм та ін.);

2. Вивчити види бітових операцій, формат та логіку роботи логічних команд Асемблера;

3. Вирішити індивідуальне завдання застосування підпрограм в Асемблері;

4.. Сформулювати висновок про виконану роботу.

1 ТЕОРЕТИЧНИЙ РОЗДІЛ

Основні відомості про мову Ассемблер

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

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

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

Гідності й недоліки

· Мінімальна кількість надлишкового коду (використання меншої кількості команд та звернень на згадку). Як наслідок – більша швидкість та менший розмір програми;

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

· погана читабельність коду, труднощі підтримки (налагодження, додавання можливостей);

· Проблема реалізації парадигм програмування та будь-яких інших скільки-небудь складних конвенцій, складність спільної розробки;

· менша кількість доступних бібліотек, їх мала сумісність;

· Безпосередній доступ до апаратури: портів введення-виводу, спеціальним регістрам процесора;

· максимальне «підгонка» для потрібної платформи (використання спеціальних інструкцій, технічні особливості «заліза»);

· Непереносимість інші платформи (крім двійково сумісних).

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

· Визначення даних (констант та змінних);

· Керування організацією програми в пам'яті та параметрами вихідного файлу;

· Завдання режиму роботи компілятора;

· Різні абстракції (тобто елементи мов високого рівня) - від оформлення процедур та функцій (для спрощення реалізації парадигми процедурного програмування) до умовних конструкцій та циклів (для парадигми структурного програмування);

· Макроси.

Набір команд

Типовими командами мови асемблера є:

· Команди пересилання даних (mov та ін)

· Арифметичні команди (add, sub, imul та ін.)

· Логічні та побітові операції (or, and, xor, shr та ін)

· Команди управління ходом виконання програми (jmp, loop, ret та ін.)

· Команди виклику переривань (іноді відносять до команд управління): int

· Команди введення-виведення в порти (in, out)

Для мікроконтролерів та мікрокомп'ютерів характерні також команди, що виконують перевірку та перехід за умовою, наприклад:

· jne - перейти, якщо не одно;

· jge - перейти, якщо більше або дорівнює.

Загальні відомостіпро мову асемблера

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

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

Символічні імена, що вводяться при програмуванні мовою асемблера, зазвичай відбивають семантику програми, а абревіатура команд - їх основну функцію. Наприклад: PARAM – параметр, TABLE – таблиця, MASK – маска, ADD – додавання, SUB – віднімання тощо. п. Такі імена легко запам'ятовуються програмістом.

Для програмування мовою асемблера необхідно мати складні інструментальні засоби, ніж при програмуванні машинною мовою: потрібні обчислювальні комплекси на базі мікро - ЕОМ або ПЕОМ з комплектом периферійних пристроїв (алфавітно-цифрова клавіатура, символьний дисплей, НГМД та друкувальний пристрій), а також резидент чи крос-системи програмування для необхідних типів мікропроцесорів. Мова асемблера дозволяє ефективно писати та налагоджувати значно складніші програми, ніж машинна мова (до 1 – 4 Кбайт).

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

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

У зв'язку з цим практично всі програми управління пристроями вводу/виводу (драйвери) пишуться мовою асемблера, не дивлячись на наявність досить великої номенклатури мов високого рівня.

За допомогою мови асемблера програміст може задати такі параметри:

мнемоніку (символічне ім'я) кожної команди машинної мови мікропроцесора;

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

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

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

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

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

Для мікро - ЕОМ, побудованих на базі найбільш поширених типів мікропроцесорів, може існувати кілька варіантів мови асемблера, проте практичне поширення зазвичай має один - це так звана стандартна мова асемблера

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

Кожна машинна команда складається із двох частин:

· Операційної - визначальною, "що робити";

· Операндний - визначальною об'єкти обробки, "з чим робити".

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

мітка команда/директива операнд(и) ;коментарі

При цьому обов'язковим полем у рядку є команда чи директива.

Мітка, команда/директива та операнди (якщо є) поділяються принаймні одним символом пробілу або табуляції.

Якщо команду або директиву необхідно продовжити на наступному рядку, використовується символ зворотний слєш: \.

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

Пряма адресація: ефективна адреса визначається безпосередньо полем усунення машинної команди, яке може мати розмір 8, 16 або 32 біти.

mov eax, sum; eax = sum

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

Непряма адресаціяу свою чергу має такі види:

· Непряма базова (реєстрова) адресація;

· Непряма базова (реєстрова) адресація зі зміщенням;

· Непряма індексна адресація;

· Непряма базова індексна адресація.

Непряма базова (реєстрова) адресація.При такій адресації ефективна адреса операнда може знаходитись у будь-якому з регістрів загального призначення, крім sp/esp та bp/ebp (це специфічні регістри для роботи з сегментом стека). Синтаксично у команді цей режим адресації виражається укладанням імені регістру в квадратні дужки.

mov eax, ; eax = * esi; *esi значення за адресою esi

Структура команди мовою асемблера Програмування лише на рівні машинних команд - це мінімальний рівень, у якому можливе програмування комп'ютера. Система машинних команд має бути достатньою для того, щоб реалізувати необхідні дії, видаючи вказівки апаратури машини. Кожна машинна команда складається з двох частин: операційної, що визначає "що робити" і операндної, що визначає об'єкти обробки, тобто "над чим робити". Машинна команда мікропроцесора, записана мовою Асемблера, є одним рядком, що має наступний вигляд: мітка команда/директива операнд(и) ; коментарі Мітка, команда/директива та операнд поділяються принаймні одним символом пробілу або табуляції. Операнди команди розділяються комами.

Структура команди мовою асемблера Команда асемблера вказує транслятору, яку дію має виконувати мікропроцесор. Директиви асемблера - параметри, задані у тексті програми, що впливають процес асемблирования чи властивості вихідного файла. Операнд визначає початкове значення даних (у сегменті даних) або елементи, над якими виконується дія за командою (сегмент коду). Команда може мати один або два операнди, або не мати операндів. Число операндів неявно задається кодом команди. Якщо команду або директиву необхідно продовжити на наступному рядку, використовується символ «зворотний сліш»: «» . За замовчуванням Ассемблер не розрізняє великі та малі літери у написанні команд і директив. Приклади директиви та команди Count db 1; Ім'я, директива, один операнд mov eax, 0; Команда, два операнди

Ідентифікатори – послідовності допустимих символів, що використовуються для позначення імен змінних та назв міток. Ідентифікатор може складатися з одного або кількох таких символів: всі літери латинського алфавіту; цифри від 0 до 9; спецсимволи: _, @, $, ? . Як перший символ мітки може використовуватися точка. Як ідентифікатори не можна використовувати зарезервовані імена асемблера (директиви, оператори, імена команд). Першим символом ідентифікатора має бути буква або спецсимвол. Максимальна довжина ідентифікатора 255 символів, але транслятор приймає перші 32, інші ігнорує. Усі мітки, які записуються в рядку, що не містить директиви асемблера, повинні закінчуватися двокрапкою «:». Мітка, команда (директива) та операнд не обов'язково повинні починатися з певної позиції в рядку. Рекомендується записувати їх в колонку для більшої добованості програми.

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

Коментарі Використання коментарів у програмі покращує її ясність, особливо там, де призначення набору команд є незрозумілим. Коментарі починаються на будь-якому рядку вихідного модуля із символу «точка з комою» (;). Усі символи, що знаходяться праворуч від “; » до кінця рядка є коментарем. Коментар може містити будь-які друковані символи, включаючи пробіл . Коментар може займати весь рядок або слідувати за командою на тому ж рядку.

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

Моделі пам'яті Перед оголошенням сегментів необхідно вказати модель пам'яті за допомогою директиви. MODEL модифікатор модель_пам'яті, угода_про_дзвінки, тип_ОС, параметр_стека Основні моделі пам'яті мови асемблера: Модель пам'яті Адресація коду Адресація даних Операційна системаЧергування коду та даних TINY NEAR MS-DOS Допустимо SMALL NEAR MS-DOS, Windows Немає MEDIUM FAR NEAR MS-DOS, Windows Немає COMPACT NEAR FAR MS-DOS, Windows Ні LARGE FAR MS-DOS, Windows Ні HUGE FAR MS-DOS, Windows Немає NEAR Windows 2000, Windows XP, Windows Допустимо FLAT NEAR NT,

Моделі пам'яті Модель tiny працює тільки в 16-розрядних програмах MS-DOS. У цій моделі всі дані та код розташовуються в одному фізичному сегменті. Розмір програмного файлуу разі не перевищує 64 Кбайт. Модель small підтримує один сегмент коду та один сегмент даних. Дані та код при використанні цієї моделі адресуються як near (ближні). Модель medium підтримує кілька сегментів програмного коду і один сегмент даних, причому всі посилання в сегментах програмного коду за умовчанням вважаються далекими (far), а посилання в сегменті даних - ближніми (near). Модель compact підтримує кілька сегментів даних, у яких використовується дальня адресація даних (far), та один сегмент коду з ближньою адресацією (near). Модель large підтримує кілька сегментів коду та кілька сегментів даних. За замовчуванням усі посилання на код та дані вважаються далекими (far). Модель huge практично еквівалентна моделі пам'яті large.

Моделі пам'яті Модель flat передбачає несегментовану конфігурацію програми і використовується лише в 32-розрядних операційних системах. Ця модель подібна до моделі tiny в тому сенсі, що дані і код розміщені в одному сегменті, тільки 32-розрядному. Для розробки програми моделі flat перед директивою. model flat слід розмістити одну з директив: . 386, . 486, . 586 або. 686. Вибір директиви вибору процесора визначає набір команд, доступних під час написання програм. Літера p після директиви вибору процесора означає захищений режим роботи. Адресація даних та коду є ближньою (near), при цьому всі адреси та покажчики є 32-розрядними.

Моделі пам'яті. MODEL модифікатор модель_пам'яті, угода_про_дзвінки, тип_ОС, параметр_стека Параметр модифікатор використовується для визначення типів сегментів і може приймати значення: use 16 (сегменти вибраної моделі використовуються як 16-бітні) use 32 (сегменти вибраної моделі використовуються як 32-бітові). Параметр угода_про_дзвінки використовується для визначення способу передачі параметрів при виклику процедури з інших мов, у тому числі і високого рівня (C++, Pascal). Параметр може приймати такі значення: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL.

Моделі пам'яті. MODEL модифікатор модель_пам'яті, угода_про_дзвінки, тип_ОС, параметр_стека Параметр тип_ОС дорівнює OS_DOS за замовчуванням, і на даний момент це єдине значення цього параметра, що підтримується. Параметр параметр_стека встановлюється рівним: NEARSTACK (реєстр SS дорівнює DS, області даних і стека розміщуються в тому самому фізичному сегменті) FARSTACK (реєстр SS не дорівнює DS, області даних і стека розміщуються в різних фізичних сегментах). За замовчуванням приймається NEARSTACK.

Приклад програми, що «нічого не робить». 686 P. MODEL FLAT, STDCALL. DATA. CODE START: RET END START RET – команда мікропроцесора. Вона забезпечує правильне закінчення роботи програми. Решта програми належить до роботи транслятора. . 686 P – дозволені команди захищеного режиму Pentium 6 (Pentium II). Ця директива вибирає підтримуваний набір команд асемблера, вказуючи модель процесора. . MODEL FLAT, stdcall – плоска модель пам'яті. Ця модель пам'яті використовується в операційній системі Windows. stdcall - угода про виклики процедур, що використовується.

Приклад програми, що «нічого не робить». 686 P. MODEL FLAT, STDCALL. DATA. CODE START: RET END START . DATA – сегмент програми, що містить дані. Ця програмане використовує стек, тому сегмент. STACK відсутня. . CODE – сегмент програми, що містить код. START – мітка. END START - кінець програми та повідомлення компілятору, що починати виконання програми треба з мітки START. Кожна програма повинна містити директиву END, що позначає кінець вихідного кодупрограми. Усі рядки, які слідують за директивою END, ігноруються Мітка, вказана після директиви END, повідомляє транслятор ім'я головного модуля, з якого починається виконання програми. Якщо програма містить один модуль, мітку після директиви END можна не вказувати.

Транслятори мови асемблера Транслятор - програма або технічний засіб, що виконує перетворення програми, представленої однією з мов програмування, програму цільовою мовою, звану об'єктним кодом. Крім підтримки мнемонік машинних команд, кожен транслятор має власний набір директив і макрозасобів, часто ні з чим не сумісних. Основні види трансляторів мови асемблера: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - багатопрохідний асемблер, що вільно розповсюджується, написаний Томашем Гриштаром (польськ.), NASM (Netwide Assembler) - вільний 86, був створений Саймон Тетхем спільно з Юліаном Холл і в даний час розвивається невеликою командоюрозробників на Source. Forge. net.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="(!LANG:Трансляція програми в Microsoft Visual Studio 2005 1) Створити проект, обравши меню File->New->Project і"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src="https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt="(!LANG:Трансляція програми в Microsoft Visual Studio 2005 2) У дереві проекту (View->Solution Explorer) додати"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

Трансляція програми Microsoft Visual Studio 2005 3) Вибрати тип файлу Code C++, але вказати ім'я з розширенням. asm:

Трансляція програми Microsoft Visual Studio 2005 5) Встановити параметри компілятора. Вибрати правою кнопкою у файлі проекту меню Custom Build Rules…

Трансляція програми в Microsoft Visual Studio 2005 і у вікні вибрати Microsoft Macro Assembler.

Трансляція програми в Microsoft Visual Studio 2005 Перевірити правою кнопкою у файлі hello. asm дерева проекту меню Properties і встановити General->Tool: Microsoft Macro Assembler.

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="(!LANG:Трансляція програми в Microsoft Visual Studio 2005 6) Відкомпілювати файл, вибравши Build->Build hello. prj."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

Програмування в ОС Windows Програмування в OC Windows ґрунтується на використанні функцій API (Application Program Interface, тобто інтерфейс) програмної програми). Їхня кількість досягає 2000. Програма для Windows значною мірою складається з таких викликів. Вся взаємодія з зовнішніми пристроямита ресурсами операційної системи відбувається, як правило, за допомогою таких функцій. Операційна система Windowsвикористовує пласку модель пам'яті. Адреса будь-якого осередку пам'яті визначатиметься вмістом одного 32-бітного регістру. Можливі 3 типи структур програм для Windows: діалогова (основне вікно - діалогове), консольна або безвіконна структура, класична структура (віконна, каркасна).

Виклик функцій Windows API У файлі допомоги будь-яка функція API представлена ​​у вигляді тип ім'я_функції (ФА 1, ФА 2, ФА 3) Тип – тип значення, що повертається; ФАх – перелік формальних аргументів у порядку їхнього прямування Наприклад, int Message. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Ця функціявиводить на екран вікно з повідомленням та кнопкою (або кнопками) виходу. Сенс параметрів: h. Wnd - дескриптор вікна, у якому з'являтиметься вікно-повідомлення, lp. Text - текст, який з'являтиметься у вікні, lp. Caption - текст у заголовку вікна, u. Type – тип вікна, зокрема можна визначити кількість кнопок виходу.

Виклик функцій Windows API int Message. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Майже всі параметри API-функцій насправді 32-бітові цілі числа: HWND - 32 -бітне ціле, LPCTSTR - 32 -бітний покажчик на рядок, UINT - 32 -бітне ціле. До імені функцій часто додається суфікс "А" для переходу до нових версій функцій.

Виклик функцій Windows API int Message. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); При використанні MASM необхідно наприкінці імені додати @N N – кількість байт, яке займають у стеку передані аргументи. Для функцій Win 32 API це можна визначити як кількість аргументів n, помножене на 4 (байта у кожному аргументі): N=4*n. Для виклику функції використається команда CALL асемблера. При цьому всі аргументи функції передаються до неї через стек (команда PUSH). Напрямок передачі аргументів: ЗЛІВА НАПРАВО - ЗНИЗУ ВГОРУ. Першим буде поміщатися в стек аргумент u. Тип. Виклик цієї функції буде виглядати так: CALL Message. Box. [email protected]

Виклик функцій Windows API int Message. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Результат виконання будь-якої функції API - це, як правило, ціле число, яке повертається в регістрі EAX. Директива OFFSET є «зміщення в сегменті», або, переводячи в поняття мов високого рівня, «покажчик» початку рядка. Директива EQU подібно до #define у ​​мові СІ визначає константу. Директива EXTERN вказує на транслятор, що функція або ідентифікатор є зовнішнім по відношенню до даного модуля.

Приклад програми "Привіт усім!" . 686 P. MODEL FLAT, STDCALL. STACK 4096. DATA MB_OK EQU 0 STR 1 DB "Моя перша програма", 0 STR 2 DB "Привіт усім!", 0 HW DD? EXTERN Message. Box. [email protected]: NEAR. CODE START: PUSH MB_OK PUSH OFFSET 1 PUSH OFFSET 2 PUSH HW CALL Message. Box. [email protected] RET END START

Директива INVOKE Транслятор мови MASM дозволяє спростити виклик функцій з використанням макрозасобу – директиви INVOKE: INVOKE функція, параметр1, параметр2, … При цьому немає необхідності додавати @16 до виклику функції; параметри записуються точно в тому порядку, в якому наведено опис функції. макрозасобами транслятора параметри поміщаються у стек. Для використання директиви INVOKE необхідно мати опис прототипу функції з використанням директиви PROTO у вигляді: Message. Box. A PROTO: DWORD, : DWORD Якщо у програмі використовується безліч функцій Win 32 API, доцільно скористатися директивою include C: masm 32includeuser 32. inc

Тема 1.4 Асемблерна мнемоніка. Структура та формати команд. Види адресації. Система команд мікропроцесора

План:

1 Мова асемблера. Основні поняття

2 Символи мови асемблера

3 Типи операторів асемблера

4 Директиви асемблера

5 Система команд процесора

1 Язик асемблера. Основні поняття

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

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

Пропозиції асемблера бувають чотирьох типів:

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

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

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

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

­ Структура програми на асемблері. Синтаксис асемблера.

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

Малюнок 10 - Формат пропозиції асемблера


­ Малюнок 11 - Формат директив

­ Малюнок 12 - Формат команд та макрокоманд

На цих малюнках:

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

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

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

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

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

­ 2 Символи мови асемблера

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

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

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

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

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

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

Лексемамиє:

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

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

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

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

5) шістнадцяткові числа мають більше умовностей при своєму записі:

По-перше, вони складаються з цифр 0...9 , малих та великих літерлатинського алфавіту a,b, c,d,e,fабо A,B,C,D,E,F.

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

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

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

­ постійні чи безпосередні операнди;

­ адресні операнди;

­ операнди, що переміщуються;

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

­ регістровий операнд;

­ базовий та індексний операнди;

­ структурні операнди;

запису.

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

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

­ 3 Типи операторів асемблера

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

­ арифметичні оператори;

­ оператори зсуву;

­ оператори порівняння;

­ логічні оператори;

­ індексний оператор;

­ оператор перевизначення типу;

­ оператор перевизначення сегмента;

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

­ оператор отримання сегментної складової адреси виразу;

­ оператор отримання усунення виразу.

1 Директиви асемблера

­ Директиви асемблера бувають:

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

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

­ з одним сегментом коду;

­ з одним сегментом стеку;

­ з одним сегментом даних;

­ із трьома додатковими сегментами даних.

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


­ Рисунок 13 - Синтаксичне опис сегмента на асемблері

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

2) Директиви управління лістингом. Директиви управління лістингом поділяються на такі групи:

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

­ директиви виведення в лістинг файлів, що включаються;

­ директиви виведення блоків умовного асемблювання;

­ директиви виведення у лістинг макрокоманд;

­ директиви виведення в лістинг інформації про перехресні посилання;

­ директиви зміни формату лістингу

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

Система команд процесора представлена ​​малюнку 14.

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

­ Рисунок 14 - Класифікація команд асемблера

Команди бувають:

1 Команди пересилання даних. Ці команди займають дуже важливе місце у системі команд будь-якого процесора. Вони виконують такі найважливіші функції:

­ збереження у пам'яті вмісту внутрішніх регістрів процесора;

­ копіювання вмісту з однієї області пам'яті до іншої;

­ запис у пристрої вводу/виводу та читання з пристроїв введення/виводу.

У деяких процесорах ці функції виконуються однією єдиною командою MOV (для байтових пересилань - MOVB ) але з різними методамиадресації операндів.

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

2 Арифметичні команди. Арифметичні команди розглядають коди операнда як числові двійкові або двійково-десяткові коди. Ці команди можуть бути поділені на п'ять основних груп:

­ команди операцій з фіксованою комою (додавання, віднімання, множення, розподіл);

­ команди операцій з плаваючою комою (додавання, віднімання, множення, розподіл);

­ команди очищення;

­ команди інкременту та декременту;

­ команда порівняння.

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

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

5 Команди інкременту (збільшення на одиницю) та декременту

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

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

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

­ логічне І, логічне АБО, додавання за модулем 2 (Виключає АБО);

­ логічні, арифметичні та циклічні зрушення;

­ перевірка бітів та операндів;

­ установка та очищення бітів (прапорів) регістру стану процесора ( PSW).

Команди логічних операцій дозволяють бітно обчислювати основні логічні функції від двох вхідних операндів. Крім того, операція І використовується для примусового очищення заданих бітів (як один з операндів при цьому використовується код маски, в якому розряди, що вимагають очищення, встановлені в нуль). Операція АБО застосовується для примусової установки заданих бітів (як один з операндів при цьому використовується код маски, в якому розряди, що вимагають установки в одиницю, дорівнюють одиниці). Операція «Виключає АБО» використовується для інверсії заданих бітів (як один з операндів при цьому застосовується код маски, в якому біти, що підлягають інверсії, встановлені в одиницю). Команди вимагають двох вхідних операндів та формують один вихідний операнд.

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

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

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

­ команди безумовних переходів;

­ команди умовних переходів

В позначках цих команд використовуються слова Branch (розгалуження) та Jump (стрибок).

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

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

­ перехід, якщо дорівнює нулю;

­ перехід, якщо не дорівнює нулю;

­ перехід, якщо є переповнення;

­ перехід, якщо немає переповнення;

­ перехід, якщо більше за нуль;

­ перехід, якщо менше або дорівнює нулю.

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

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

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

Висновок:

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

Допустимими символами при написанні тексту програм є всі латинські літери: A-Z,a-z. При цьому великі та малі літери вважаються еквівалентними; цифри від 0 до 9 ; знаки ? , @ , $ , _ , & ; роздільники , . () < > { } + / * % ! " " ? = # ^ .

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

Система команд поділена на 8 основних груп.

­ Контрольні питання:

1 Що є мовою асемблера?

2 Які символи можна використовувати для запису команд на асемблері?

3 Що являють собою мітки та їх призначення?

4 Поясніть структуру команд асемблера.

5 Перерахувати 4 типи пропозицій асемблера.