Табличні команди мовою асемблера. План: Передмова. Мова асемблера та структура команд. Структура exe-файлу (семантичний розбір). Структури в мові асемблер

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

ПЛАН ЛЕКЦІЇ

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 ” (захищений режим). Для реалізації цього режиму використовують спеціальні групи команд, які служать для організації захисту пам'яті відповідно до прийнятого алгоритму пріоритетного звернення.

Тема 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)

1. Архітектура ПК……………………………………………………………5

    1.1. Реєстри.

    1.1.1 Регістри загального призначення.

1.1.2. Сегментні регістри

1.1.3 Реєстр прапорів

1.2. Організація пам'яті.

1.3. Подання даних.

1.3.1 Типи даних

1.3.2 Подання символів та рядків

2. Оператори програми на асемблері ……………………………………

    1. Команди мови асемблера

2.2. Режими адресації та формати машинних команд

3. Псевдооператори ………………………………………………………….

3.1 Директиви визначення даних

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

3.2.1 Програмні сегменти. Директива assume

3.2.3 Спрощена директива сегментації

4. Асемблювання та компонування програми ………………………….

5. Команди пересилання данных…………………………………………….

    5.1 Команди загального призначення

    5.2 Команди роботи зі стеком

5.3 Команди введення-виведення

5.4 Команди пересилання адреси

5.5 Команди пересилання прапорів

6. Арифметичні команди ……………………………………………….

    6.1 Арифметичні операції над цілими двійковими числами

6.1.1 Додавання та віднімання

6.1.2 Команди збільшення та зменшення приймача на одиницю

6.2 Множення та розподіл

6.3 Зміна знака

7. Логічні операції ………………………………………………….

8. Зрушення та циклічні зрушення …………………………………………

9. Строкові операції …………………………………………………….

10. Логіка та організація програм ………………………………………

10.1 Безумовні переходи

10.2 Умовні переходи

10.4 Процедури в мові асемблера

10.5 Переривання INT

10.6 Системне програмне забезпечення

10.6.1.1 Читання клавіатури.

10.6.1.2 Виведення символів на екран

10.6.1.3 Завершення програм.

10.6.2.1 Вибір режимів дисплея

11. Дискова пам'ять ……………………………………………………………..

11.2 Таблиця розподілу файлів

11.3 Операції введення-виведення на диск

11.3.1 Записування файлу на диск

11.3.1.1 Дані у форматі ASCIIZ

11.3.1.2 Файловий номер

11.3.1.3 Створення дискового файлу

11.3.2 Читання дискового файлу

Вступ

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

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

Елементом підготовки програміста-професіонала обов'язково вивчення асемблера. Це пов'язано з тим, що програмування на асемблері вимагає знання архітектури ПК, що дозволяє створювати ефективніші програми іншими мовами та поєднувати їх з програмами на асемблері.

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

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

    Архітектура ПК.

Архітектура ЕОМ - це абстрактне уявлення ЕОМ, яке відображає її структурну, схемотехнічну та логічну організацію.

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

Поняття архітектури ЕОМ включає у собі:

    структурну схемуЕОМ;

    засоби та способи доступу до елементів структурної схеми ЕОМ;

    набір та доступність регістрів;

    організацію та способи адресації;

    спосіб подання та формат даних ЕОМ;

    набір машинних команд ЕОМ;

    формати машинних команд;

    обробка переривань.

Основні елементи апаратних засобів комп'ютера: системний блок, клавіатура, пристрої відображення, дисководи, пристрої друку (принтер) і різні засоби зв'язку. Системний блок складається з системної плати, блока живлення та осередків розширення для додаткових плат. На системній платі розміщені мікропроцесор, постійна пам'ять (ROM), оперативна пам'ять(RAM) та співпроцесор.

      Реєстри.

