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

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-розрядного регістру. p align="justify"> Для роботи з байтами використовуються регістри з приставками 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 ;Команда, два операнди
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 можна не вказувати.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

mov eax, sum; eax = sum

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Моделі пам'яті Перед оголошенням сегментів необхідно вказати модель пам'яті за допомогою директиви. MODEL модифікатор модель_пам'яті, угода_про_дзвінки, тип_ОС, параметр_стека Основні моделі пам'яті мови асемблера: Модель пам'яті Адресація коду Адресація даних Операційна система Чергування коду та даних TINY NEAR MS-DOS Допустимо SMALL NEAR MS-DOS, Windows Немає MEDIUM FAR NEAR MS-DOS, 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