Мова асемблера команди. Загальна характеристика системи команд мови Assembler для IBM-PC (базовий набір команд, основні способи адресації операндів). Структура програми мовою Assembler. З дисципліни «Системне програмування»

Команди мови Ассемблер (Лекція)

ПЛАН ЛЕКЦІЇ

1. Основні групи операцій.

Pentium.

1. Основні групи операцій

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

Операціїпересилання,

Арифметичні операції,

Логічні операції,

Операції зсуву,

Операції порівняння тестування,

Бітові операції,

Операції управління програмою;

Операції управління процесором.

2. Мнемокоди команд процесора Pentium

При описі команд зазвичай використовуються їх мнемонічні позначення (мнемокоди), які служать завдання команди при програмуванні мовою Асемблера. Для різних версійАссемблера мнемокоды деяких команд можуть відрізнятися. Наприклад, для команди виклику підпрограми використовується мнемокодCALL або JSR (“ Jump to SubRoutine”). Проте мнемокоды більшості команд основних типів мікропроцесорів збігаються чи відрізняються незначно, оскільки є скороченнями відповідних англійських слів, визначальних виконувану операцію. Розглянемо мнемокоди команд, прийняті для процесорів Pentium.

Команди пересилання. Основною командою цієї групи є командаMOV яка забезпечує пересилання даних між двома регістрами або між регістром і осередком пам'яті. У деяких мікропроцесорах реалізується пересилання між двома осередками пам'яті, а також групове пересилання вмісту кількох регістров з пам'яті. Наприклад, мікропроцесори сімейства 68 xxx компанії Motorola виконують командуMOVE , що забезпечує пересилання з одного осередку пам'яті до іншого, і командуMOVEM , яка здійснює запис у пам'ять або завантаження з пам'яті вмісту заданого набору регістрів (до 16 регістрів). КомандаXCHG виробляє взаємний обмін вмістом двох регістрів процесора або регістру та комірки пам'яті.

Команди введення IN та висновку OUT реалізують пересилання даних з регістру процесора у зовнішній пристрій або прийом даних із зовнішнього пристрою регістр. У цих командах визначається номер інтерфейсного пристрою (порту вводу-виводу), через яке проводиться передача даних. Зазначимо, що багато мікропроцесорів не мають спеціальних команд для звернення до зовнішніх пристроїв. В цьому випадку введення та виведення даних у системі виконується за допомогою командиMOV , де задається адреса необхідного інтерфейсного пристрою. Таким чином, зовнішній пристрій адресується як осередок пам'яті, а в адресному просторі виділяється певний розділ, в якому розташовуються адреси підключених до системи інтерфейсних пристроїв (портів).

Команди арифметичних операцій. Основними в цій групі є команди додавання, віднімання, множення і поділу, які мають ряд варіантів. Команди складання ADD та віднімання SUB виконують відповідні операції зcодержимих двох регістрів, регістру та осередку пам'яті або з використанням безпосереднього операнда. Команди AD C , SB B виробляють додавання та віднімання з урахуванням значення ознакиC, що встановлюється при формуванні перенесення у процесі виконання попередньої операції З допомогою цих команд реалізується послідовне додавання операндів, число розрядів яких перевищує розрядність процесора. Команда NEG змінює знак операнда, переводячи його на додатковий код.

Операції множення та поділу можуть виконуватися над числами зі знаком (командиI MUL, I DIV ) або беззнака (команди MUL, DIV ). Один з операцій завжди розміщується в регістрі, другий може перебувати в регістрі, осередку пам'яті або бути безпосереднім операндом. Результат операції розміщується у регістрі. При множенні (командиMUL , IMUL ) Виходить результат подвоєної розрядності, для розміщення якого використовується два регістри. При розподілі (командиDIV , IDIV ) як ділимого використовується операнд подвоєної розрядності, що розміщується у двох регістрах, а як результат у два регістри записується приватне та залишок.