Усередині мікропроцесора інформація міститься у групі з 32 регістрів (16 користувацьких, 16 системних), тією чи іншою мірою доступних для використання програмістом. Оскільки посібник присвячено програмуванню для мікропроцесора 8088-i486, то логічніше почати цю тему з обговорення внутрішніх регістрів мікропроцесора, доступних для користувача.

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

    вісім 32-бітових регістрів (реєстри загального призначення) EAX/AX/AH/AL, EBX/BX/BH/BL, ECX/CX/CH/CL, EDX/DX/DLH/DL, EBP/BP, ESI/SI, EDI/DI, ESP/SP;

    шість 16 -, бітових регістрів сегментів: CS, DS, SS, ES, FS, GS;

    регістри стану та управління: регістр прапорів EFLAGS/FLAGS, та регістр покажчика команди EIP/IP.

Через похилу межу наведено частини одного 32-розрядного регістру. Приставка E (Extended) означає використання 32-розрядного регістру. Для роботи з байтами використовуються регістри з приставками L(low) і H(high), наприклад, AL,CH - 16-розрядних частин регістрів, що позначають молодший і старший байти.

        Регістри загального призначення.

EAX/AX/AH/AL(Accumulator register) – акумулятор. Використовуються при множенні та розподілі, в операціях введення-виведення та в деяких операціях над рядками.

EBX/BX/BH/BL – базовий регістр(Base register), часто використовується при адресації даних у пам'яті.

ECX/CX/CH/CL – лічильник(count register), використовується як лічильник числа повторень циклу.

EDX/DX/DH/DL – регістр даних(Data register), використовується для зберігання проміжних даних. У деяких командах використання його обов'язкове.

Усі регістри цієї групи дозволяють звертатися до своїх «молодших» частин. Використання для самостійної адресації можна лише молодші 16- та 8-бітові частини цих регістрів. Старші 16 біт цих регістрів як самостійні об'єкти недоступні.

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

ESI/SI (source index register) - індекс джерела. Містить адресу поточного джерела.

EDI/DI (distination index register) - індекс приймача(одержувача). Містить поточну адресу в рядку приймача.

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

ESP/SP (stack poINTer register) - регістр покажчика стека. Містить вказівник вершини стека у поточному сегменті стека.

EBP/BP (base poINTer register) - регістр покажчика бази стека. Призначений для організації довільного доступу до даних усередині стека.

1.1.2. Сегментні регістри

У програмній моделі мікропроцесора є шість сегментних регістрів: CS, SS, DS, ES, GS, FS. Їх існування обумовлено специфікою організації та використання оперативної пам'яті мікропроцесорами Intel. Мікропроцесор апаратно підтримує структурну організацію програми, що складається з сегментів.Для вказівки сегментів, доступних в даний момент, призначені сегментні регістри. Мікропроцесор підтримує такі типи сегментів:

    Сегмент коду.Містить команди програми Для доступу до цього сегменту служить регістр CS (code segment register) – сегментний регістр коду. Він містить адресу сегмента з машинними командами, якого має доступ мікропроцесор.

    Сегмент даних.Містить дані, що обробляються програмою. Для доступу до цього сегменту є регістр DS (data segment register) – сегментний регістр данихщо зберігає адресу сегмента даних поточної програми.

    Сегмент стеку.Цей сегмент є область пам'яті, звану стеком. Мікропроцесор організує стек за принципом - перший "прийшов", перший "пішов". Для доступу до стека служить регістр SS (stack segment register) - сегментний регістр стекамістить адресу сегмента стека.

    Додатковий сегмент даних.Оброблювані дані можуть бути ще трьох додаткових сегментах даних. За умовчанням передбачається, що дані перебувають у сегменті даних. При використанні додаткових сегментів даних, їх адреси потрібно вказати явно за допомогою спеціальних префіксів перевизначення сегментів у команді. Адреси додаткових сегментів даних повинні міститися в регістрах ES, GS, FS (extenSIon data segment registers).

        Регістри управління та стану

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

Реєстр покажчика команд EIP/IP;

    регістр прапорів EFLAGS/FLAGS.

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

EIP/IP (instruction poINTer register) – покажчик команд. Регістр EIP/IP має розрядність 32 або 16 біт і містить зміщення наступної команди щодо вмісту сегментного регістру CS в поточному сегменті команд. Цей регістр безпосередньо недоступний, але його зміна проводиться командами переходу.

EFLAGS/FLAGS (Flag register) – регістр прапори. Розрядність 32/16 біт. Окремі біти даного регістру мають певне функціональне призначення та називаються прапорами. Прапор - це біт, що приймає значення 1 ("прапор встановлений"), якщо виконано деяку умову, і значення 0 ("прапор скинутий") інакше. Молодша частина цього регістру повністю аналогічна регістру FLAGS для i8086.

1.1.3 Реєстр прапорів

Регістр прапорів є 32-розрядним, має ім'я EFLAGS (рис.1). Окремі біти регістру мають певне функціональне призначення та називаються прапорами. Кожному з них надано певне ім'я (ZF, CF тощо). Молодші 16 біт EFLAGS представляють 16-розрядний регістр прапорів FLAGS, що використовується під час виконання програм, написаних для мікропроцесора i086 та i286.

Рис.1 Реєстр прапорів

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

Прапори умов:

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

OF (overflow flag) - прапор переповнення. Встановлюється в 1, якщо при додаванні або відніманні цілих чисел зі знаком вийшов результат, по модулю перевищує допустиму величину (відбулося переповнення мантиси і вона "залізла" в знаковий розряд).

ZF (zero flag) - прапор нуля. Встановлюється в 1, якщо результат команди дорівнював 0.

SF (SIgn flag) - прапор знаку. Встановлюється в 1, якщо операції над знаковими числами вийшов негативний результат.

PF (parity flag) - прапор парності. дорівнює 1, якщо результат чергової команди містить парну кількість двійкових одиниць. Враховується зазвичай лише за операціях вводу-вывода.

AF (auxiliary carry flag) - прапор додаткового перенесення. Фіксує особливості виконання операцій над двійково-десятковими числами.

Прапори станів:

DF (direction flag) - прапор напряму. Встановлює напрямок перегляду рядків у рядкових командах: при DF=0 рядки проглядаються "наперед" (від початку до кінця), при DF=1 - у зворотному напрямку.

IOPL (input/output privilege level) - рівень привілеїв введення-виведення.Використовується в захищеному режимі роботи мікропроцесора, контролю доступу до команд вводу-вывода, залежно від привілейованості завдання.

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

Системний прапор:

IF (INTerrupt flag) - прапор переривань. При IF=0 процесор перестає реагувати на переривання, що надходять до нього, при IF=1 блокування переривань знімається.

TF (trap flag) - прапор трасування. При TF=1 після виконання кожної команди процесор робить переривання (з номером 1), чим можна скористатися при налагодженні програми її трасування.

RF (resume flag) - прапор відновлення. Використовується для обробки переривань від регістрів налагодження.

VM (virtuAL 8086 mode) - прапор віртуальний 8086. 1-процесор працює у режимі віртуального 8086. 0-процесор працює у реальному чи захищеному режимі.

AC (ALignment check) - прапор контролю вирівнювання.Призначений для дозволу контролю вирівнювання під час звернення до пам'яті.

      Організація пам'яті.

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

Мікропроцесор апаратно підтримує кілька моделей використання оперативної пам'яті:

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

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

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

    Режим реальних адрес (реальний режим).Режим аналогічний до роботи i8086 процесора. Необхідний функціонування програм, розроблених для ранніх моделей процесорів.

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

    Режим віртуального 8086.У цьому режимі з'являється можливість роботи кількох програм i8086. У цьому можлива робота програм реального режиму.

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

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

Формування фізичної адреси у реальному режимі