Команди логічних операцій . Практично всі мікропроцесори виробляють логічні операції І , АБО, що виключає АБО, які виконуються над однойменними розрядами операндів за допомогою команд AND, OR, X OR . Операції виконуються над вмістом двох регістрів, регістру та осередку пам'яті або з використанням безпосереднього операнда. Команда NOT інвертує значення кожного розряду операнда.

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

Команди порівняння та тестування . Порівняння операндів зазвичай проводиться за допомогою командиCMP , яка виробляє віднімання операндів із встановленням значень ознак N, Z, V, Cу регістрі стану відповідно до отриманого результату. При цьому результат віднімання не зберігається і значення операндів не змінюються. Подальший аналіз отриманих значень ознак дозволяє визначити відносне значення (>,<, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

Деякі мікропроцесори виконують команду тестування TST яка є однооперандним варіантом команди порівняння. При виконанні цієї команди встановлюються ознаки N, Zвідповідно до знака і значення (рівно або не дорівнює нулю) адресованого операнда.

Команди бітових операцій . Ці команди роблять установку значення ознакиCу регістрі станів відповідно до значення тестованого бітаbn в адресованому операнді. У деяких мікропроцесорах за результатом тестування біта проводиться установка ознакиZ. Номер тестованого бітаnвизначається або вмістом зазначеного в команді регістру, або безпосереднім операндом.

Команди цієї групи реалізують різні варіанти зміни тестованого біта. BT зберігає значення цього біта незмінним. B T S післятестування встановлює значення bn=1, а команда B T C - значення bn=0.Команда B T C інвертує значення біта bn після тестування.

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

- команди безумовної передачі керування;

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

- команди організації програмних циклів;

- команди переривання;

- команди зміни ознак.

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

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

Команди управління ознаками забезпечують запис - читання вмісту регістру стану, у якому зберігаються ознаки, і навіть зміна значень окремих ознак. Наприклад, у процесорах Pentium реалізуються команди LAHF і SAHF , які виконують завантаження молодшого байта, де містяться ознаки, з регістру стану EFLAGу молодший байт регістру EAXта заповнення молодшого байта EFLAGSз регістру E AX.. Команди CLC, STCздійснюють встановлення значень ознаки перенесення CF=0, CF=1, а команда CMCвикликає інвертування значення цієї ознаки.Так як ознаки визначають хід виконання програми при умовних переходах, команди зміни ознак зазвичай використовуються для управління програмою.

Команди управління процесором . До цієї групи належать команди зупинки, відсутності операції та ряд команд, що визначають режим роботи процесора або його окремих блоків. КомандаHLT припиняє виконання програми та переводить процесор у стан зупинки, вихід з якого відбувається при надходженні сигналів переривання або перезапуску ( Reset). Команда NOP ("порожня" команда), яка не викликає виконання будь-яких операцій, служить для реалізації програмних затримок або заповнення перепусток, що утворилися в програмі.

Спеціальні команди CLI, STI забороняють та дозволяють обслуговування запитів переривання. У процесорах Pentium для цього використовується біт управління (прапор)IFу регістрі EFLAGS.

Багато сучасних мікропроцесорів виконують команду ідентифікації, яка дозволяє користувачеві або іншим пристроям отримати інформацію про тип процесора, який використовується в даній системі. У процесорах Pentuimдля цього служить команда CPUID , при виконанні якої необхідні дані про процесор надходять до регістру EAX,EBX ,ECX,EDXі потім можуть зчитуватися користувачем або операційною системою.

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

Деякі процесори роблять арифметичні операції з двійково-десятковими числами або виконують спеціальні команди корекції результату при обробці таких чисел. До складу багатьох високопродуктивних процесорів входить FPU - блок обробки чисел c "плаваючою точкою".

У ряді сучасних процесорів реалізовано групову обробку кількох цілих чисел чи чисел c "плаваючою точкою" за допомогою однієї команди за принципом SIMD (“Single Instruction – Multiple Data ”) - «Одна команда – Безліч даних». Одночасне виконання операцій над кількома операндами суттєво підвищує продуктивність процесора під час роботи з відео- та аудіоданими. Такі операції широко використовуються для обробки зображень, звукових сигналів та інших програм. Для виконання цих операцій до складу процесорів введені спеціальні блоки, що реалізують відповідні набори команд, які у різних типах процесорів ( Pentium Athlon) отримали назвуMMX (“ Milti- Media Extension ”) – Мультимедійне Розширення,SSE(“ Streaming SIMD Extension ”) – Потокове SIMD - Розширення, “3 DExtension- Тривимірне розширення.

Характерною особливістю процесорів компанії Intel , починаючи з моделі 80286, є пріоритетний контроль при зверненні до пам'яті, який забезпечується під час роботи процесора як захищених віртуальних адрес – – “ Protected Mode ” (захищений режим). Для реалізації цього режиму використовують спеціальні групи команд, які служать для організації захисту пам'яті відповідно до прийнятого алгоритму пріоритетного звернення.

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

Структура команди мовою асемблера Команда асемблера вказує транслятору, яку дію має виконувати мікропроцесор. Директиви асемблера - параметри, задані у тексті програми, що впливають процес асемблирования чи властивості вихідного файла. Операнд визначає початкове значення даних (у сегменті даних) або елементи, над якими виконується дія за командою (сегмент коду). Команда може мати один або два операнди, або не мати операндів. Число операндів неявно задається кодом команди. Якщо команду або директиву необхідно продовжити на наступному рядку, використовується символ «зворотний сліш»: «» . За замовчуванням Ассемблер не розрізняє великі та малі літери у написанні команд і директив. Приклади директиви та команди 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, 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% програми відповідає за 50% часу виконання, а 10% програми відповідає за 90% часу виконання. Тому для написання конкретної програми в реальних умовах використовується як асемблер, так і одна з мов високого рівня.

Формат оператора у мові асемблера.

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

Полі етикетці.

Для поля мітки відводиться колонка 1. Мітка є символічним ім'ям, або ідентифікатором, адресипам'яті. Вона потрібна для того, щоб можна було:

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

● отримати доступ до місця, де зберігаються дані.

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

У деяких версіях мови асемблера двокрапки ставляться лише після міток команд, але не після міток даних, а довжина мітки може бути обмежена 6 або 8 символами.

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

Поле код операції.

Це поле містить мнемокод команди або псевдо-команди (див. нижче). Мнемокод команд вибирається розробниками мови. У мові асемблера

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

), а збереження вмісту регістру у пам'яті - мнемоника

). У мовах асемблера

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

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