У реальному режимі діапазон зміни фізичної адреси становить від 0 до 1 Мбайт. Максимальний розмір сегмента – 64 Кбайт. При зверненні до конкретного фізичною адресоюОперативна пам'ять визначається адресою початку сегмента і зміщення всередині сегмента. Адреса початку сегмента береться із відповідного сегментного регістру. При цьому сегментний регістр містить тільки старші 16 біт фізичної адреси початку сегмента. Молодші чотири біти 20-бітної адреси, що бракують, виходять зрушенням значення сегментного регістру вліво на 4 розряди. Операція зсуву виконується апаратно. Отримане 20-бітове значення і є справжньою фізичною адресою, що відповідає початку сегмента. Тобто фізична адресазадається як пара "сегмент: зміщення", де "сегмент" (segment) - це перші 16 бітів початкової адреси сегмента пам'яті, якому належить клітинка, а "зміщення" - 16-бітова адреса цього осередку, відрахована від початку даного сегмента пам'яті (величина 16 * сегмент +зміщення дає абсолютну адресу осередку). Якщо, наприклад, у регістрі CS зберігається величина 1234h, тоді адресна пара 1234h:507h визначає абсолютну адресу, що дорівнює 16 * 1234h + 507h = 12340h + 507h = 12847h. Така пара записується у вигляді подвійного слова, причому (як і для чисел) у "перевернутому" вигляді: у першому слові розміщується зміщення, а в другому - сегмент, причому кожне з цих слів у свою чергу представлено в "перевернутому" вигляді. Наприклад, пара 1234h:5678h буде записана так: | 78 | 56| 34 | 12 |.

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

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

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

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ УЗБЕКИСТАНУ ІМЕНІ МИРЗО УЛУГБЕКА

ФАКУЛЬТЕТ КОМП'ЮТЕРНОЇ ТЕХНОЛОГІЇ

На тему: Семантичний аналіз EXE-файлу.

Виконав:

Ташкент 2003 року.

Передмова.

Мова асемблера та структура команд.

Структура EXE-файлу (семантичний аналіз).

Структура COM-файлу.

Принцип дії та поширення вірусу.

Дисасемблер.

програми.

Передмова

Професія програміста дивовижна та унікальна. В наш час науку і життя неможливо уявити без новітніх технологій. Все, що пов'язане з діяльністю людини не обходиться без обчислювальної техніки. А це сприяє її високому розвитку та досконалості. Нехай розвиток персональних комп'ютерів почався нещодавно, але протягом цього часу були зроблені колосальні кроки по програмним продуктам і ще довгий часці продукти широко використовуватимуться. Область пов'язаних з комп'ютерами знань зазнала вибуху, як і відповідна технологія. Якщо не брати до розгляду комерційну сторону, то можна сказати, що чужих людей у ​​цій галузі професійної діяльності немає. Багато хто займається розробкою програм не заради вигоди чи заробітку, а з власної волі, захоплення. Звичайно це не позначиться на якості програми, і в цій справі «бізнесі» є конкуренція та попит на якість виконання, на стабільній роботі і відповідає всім вимогам сучасності. Тут також варто відзначити появу мікропроцесорів у 60-х роках, які прийшли на заміну великої кількості набору ламп. Є деякі різновиди мікропроцесорів, які сильно відрізняються один від одного. Ці мікропроцесори відмінні один від одного розрядністю та вбудованими системними командами. Найпоширеніші такі як: Intel, IBM, Celeron, AMD тощо. Всі ці процесори стосуються розвиненої архітектури процесорів фірми Intel. Поширення мікрокомп'ютерів спричинило перегляд відносини до мови асемблера з двох основних причин. По-перше, програми, написані мовою асемблера, вимагають значно менше пам'яті та часу виконання. По-друге, знання мови асемблера та результуючого машинного коду дає розуміння архітектури машини, що навряд чи забезпечується під час роботи мовою високого рівня. Хоча більшість фахівців у галузі програмного забезпечення ведуть розробки мовами високого рівня, таких як Паскаль, С або Delphi, що простіше при написанні програм, найбільш потужне та ефективне програмне забезпечення повністю або частково написано мовою асемблера. Мови високого рівня було розроблено у тому, щоб уникнути спеціальної технічної особливості конкретних комп'ютерів. А мова асемблера, у свою чергу, розроблена для конкретної специфіки процесора. Отже, щоб написати програму мовою асемблера для конкретного комп'ютера, слід знати його архітектуру. В даний час видом основного програмного продукту є EXE-файл. Враховуючи позитивні стороницього автор програми може бути впевнений у її недоторканності. Але часто це далеко не так. Існує так само і дисасемблер. За допомогою дисассемблера можна дізнатися про переривання та коди програми. Людині, яка добре знається на асемблері не складно буде переробити всю програму на свій смак. Можливо звідси виникає найнерозв'язніша проблема – вірус. Навіщо люди пишуть вірус? Деякі ставлять це питання з подивом, деякі зі злістю, але продовжують існувати люди які цікавляться цим завданням не з точки зору завдання якоїсь шкоди, а як інтересу до системного програмування. Пишуть віруси з різних причин. Одним подобається системні виклики, іншим удосконалювати свої знання в асемблері. Про все це я постараюся викласти у своїй курсової роботи. Також у ньому сказано як про структуру EXE-файлу а й про мову асемблера.

^ Мова Асемблера.

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

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

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

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

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

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

Типовий сучасний комп'ютер (на базі i486 чи Pentium) складається з наступних компонентів (рис. 1).

Рис. 1. Комп'ютер та периферійні пристрої

Рис. 2. Структурна схема персонального комп'ютера

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

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

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

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

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

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

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

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

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

^ 16 користувальницьких регістрів;

16 системних регістрів.

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

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

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

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

регістри стану та управління:

Реєстр прапорів eflags/flags;

Реєстр покажчика команди eip/ip.

Рис. 3. Регістри користувача мікропроцесорів i486 і Pentium

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

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

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

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

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

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

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

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

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

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

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

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

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

Стеком називають область програми для тимчасового зберігання довільних даних. Зрозуміло, дані можна зберігати і в сегменті даних, проте в цьому випадку для кожного зберігається на час даного треба заводити окрему іменовану комірку пам'яті, що збільшує розмір програми та кількість імен, що використовуються. Зручність стека полягає в тому, що його область використовується багаторазово, причому збереження в стеку даних і вибірка звідти виконується за допомогою ефективних команд push і pop без вказівок будь-яких імен.
Стек традиційно використовується, наприклад, для збереження вмісту регістрів, що використовуються програмою, перед викликом підпрограми, яка, у свою чергу, використовуватиме регістри процесора "у своїх особистих цілях". Вихідний вміст регістрів витікається зі стека після повернення з підпрограми. Інший поширений прийом - передача підпрограмі необхідних нею параметрів через стек. Підпрограма, знаючи, в якому порядку поміщені в стек параметри, може забрати їх звідти та використовувати під час виконання. Відмінною особливістюстека є своєрідний порядок вибірки які у ньому даних: у час в стеку доступний лише верхній елемент, тобто. елемент, завантажений у стек останнім. Вивантаження зі стека верхнього елемента робить доступним наступний елемент. Елементи стека розташовуються в області пам'яті, відведеної під стек, починаючи з дна стека (тобто з його максимальної адреси) за адресами, що послідовно зменшуються. Адреса верхнього доступного елемента зберігається в регістрі-покажчику стека SP. Як і будь-яка інша область пам'яті програми, стек повинен входити до якогось сегмента або утворювати окремий сегмент. У будь-якому випадку сегментна адреса цього сегмента міститься в сегментний регістр стека SS. Таким чином, пара регістрів SS:SP описують адресу доступного осередку стека: в SS зберігається сегментний адресу стека, а в SP - зміщення останнього збереженого в стеку даного (рис. 4, а). Звернемо увагу на те, що у вихідному стані покажчик стека SP вказує на комірку, що лежить під дном стека і не входить до нього.

Рис 4. Організація стеку: а - вихідний стан, б - після завантаження одного елемента (в даному прикладі- вмісту регістру АХ), - після завантаження другого елемента (вмісту регістру DS), г - після вивантаження одного елемента, д - після вивантаження двох елементів і повернення у вихідний стан.

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

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