Мнемоніка регістрів також залежить від версії асемблера (табл. 5.2.1).

Поле операнди.

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

● числові дані,

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

Відповідно двійкова, вісімкова, шістнадцяткова, десяткова системи числення (

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

То попереду додається незначний 0 (нуль);

● коди внутрішніх регістрів мікропроцесора та комірки пам'яті

М (джерел або приймачів інформації) у вигляді букв А, В, С,

М або їх адреси в будь-якій системі числення (наприклад, 10В - адреса регістру

у двійковій системі);

● ідентифікатори,

для реєстрових пар ЗС,

Перші літери,

Н; для пари акумулятора та регістру ознак -

; для лічильника команд -

;для покажчика стека -

● мітки, що вказують адреси операндів або наступних команд до умовних

(при виконанні умови) та безумовних переходах.Наприклад, операнд М1 у команді

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

● вирази,

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

Визначити слово), а згодом запровадили альтернативний варіант.

який із самого початку був у мові для процесорів

У версії мови

використовується

Визначити константу).

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

II регістри різної довжини мають різні назви: ЕАХ - для розміщення 32-бітних операндів (тип

); АХ - для 16-бітних (тип

та АН - для 8-бітних (тип

● для процесорів

до кожного коду операції додаються суфікси: суфікс

Для типу

; суфікс «.В» для типу

для операндів різної довжини використовуються різні коди операцій, наприклад, для завантаження байта, напівслова (

) і слова в 64-бітний реєстр використовуються коди операцій

відповідно.

Поле коментарів.

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

● точка з комою (;) у мовах для процесорів фірми

знак оклику(!) у мовах для

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

Псевдокоманди (директиви).

У мові асемблера можна назвати два основних види команд:

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

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

для сімейства

.

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

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

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

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

Макрос, або макрокоманда, характеризується трьома аспектами: макровизначенням, макрозверненням та макророзширенням.

Макровизначення

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

Макровизначення має таку структуру:

Список виразів; Макровизначення

У наведеній структурі макровизначення можна виділити три частини:

● заголовок

макросу, що включає в себе ім'я

Псевдокоманду

та набір параметрів;

● позначене точками тіломакросу;

● команда

закінчення

макровизначення.

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

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

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

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

) макросу асемблер замінює його тілом макросу.

Використання імені макросу як код операції називається макро-зверненням(макровизовом), яке заміщення тілом макросу - макророзширенням.

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

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

Процес асемблювання здійснюється у два проходи:

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

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

Макроси з параметрами.

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

● з фактичнимипараметрами, що містяться в полі операндів макрозвернення;

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

використання макросів із параметрами.

У програмі 1 наведено дві схожі послідовності команд, що відрізняються тим, що перша з них міняє місцями Р і

А друга

У програмі 2 включений макрос із двома формальними параметрами Р1 та Р2. Під час розширення макросу кожен символ Р1 всередині тіла макросу заміщається першим фактичним параметром (Р,

), а символ Р2 заміщається другим фактичним параметром (

) з програми № 1. У макровизові

програми 2 позначено: Р,

Перший фактичний параметр

Другий фактичний параметр.

Програма 1

Програма 2

MOV EBX, Q MOV EAX, Pl

MOV Q, EAX MOV EBX, P2

MOV P, EBX MOV P2, EAX

Розширені можливості.

Розглянемо деякі розширені можливості мови

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

мітка оголошується локальною (

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

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

IF WORDSIZE GT 16 M2 MACRO

Макрос М2 може бути визначений в обох частинах оператора

Проте визначення залежить від цього, якому процесорі асемблируется програма: на 16–битном чи 32–битном. Якщо М1 не викликається, то макрос М2 взагалі не буде визначено.

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

Про використання макрозасобів в асемблері.

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

Збереження макровизначень.

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

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

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

● список формальнихпараметрів.

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

Внутрішнє уявлення макросу

із наведеного вище прикладу для програми 2 (стор. 244) має вигляд:

MOV EAX, MOV EBX, MOV MOV &

де в якості символу повернення каретки використовується крапка з комою, а в якості символу формального параметра - амперсант &.

Розширення макровикликів.

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

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

Двопрохідний асемблер.

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

● транслювати його машинною мовою;

● перенести отриманий машинний код у файл, а відповідну частину листівки - в інший файл;

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

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

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

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

Перший прохід.

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

;Значення - розмір буфера

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

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

Таблиця символьних імен

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

● довжину поля даних, пов'язаного із символом;

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

● відомості про те, чи можна отримати доступ до символу ззовні процедури.

Символьні імена є мітками. Вони можуть бути задані за допомогою операторів (наприклад,

Таблиця директив.

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

Таблиця кодів операцій.

Для кожного коду операції в таблиці передбачені окремі графи: позначення коду операції, операнд 1, операнд 2, 16-річне значення коду операції, довжина команди та тип команди (табл. 5.2.5). Коди операцій діляться на групи залежно від кількості та виду операндів. Тип команди визначає номер групи і визначає процедуру, яка викликається для обробки всіх команд даної групи.

Другий прохід.

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

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

Вихідна програма може містити помилки, наприклад:

наведений символ не визначено або визначено більше одного разу;

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

● відсутній оператор

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

Статті присвяченої мові асемблер.

Тема 2.5 Основи програмування процесора

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

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

Мова асемблер- це мова, в якій кожне висловлювання відповідає рівно одній машинній команді.

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

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

1. Це взаємно однозначна відповідність між висловлюваннями мови асемблера та машинними командами.

2. Програміст мовою асемблера має доступ всім об'єктам і командам, присутнім на цільової машині.

Уявлення про основи програмування машинно-орієнтованими мовами корисно для:



Кращого розуміння архітектури ПК та грамотнішого використання комп'ютерів;

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

Можливості перегляду та коригування виконуваних програм з розширенням.exe і.com, компільованих з будь-яких мов високого рівня, у разі втрати вихідних програм (викликавши вказані програми в налагоджувач програми DEBUG та декомпілювавши їх відображення мовою асемблера);

Складання програм вирішення найбільш відповідальних завдань (програма, складена машинно-орієнтованою мовою, зазвичай ефективніше – коротше і швидше відсотків на 30-60 програм, отриманих в результаті трансляції з мов високого рівня)

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

Програма мовою асемблера може працювати тільки ЕОМ одного сімейства, а програма, написана мовою високого рівня, потенційно може працювати різних машинах.

Алфавіту мови асемблера складають символи ASCII.

Числа лише цілі. Розрізняють:

Двійкові числа, що закінчуються буквою В;

Десяткові числа, що закінчуються буквою D;

Шістнадцяткові числа, що закінчуються літерою Н.

Оперативна пам'ять, регістри, подання даних

Для певної серії МП використається індивідуальна мова складання програм – мова асемблер.

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

Програмна модель мікропроцесорної системи на основі МП КР580ВМ80

Програмна модель МПС відповідно до рисунка 1

МП Порти Пам'ять

S Z AC P C

Малюнок 1

З погляду програміста МП КР580ВМ80 має такі програмно-доступні регістри.

А– 8-бітовий регістр акумулятора. Є основним регістром МП. Будь-яка операція, що виконується в АЛУ, передбачає розміщення одного з операндів, що підлягають обробці в акумуляторі. Результат операції в АЛУ також зазвичай зберігається в А.

B, C, D, E, H, L- 8-бітові регістри загального призначення (РН). Внутрішня пам'ятьМП. Призначені для зберігання інформації, що обробляється, а також результатів операції. При обробці 16-розрядних слів з регістрів утворюють пари BC, DE, HL, причому здвоєний регістр називається першою літерою – B, D, H. У регістровій парі старшим є перший регістр. Особливу властивість мають регістри H, L, які використовуються як для зберігання даних, так і для зберігання 16-розрядних адрес осередків ОЗУ.

FL– регістр прапорів (регістр ознак) 8-бітовий регістр, у якому зберігаються п'ять ознак результату виконання арифметичних та логічних операцій у МП. Формат FL відповідно до малюнку

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

Розряд Р (parity) – парність, встановлюється 1, якщо число одиниць у розрядах результату парно.

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

Розряд Z (нуль) – встановлюється 1, якщо результат операції дорівнює 0.

Розряд S (знак) – встановлюється 1, якщо результат негативний, і 0, якщо результат позитивний.

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

РС– програмний лічильник (лічильник команд), 16-розрядний регістр, призначений для зберігання адреси наступної команди. Вміст лічильника команд автоматично збільшується на 1 відразу після вибірки чергового байта команди.

У початковій області пам'яті адреси 0000Н – 07FF розташовується керуюча програмата демонстраційні програми. Це область ПЗП.

0800 – 0АFF – область адрес для запису досліджуваних програм. (ОЗП).

0В00 – 0ВВ0 – область адрес для запису даних. (ОЗП).

0ВВ0 - початкова адреса стека. (ОЗП).

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

Формат даних та структура команд мови асемблер

Пам'ять МП КР580ВМ80 є масив 8-ьитных слів, званих байтами, Кожен байт має власний 16-разрядный адресу, визначальний його становище у послідовності осередків пам'яті. МП може адресувати 65536 байт пам'яті, яка може містити як ПЗУ, так і в ОЗУ.

Формат даних

Дані зберігаються у пам'яті у вигляді 8-бітних слів:

D7 D6 D5 D4 D3 D2 D1 D0

Молодшим бітом є біт 0 старшим - біт 7.

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

Формат команд

Команди МП КР580ВМ80 мають один, двох або трибайтний формат. Багатобайтні команди мають бути розміщені у сусідніх ЯП. Формат команди залежить від особливостей операції, що виконується.

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

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

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

Формат однобайтової команди відповідно до рисунка 2

Малюнок 4

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

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


Методи адресації

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

Для МП КР580ВМ80 є такі методи адресації:

Безпосередня;

Реєстрова;

Непряма;

Стекове.

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

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

Реєстрова адресація передбачає, що операнд (вхідний чи вихідний) перебуває у внутрішньому регістрі МП. Використовується в однобайтових командах

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

Стьова адресація передбачає, що команда містить адресу. Адресація до осередків пам'яті за вмістом 16-розрядного регістру SP (покажчика стека).

Система команд

Система команд МП – це повний перелік елементарних процесів, які здатний виробляти МП. Керований цими командами МП виконує прості дії, такі як елементарні арифметичні та логічні операції, пересилання даних, порівняння двох величин та ін. Число команд МП КР580ВМ80 - 78 (з урахуванням модифікацій 244).

Розрізняють такі групи команд:

Передача даних;

Арифметичні;

Логічні;

Команди переходу;

Команди введення-виводу, управління та роботи зі стеком.


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

Символ Скорочення
ADDR 16-бітова адреса
DATA 8-бітові дані
DATA 16 16-бітові дані
PORT 8-бітова адреса УВВ (пристрої введення-виводу)
BYTE 2 Другий байт команди
BYTE 3 Третій байт команди
R, R1, R2 Один із регістрів: A, B, C, D, E, H, L
RP Одна з реєстрових пар: - задає пару ВС; D - задає пару DE; H – задає пару HL
RH Перший регістр пари
RL Другий регістр пари
Λ Логічне множення
V Логічне складання
Додавання за модулем два
М Осередок пам'яті, адреса якої задає вміст регістрової пари HL, тобто М = (HL)

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

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

  • операційної - визначальною, "що робити";
  • операндної - визначальною об'єкти обробки, "з чим робити".

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

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

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

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

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

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

Приклади рядків коду:

Count db 1 ;Ім'я, директива, один операнд
mov eax,0 ;Команда, два операнди
cbw; Команда

Мітки

Мітка у мові асемблера може містити такі символи:

  • усі літери латинського алфавіту;
  • цифри від 0 до 9;
  • спецсимволи: _, @, $, ?.

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

Першим символом у мітці має бути буква або спецсимвол (але не цифра). Максимальна довжина позначки – 31 символ. Усі мітки, які записуються в рядку, що не містить директиви асемблера, повинні закінчуватися двокрапкою: .

Команди

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

Директиви

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

Операнди

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

  • Немає операндів ret ;Повернутись
  • Один операнд inc ecx; Збільшити ecx
  • Два операнди add eax,12 ;Додати 12 до eax

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

Як операнди можуть виступати

  • ідентифікатори;
  • ланцюжки символів, укладених у одинарні чи подвійні лапки;
  • цілі числа у двійковій, вісімковій, десятковій або шістнадцятковій системі числення.
Ідентифікатори

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

Правила запису ідентифікаторів.

  • Ідентифікатор може складатися з одного або кількох символів.
  • Як символи можна використовувати літери латинського алфавіту, цифри та деякі спеціальні знаки: _, ?, $, @.
  • Ідентифікатор не може стати символом цифри.
  • Довжина ідентифікатора може бути 255 символів.
  • Транслятор приймає перші 32 знаки ідентифікатора, а інші ігнорує.
Коментарі

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

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

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

Приклад «що нічого не робить» програми мовою асемблера:

686P
.MODEL FLAT, STDCALL
.DATA
.CODE
START:

RET
END START

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