переведе стек у стан, показаний на рис. 1.10 ст. У стеку тепер зберігатимуться два елементи, причому доступним буде тільки верхній, на який вказує покажчик стека SP. Якщо через деякий час нам знадобилося відновити вихідний вміст збережених у стеку регістрів, ми повинні виконати команди вивантаження зі стеку pop (виштовхнути):

pop DS
pop AX

Якого розміру має бути стек? Це залежить від того, наскільки інтенсивно він використовується у програмі. Якщо, наприклад, планується зберігати в стеку масив об'ємом 10 000 байт, то стек повинен бути не меншим за цей розмір. При цьому треба мати на увазі, що в ряді випадків стек автоматично використовується системою, зокрема, при виконанні команди переривання int 21h. По цій команді спочатку процесор поміщає в стек адресу повернення, а потім DOS відправляє туди вміст регістрів та іншу інформацію, що відноситься до перерваної програми. Тому, навіть якщо програма зовсім не використовує стек, він все ж таки повинен бути присутнім у програмі і мати розмір не менше кількох десятків слів. У першому прикладі ми відвели під стек 128 слів, що безумовно достатньо.

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

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

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

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

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

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

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

^ Синтаксис асемблера

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

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

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

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

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

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

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

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

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

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

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

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

Цифри від 0 до 9;

Знаки?, @, $, _, &;

Розділювачі, . ()< > { } + / * % ! " " ? \ = # ^.

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

Лексемами є:

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

^ Команди асемблера.

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

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

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

1 - після виконання команди прапор встановлюється (рівний 1);

0 - після виконання команди прапор скидається (рівний 0);

r – значення прапора залежить від результату роботи команди;

Після виконання команди прапор не визначено;

пробіл - після виконання команди прапор не змінюється;

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

r8, r16, r32 - операнд в одному з регістрів розміром байт, слово або подвійне слово;

m8, m16, m32, m48 - операнд у пам'яті розміром байт, слово, подвійне слово або 48 біт;

i8, i16, i32 - безпосередній операнд розміром байт, слово чи подвійне слово;

a8, a16, a32 - відносна адреса (зміщення) у сегменті коду.

Команди (за абеткою):

*Дані команди докладно описані.

ADD
(ADDition)

Додавання

^ Схема команди:

add приймач, джерело

Призначення: додавання двох операндів джерело та приймач розмірністю байт, слово або подвійне слово.

Алгоритм роботи:

скласти операнди джерело та приймач;

записати результат додавання до приймача;

встановити прапори.

Стан прапорів після виконання команди:

Застосування:
Команда add використовується для складання двох цілих операндів. Результат додавання міститься за адресою першого операнда. Якщо результат додавання виходить за межі операнда приймач (виникає переповнення), то врахувати цю ситуацію слід шляхом аналізу прапора cf та подальшого можливого застосування команди adc. Наприклад, складемо значення в регістрі ax та області пам'яті ch. При додаванні слід врахувати можливість переповнення.

Регістр плюс регістр чи пам'ять:

|000000dw|modregr/rm|

Регістр AX (AL) плюс безпосереднє значення:

|0000010w|--data--|data, якщо w=1|

Регістр або пам'ять плюс безпосереднє значення:

|100000sw|mod000r/m|--data--|data, якщо BW=01|

CALL
(CALL)

Виклик процедури чи завдання

^ Схема команди:

Призначення:

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

перемикання завдань.

Алгоритм роботи:
визначається типом операнда:

Мітка ближня - у стек заноситься вміст покажчика команд eip/ip і до цього ж регістр завантажується нове значення адреси, відповідне мітці;

Мітка дальня - в стек заноситься вміст покажчика команд eip/ip та cs. Потім ці ж регістри завантажуються нові значення адрес, відповідні дальньої мітці;

R16, 32 або m16, 32 - визначають регістр або комірку пам'яті, що містять усунення в поточному сегменті команд, куди передається управління. При передачі управління у стек заноситься вміст покажчика команд eip/ip;

Покажчик на пам'ять - визначає комірку пам'яті, що містить 4 або 6-байтний покажчик на процедуру, що викликається. Структура такого покажчика 2+2 або 2+4 байти. Інтерпретація такого покажчика залежить від режиму роботи мікропроцесора:

^ Стан прапорів після виконання команди (крім перемикання задачі):

виконання команди не впливає на прапори

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

Об'єктний код (чотири формати):

Пряма адресація у сегменті:

|11101000|disp-low|diep-high|

Непряма адресація у сегменті:

|11111111|mod010r/m|

Непряма адресація між сегментами:

|11111111|mod011r/m|

Пряма адресація між сегментами:

|10011010|offset-low|offset-high|seg-low|seg-high|

CMP
(Compare operands)

Порівняння операндів

^ Схема команди:

cmp операнд1,операнд2

Призначення: порівняння двох операндів.

Алгоритм роботи:

виконати віднімання (операнд1-операнд2);

залежно від результату встановити прапори, операнд1 та операнд2 не змінювати (тобто результат не запам'ятовувати).

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

Об'єктний код (три формати):

Реєстр або пам'ять з регістром:

|001110dw|modregr/m|

Безпосереднє значення з регістром AX (AL):

|0011110w|--data--|data, якщо w=1|

Безпосереднє значення з регістром або пам'яттю:

|100000sw|mod111r/m|--data--|data, якщо sw=0|

DEC
(DECrement operand by 1)

Зменшення операнда на одиницю

^ Схема команди:

dec операнд

Призначення: зменшення значення операнда у пам'яті чи регістрі на 1.

Алгоритм роботи:
команда віднімає 1 з операнда. Стан прапорів після виконання команди:

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

Реєстр: |01001reg|

^ Регістр чи пам'ять: |1111111w|mod001r/m|

DIV
(DIVide unsigned)

Поділ беззнаковий

Схема команди:

div дільник

Призначення: виконання операції поділу двох двійкових знакових значень.

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

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

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

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

^ Стан прапорів після виконання команди:

Застосування:
Команда виконує цілий поділ операндів з видачею результату поділу у вигляді приватного та залишку від поділу. За виконання операції поділу можливе виникнення виняткової ситуації: 0 - помилка поділу. Ця ситуація виникає в одному з двох випадків: дільник дорівнює 0 або приватне занадто велике для його розміщення в регістрі eax/ax/al.

Об'єктний код:

|1111011w|mod110r/m|

INT
(INTerrupt)

Виклик підпрограми обслуговування переривання

^ Схема команди:

int номер_переривання

Призначення: виклик підпрограми обслуговування переривання з номером переривання, заданим операндом команди.

^ Алгоритм роботи:

записати в стек регістр прапорів eflags/flags та адресу повернення. При записі адреси повернення спочатку записується вміст сегментного регістру cs, потім вміст покажчика команд eip/ip;

скинути у нуль прапори if та tf;

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

^ Стан прапорів після виконання команди:

Застосування:
Як видно із синтаксису, існують дві форми цієї команди:

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

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

Об'єктний код (два формати):

Реєстр: |01000reg|

^ Регістр чи пам'ять: |1111111w|mod000r/m|

JCC
JCXZ/JECXZ
(Jump if condition)

(Jump if CX=Zero/Jump if ECX=Zero)

Перехід, якщо виконано умову

Перехід, якщо CX/ECX дорівнює нулю

^ Схема команди:

jcc мітка
jcxz мітка
jecxz мітка

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

^ Алгоритм роботи команд (крім jcxz/jecxz):
Перевірка стану прапорів залежно від коду операції (воно відображає умову, що перевіряється):

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

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

Алгоритм роботи команди jcxz/jecxz:
Перевірка умови рівності нулю вмісту регістру ecx/cx:

якщо перевіряється умов