You are on page 1of 51

1. Опишіть поняття файли, каталоги та FAT у асемблері.

Файли. Існує два поняття файлу: загальноприйнятні і використовувані в


програмуванні. Загальноприйняте поняття файлу - це область ПЗП, що має
власне ім'я і містить логічно закінчену сукупність однорідної інформації. У
програмуванні особливо в високорівневому, файл - це лінійна послідовність
логічних записів. Логічний запис - це мінімальний обсяг інформації, який
може бути обчислений або записаний у файл.
Каталоги. Логічно каталог - це таблиця, що містить записи про файли.
У будь-якій файловій системі запис про файл обов'язково містить:
1. ім'я та розширення імені файлу;
2. розмір (довжину) файлу;
3. адресу початку файлу в зовнішній пам’яті;
4. атрибути файлу.
Для обліку розміщення файлів по кластерах використовується FAT,
кожен елемент, який описує стан відповідного кластера. Взаємозв'язок
каталогів, FAT і розміщення файлів по кластерах

2. Опишіть поняття системної таблиці відкритих файлів у асемблері.


Системна таблиця відкритих файлів. SFT (таблиця відкритих файлів)
містить записи про файли, з якими працюють прикладні програми. Кожен
запис має унікальний числовий ідентифікатор (порядковий номер), що
присвоюється операційною системою (handle файла). До складу запису
входять дані, достатні для виконання всіх операцій з файлом без звернення
до каталогів і FAT:
1. handle файлу;
2. лічильник записів про файл;
3. всі дані з запису про файл в каталозі;
4. режим доступу;
5. покажчик поточної позиції;
6. покажчик на копію FAT в оперативній пам'яті;
7. вказівник на поточний каталог;
8. покажчик на драйвер пристрою і т. д.

3. Вкажіть записи, що присутні в SFT з handle.


При цьому в SFT постійно присутні записи з handle 0, 1, 2, 3, 4:
0 - стандартний ввід (найчастіше клавіатура), тільки для читання;
1 - стандартний вивід (найчастіше монітор), тільки для запису;
2 - стандартний вивід помилок (найчастіше монітор), тільки для запису;
3 - пристрій з логічним ім'ям AUX (найчастіше COM1);
4 - пристрій з логічним ім'ям PRN (найчастіше LPT1), що дозволяє
працювати з перерахованими пристроями як з файлами.
4. Вкажіть, який розподіл пам’яті використовується в асемблері х86.

5. Вкажіть структуру блоків пам’яті зайнятих програмами.


Блоки пам'яті, займані програмами, мають наступну структуру:
MCB→PSP→Сегмент стека→Сегмент даних→Сегмент кодів команд

РSР - службова структура даних довжиною 256 байт містить описання


програми.

6. Охарактеризуйте поняття переривань.


Переривання ‒ це реакція обчислювальної системи на деяку асинхронну подія,
яка полягає в тому, що виконання поточної програми тимчасово припиняється,
виконується деяка підпрограма (обробник переривання), після чого продовжується
виконання перерваної програми.
7. Вкажіть класифікацію переривань та коротко охарактеризуйте їх.
Класифікація переривань: внутрішні (синхронні) та зовнішні (асинхронні).
Внутрішні поділяються на програмні та від схем контролю. Програмні переривання
викликаються командою int і використовуються для передачі управління з прикладних
програм в ОС або BIOS. Переривання від схем контролю виникають у тих випадках,
коли неможлива коректна робота процесора. Зовнішні переривання виникають на
вимогу зовнішніх пристроїв в тих випадках, коли їм потрібне обслуговування. Винятком
з цього правила є системний таймер - пристрій, запрограмований на періодичне
вироблення запитів на переривання через фіксовані інтервали часу (в DOS -
приблизно
18,2 ms). Він використовується для відстеження системного часу, інтервалів часу при
роботі з зовнішніми пристроями, тайм-аутів, що виключають «зависання» системи.

8. Вкажіть засоби апаратної підтримки переривань.


Для забезпечення можливості роботи з перериваннями апаратна частина
комп'ютера обов'язково містить відповідні ресурси підтримки переривань. У реальному
режимі роботи лінії x86 такими засобами є:
1. опитування процесором вхідної лінії запиту переривання перед виконавцем чергової
команди;
2. вектора переривань;
3. команди процесора int, into, iret;
4. прапор дозволу переривання (IF) в регістрі прапорів процесора;
5. контролер переривань;
6. схеми вироблення сигналів переривань в зовнішніх пристроях.
9. Наведіть повний цикл роботи процесора.

10. Охарактеризуйте вектори переривань.


Вектори переривань в реальному режимі роботи розташовуються на самому
початку оперативної пам'яті і посідають перші 2 10 байт. Всього векторів 256, і вони
пронумеровані від 0 до 255. За кожним вектором закріплені свої переривання. За своїм
змістом вектор переривання - це два слова, що містять адресу обробника
переривання. У старшому слові розташовується номер параграфа (сегментна частина
адреси), у молодшому – зсув відносно сегментної частини адреси.
Команда int викликає переривання з вектором, зазначеним в якості аргументу команди,
зокрема int 21h (або int 33) - передає управління в DOS, int 13h і int 17h - в BIOS і т. д.

11. Охарактеризуйте поняття контролера переривань.


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

13. Вкажіть функції, що виконує контролер переривань.


Контролер переривань виконує наступні функції:
1. фіксує запити на переривання від зовнішніх пристроїв;
2. маскує отримані запити (дозволяє або забороняє проходження
запитів з окремих IRQ входів);
3. реалізує обслуговування запитів відповідно до їх пріоритетів (у
випадку, коли одночасно наявні декілька запитів);
4. передає процесору номер вектора переривання, який слід
використовувати при обробці переривання.
14. Вкажіть схему роботи контролера переривань.

15. Вкажіть, що програмується у контролері переривань.


У контролері переривань програмуються: маска (в РМ), арбітр пріоритетів,
початковий номер діапазону номерів векторів переривань (в РПНВ), режим роботи,
схема з'єднання «ведучий - ведені».
16. Зобразіть спрощений алгоритм функціонування драйвера
пристрою введення-виведення працюючого по перериваннях.

17. Охарактеризуйте спрощений алгоритм функціонування


драйвера пристрою введення-виведення працюючого по
перериваннях.
Вхід у драйвер. Коли прикладна програма передає запит на введення-
виведення операційній системі, та, в свою чергу, формує запит до
відповідного драйверу: заповнює структуру даних, що описує запит, і
передає управління в драйвер.
Ініціалізація виконання запиту на зовнішньому пристрої.
Отримавши управління, драйвер аналізує запит (отриману структуру даних) і
подає команду зовнішнього пристрою (поміщає відповідні коди в регістри
цього пристрою). З цього моменту зовнішній пристрій починає виконувати
операцію відповідно до отриманої команди.
Дозвіл переривання від зовнішнього пристрою в загальному випадку
вимагає дозволу переривання на зовнішньому пристрої (записи відповідного
коду в регістр управління) та дозволу проходження запитів з відповідного
IRQ входу (записи 0 в необхідний розряд регістра маски контролера
переривань).
Вихід з драйвера. Після дозволу переривання драйвер передає
управління в операційну систему, щоб та могла завантажити процесор
корисною роботою (наприклад, виконанням однієї з прикладних програм),
поки зовнішній пристрій виконує запущену операцію.

18. Охарактеризуйте узагальнений алгоритм обробника переривань.

Пошук джерела переривання найбільш явно виражений в тих


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

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


процедур обробки переривань.
При розробці процедур обробки переривань в загальному випадку
необхідно враховувати ряд вимог і правил. Обробник переривань повинен:
1. зберігати контекст перерваної програми;
2. тримати забороненими переривання тільки у випадку крайньої на те
необхідності;
3. виконуватися за мінімально можливий час;
4. передбачати можливість повторного входу;
5. забезпечувати спрацьовування обробника, який використав даний
вектор раніше.
Запитами до операційної системи можна користуватися тільки в тому
випадку, якщо наперед відомо, що даний запит дозволений до використання
в обробниках переривань.

20. Опишіть схему взаємодій прикладної програми з ОС.


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

21. Охарактеризуйте системний виклик програмне переривання та


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

22. Охарактеризуйте системний виклик API-функції та вкажіть на


його особливості.
Другий варіант організації системних викликів на
сьогоднішній день став стандартом. Це так звані API-функції (Application
Programming Interface - інтерфейс програмування додатків). Найбільш
відомою в цій сфері є група стандартів, що мають загальне найменування
POSIX (Portable Operation System Interface - переносимий інтерфейс
операційної системи). Вперше цей інтерфейс повністю був реалізований в ОС
Linux.
Даний варіант передачі запитів до ОС передбачає оформлення
системних викликів у вигляді функцій. Описом запиту в цьому випадку
виступає ім'я (ідентифікатор) функції і передані в неї аргументи. Результати
виконання запиту повертаються в прикладну програму у вигляді результату
функції і в разі необхідності через передані у функцію аргументи (в тих
випадках, коли результати запиту являють собою деяку структуру даних
досить великого обсягу). Фактично API-функції використовують стандартні
засоби мови програмування для виклику процедур і функцій, в яких передача
аргументів виробляється через стек, а результат функції повертається через
регістри процесора (найчастіше - регістри Al, Ax, EAx, Dx, EDx).

23. Вкажіть інтерфейс системних викликів API-функцій.


Якщо поєднати стандартні механізми роботи з процедурами і функціями, що
використовуються в сучасних мовах програмування, з вище наведеною послідовністю
дій прикладної програми для використання послуг операційної системи, то виходить
наступний інтерфейс системних викликів:
1. дані, що становлять опис запиту, розміщуються в стеку. Склад цих даних
визначається складом аргументів API-функції;
2. передача керування в операційну систему здійснюється за допомогою
команди виклику підпрограми Call, яка присутні в системах команд переважної
більшості процесорів;
3. повернення управління з операційної системи здійснюється за допомогою
команди повернення з підпрограми (або аналогічної їй послідовності команд).
Результати виконання запиту повертаються в прикладну програму через регістри
процесора і у випадку необхідності через передані у функцію аргументи, що містять
покажчики на змінні з результуючими даними.

24. Вкажіть взаємодію DOS-додатків та консольних Windows-додатків


з операційною системою.
Перший варіант інтерфейсу системних викликів чудово видно при розгляді
викликів функцій DOS (який, до речі, вона успадкувала з інших операційних систем, що
існували на момент її появи). Коротко перерахуємо його основні особливості:
1. дані, що становлять опис запиту, розміщуються в регістрах процесора. Для
передачі операційній системі даних великого об'єму використовуються покажчики, які
розміщуються знову-таки в регістрах процесора;
2. передача керування в операційну систему здійснюється за допомогою
програмних переривань з певним вектором, команди яких присутні в системах команд
переважної більшості процесорів.
У DOS для цих цілей використовується команда int з вектором номер 21h. Після
повернення управління з операційної системи за допомогою команди повернення з
переривання (або аналогічної їй послідовності команд) ознакою невдалого завершення
виконання системного виклику є одиничне стан прапора перенесення в регістрі стану
процесора (в DOS - прапор CF регістра прапорів процесора). Результати виконання
запиту повертаються в прикладну програму через регістри процесора.
25. Вкажіть взаємодію віконних Windows-додатків з операційною
системою та наведіть її схему.
Консольні Windows-програми в принципі побудовані так само, як і 16-розрядні
додатки MS DOS. При їх запуску зовні відбувається те ж саме, відкривається «чорне»
вікно, в якому видно текстові повідомлення з програми і в якому користувач може
набирати рядка.
1. Відмінною особливістю консольних Windows-додатків є в першу чергу те, що
в них використовується 32 або 64 розрядна архітектура: 32-розрядні регістри, 32-
розрядні адреси.
2. Наступною відмінністю є те, що консольні додатки використовують «плоску»
(FLAT) модель пам'яті, у якій відсутнє поняття сегментів (точніше початком всіх
сегментів є один і той же початкова адреса пам'яті).
3. Третьою відмінністю є запити до операційної системи, які виконуються не за
допомогою програмних переривань, як в DOS-функціях, а у вигляді виклику підпрограм
(API-функцій). Віконні додатки істотно відрізняються від консольних. Ці відмінності
пов'язані з використанням засобів операційної системи для роботи з вікнами. У
віконних додатках вікно є самостійним об'єктом операційної системи і відокремлене від
самої програми

26. Опишіть поняття узгодженості імен і атрибутів сегментів модулів.


Це питання
вирішується досить просто: на сьогоднішній день більшість компіляторів з
мов високого рівня дають усталені імена сегментам. Найчастіше сегмент
коду носить ім'я TEXT, сегмент даних - DATA, сегмент стека - STACK. Щоб
не замислюватися над іменами сегментів в асемблерних програмах
рекомендується користуватися спрощеними директивами сегментації:
.CODE, .DATA, .STACK. У цьому випадку транслятор сам дасть типові імена
сегментам модуля і привласнить їм всі необхідні атрибути.

27. Вкажіть різновиди команд виклику підпрограм і повернення з них.


Лінія процесорів х86 має в своїй системі команд два різновиди команд
виклику підпрограм і повернення з них.
1. Команди викликів: Call near (близький або внутрішньосегментний
виклик); Call far (далекий чи міжсегментний виклик).
2. Команди повернень: ret near (близьке або внутрішньосегментне
повернення); ret far (далеке чи міжсегментне повернення).

28. Вкажіть вміст стеку для Callnear і для Callfar.

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


Лінія процесорів х86 має в своїй системі команд два різновиди команд виклику
підпрограм і повернення з них.
1. Команди викликів: Call near (близький або внутрішньосегментний виклик);
Call far (далекий чи міжсегментний виклик).
2. Команди повернень: ret near (близьке або внутрішньосегментне повернення);
ret far (далеке чи міжсегментне повернення).

30. Вкажіть якими способами команди call i ret дозволяють задавати


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

31. Опишіть вид виклику, що полягає в явному описі типу адреси


переходу за допомогою директиви label.
Інший варіант зазначення виду виклику полягає в явному описі типу
адреси переходу за допомогою директиви label:
......................
A label near
..............
B label far
.............
Call A
.........
Call B
У цьому випадку Call A буде близьким викликом, Call B - далеким. У
випадку, коли перехід здійснюється з використанням покажчика на адресу
підпрограми, необхідно явна вказівка розмірності адреси:
Call word ptr [Bx] - для близького виклику,
Call dword ptr [Bx] - для далекого виклику.
За замовчуванням використовується близький виклик і повернення.
Вищеописані способи використовуються, коли підпрограма являє собою
послідовність команд, що починається з деякою мітки.

32. Опишіть директиви proc i endp для оформлення підпрограм.


Директива proc дозволяє явно задавати вид виклику і змушує транслятор генерувати
замість команди ret відповідний код повернення. У наведеному прикладі процедура А -
близька, В - далека.

33. Опишіть різні моделі пам’яті задання виклику підпрограм.


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

35. Вкажіть, що собою представляють директиви extrn, public i local у


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

36. Вкажіть, що собою представляють повторно використовувані


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

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


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

2. Повторновикористовувана процедура не може викликати не


повторновикористовувану процедуру.

3. Процедура не може мати власних статичних областей пам'яті для


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

4. Області пам'яті під змінні процедура повинна отримувати із


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

38. Опишіть поняття синхронізації процесів і потоків через критичні


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

Критичні секції не є об'єктами ядра. Їх не можна використовувати для синхронізації


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

39. Опишіть загальні принципи синхронізації через об’єкти ядра.


Об'єкти ядра можуть перебувати в сигналізованому або не сигналізованому стані.
Якщо об'єкт не використовується, то він знаходиться в не сигналізованому стані. Будь-
який потік, який хоче отримати доступ до такого об'єкта, повинен почекати, поки об'єкт
не буде просигналізований (наприклад, процеси і потоки сигналізуються, коли
закінчують свою роботу). Доступ до об'єктів ядра можна отримати через handle, який
отримується як результат роботи якої-небудь функції з назвою CreateXOBJECTX.
Щоб помістити потік в сон і почекати, поки об'єкт буде просигналізований, можна
використовувати наступний код:
push час очікування
push handle спостережуваного об'єкта
call WaitForSingleObject
push час очікування
push булеві значення - чекати всіх
push покажчик на масив об'єктів, які потрібно чекати
callWaitForMultipleObjects
Булеві значення - установка в TRUE (1) вкаже функції чекати все handle,
в іншому випадку (0) функція повернеться після сигналізації одного об'єкта.
Час очікування - час в ms, який функція буде очікувати сигналізацію.

40. Вкажіть, що собою представляють події синхронізації через


об’єкти ядра.
Події - це прості об'єкти ядра, у яких немає спеціальних умов, при яких вони
переключаються в сигналізуючий стан. Уявімо, що один з процесів чекає події. Інший
процес може перемкнути подію за допомогою функції SetEvent.
Початковий стан - подія буде створена в сигналізуючому стані (1) або не
сигналізуючому (0).
Режим події - подія може перекладатися в не сигналізуючий стан автоматично (після
того, як буде виконана котрась із функцій WaitX) або вручну (необхідно де
сигналізувати об'єкт самостійно):
auto reset = 0 manual reset = 1
Якщо один процес створює подія, інший може отримати доступ до цієї події,
використовуючи його ім'я.
Булеві значення - якщо встановлено в TRUE (1), handle події може бути успадкований
іншими створеними процесами.
Функції CreateEvent і OpenEvent повертають handle події. Є три функції для роботи зі
станом подій.
1. Щоб встановити подію в сигналізований стан: push handle події call SetEvent
2. Щоб встановити подія в не сигналізований стан: push handle події call ResetEvent
3. push handle події call PulseEvent
Ця функція встановлює подію, відновлює чекаючий потік, а потім скидає подію. Всі ці
функції повертають TRUE (1) у разі успіху.

41. Вкажіть, що собою представляють функції SetEvent, ResetEvent,


PulseEvent.
1.Щоб встановити подію в сигналізований стан:
push handle події call SetEvent

2.Щоб встановити подію в несигналізований стан:


push handle події call ResetEvent

3.push handle події call PulseEvent


Ця функція встановлює подію, відновлює чекаючий потік, а потім скидає
подію. Всі ці функції повертають TRUE(1) у разі успіху.

42. Вкажіть, що собою представляють м’ютекси.


Слово м'ютекс означає mutual exclusion (взаємний виняток). Це один з легких у
використанні і дуже корисних синхронізаційних об'єктів. Він схожий на критичні секції,
але його можна використовувати у взаємодії між процесами. Можна створити м'ютекс
наступним чином:
push покажчик на ім'я м'ютекса
push булеві значення – ініціалізація
push покажчик на SECURITY_ATTRIBUTES
call CreateMutex (A / W)
Ініціалізація - якщо TRUE (1), тоді м'ютекс створюється несигналізованним, в іншому
випадку він доступний кому завгодно. Існуючий м'ютекс можна відкрити так:
push покажчик на ім'я м'ютекса
push булеві значення - успадкування
Спадкування - якщо встановлено в TRUE (1), handle події може бути успадкований
іншими створеними процесами. Доступ:
MUTEX_ALL_ACCESS = 01f0001h повний доступ до м'ютексів
Потік може звільнити тільки той м'ютекс, яким він володіє.

43. Вкажіть, що собою представляють семафори.


Семафори - це дуже потужні синхронізаційні об'єкти. Як їх м'ютекси, семафори
спостерігають за входом в критичну секцію, але різниця полягає в тому, що в одній
критичній секції може бути більше одного потоку. Семафори можуть
використовуватися для ресурсів з обмеженою кількістю. Можна створити семафор
наступним чином:
push покажчик на ім'я семафора
push максимальну кількість
push початкова кількість
push покажчик на SECURITY_ATTRIBUTES
call CreateSemaphore (A / W)

Спадкування - якщо встановлено в TRUE (1), handle подія може бути успадковано
іншими створеними процесами. Якщо немає потреби у використанні ресурсу, за яким
спостерігає семафор, використовується функція ReleaseSemaphore, щоб збільшити
кількість можливих доступів до ресурсу:
push покажчик на подвійне слово - отримуємо попереднє значення
лічильника семафора
push наскільки збільшити значення семафора push handle семафора call
ReleaseSemaphore
Семафори знаходяться в сигналізуючому стані, якщо значення його лічильника не
дорівнює нулю, в іншому випадку він встановлюється в несигналізований стан і вхідний
потік поміщається в сон.

44. Вкажіть, що собою представляє функція ReleaseSemaphore.


Якщо немає потреби у використанні ресурсу, за яким спостерігає
семафор, використовується функція ReleaseSemaphore, щоб збільшити
кількість можливих доступів до ресурсу:
push покажчик на подвійне слово - отримуємо попереднє значення
лічильника семафора
push наскільки збільшити значення семафора push handle семафора call
ReleaseSemaphore

45. Вкажіть, що собою представляють очікуючі таймери.


Дотепер у нас були об'єкти, які потрібно було вручну (як правило) перемкнути в
сигналізуючий стан. Очікуючи таймери - це об'єкти, які сигналізують себе самі після
деякого періоду часу.
Режим таймер створюється наступним чином:
push покажчик на ім'я
push булеві значення - авто / ручний скидання
push покажчик на SECURITY_ATTRIBUTES
call CreateWaitableTimer (A / W)
Авто / ручний скид - також, як у подіях
Можна відкрити існуючий режим таймеру так:
push покажчик на ім'я
push булеві значення - успадкування
push доступ
call OpenWaitableTimer (A / W)
Успадкування - якщо встановлено в TRUE (1), handle події може бути
успадкований іншими створеними процесами.

46. Вкажіть склад і призначення бібліотек Windows-API.


Windows Api (application programming interfaces) — загальне найменування для
цілого набору базових функцій інтерфейсів програмування застосунків операційних
систем сімейства Windows корпорації Майкрософт. Є непрямим способом взаємодії
застосунків з Windows.
Для створення програм, що використовують Windows API, Майкрософт випускає
SDK, який називається Platform SDK і містить документацію, набір бібліотек, утиліт і
інших інструментальних засобів.
Робота через Windows API — це найближчий до системи спосіб взаємодії з нею
прикладних програм.

47. Охарактеризуйте API- функції.


Існує дві категорії API функції: одна для ANSI і інша для Unicode. Hа кінці імен
API функцій для ANSI міститься "A". Наприкінці імен функцій для Unicode перебуває
"W". Windows 95 від пpиpоди підтримує ANSI й WIndows NT Unicode. Ми звичайно
маємо справу з ANSI рядками.
48. Вкажіть призначення основних функцій, які використовуються
для створення вікна.
Фоpмат прототипа функції наступний: “Ім'яФункції” PROTO
[Ім’яПаpаметpу]:ТипДаних,[ Ім’яПаpаметpу]:ТипДаних,...

MessageBox PROTO hwnd:DWORD, lpText:DWORD, lpCaption:DWORD,


uType:DWORD
hwnd - унікальний ідентифікатор. Отже, як і у будь-якого дерева, у дерева вікон є
корінь. Отримати покажчик на нього можна функцією GetDesktopWindow(), яка поверне
HWND кореня у вигляді робочого столу.
lpText - це покажчик на текст, який ви хочете відобразити у клієнтській частині вікна
повідомлення. Покажчик - це адpес чого-небудь. Покажчик на текстовий рядок ==
адpес цього рядка.
lpCaption - це покажчики на заголовок вікна повідомлення.
uType встановлює іконку, число й вид кнопок вікна.

49. Вкажіть призначення й місце розташування include-файлів.


Більшість прототипів для API-функцій містяться в include-файлах. Якщо
використовувати MASM32, вони будуть перебувати в директорії MASM32/INCLUDE.
Файли підключення мають pозширення .inc і пpототипи функцій DLL перебувають в
.inc файлі з таким ж ім'ям, як й у цієї DLL.

50. Вкажіть призначення й використання файлу kernel 32.inc і


директиви includelib.
kernel32.inc. складається з пpототипів функцій з відповідної dll. Якщо
ви не підключите kernel32.inc, ви усе ще можете викликати ExitProcess, але вже за
допомогою асемблерної команди call. Ви не зможете викликати цю функцію за
допомогою invoke. Справа у чому: для того, щоб викликати функцію чеpез invoke, ви
повинні помістити у вихідному коді її пpототип. Файли підключення потрібні для того,
щоб позбавити нас від зайвої pоботи й нам не потрібно було набирати всі пpототипи
самим.
includelib працює не так, як include. Це всього лише спосіб вказати асемблеру які
бібліотеки ваша пpогpама повинна слідкувати. Хоча ви зовсім не зобов'язані
використовувати саме цей метод. Ви можете вказати імена бібліотек імпоpту у
командному рядку пpи запуску лінкеpа, але це є досить нудно й утомливо, та й
командний рядок може вмістити максимум 128 символів.

51. Опишіть етапи створення об’єктного файлу.


● ml /c /coff /Cp msgbox.asm
● /c говоpить MASM'у створити .obj файл у фоpматі COFF. MASM використовує
ваpіант COFF (Common Object File Format), що використовується під Unix, як
його власний об'єктний і що виконує формат файлів.
● /Cp говоpить MASM'у зберігати pегістp імен, заданих користувачем.
Після успішної компіляції msgbox.asm, ви одержите msgbox.obj.
● link /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm32\lib msgbox.obj
● /SUBSYSTEM:WINDOWS інфоpмує лінкеp про те, якого виду є майбутній
виконуваний модуль.
● /LIBPATH:<шлях до бібліотек імпоpту> говоpить лінкеpу, де перебувають
бібліотеки імпоpту. Якщо ви використовуєте MASM32, вони будуть в
MASM32\lib.

52. Охарактеризуйте параметр addr.


● addr не може бути використаний з мітками, які визначені попеpеду, а offset
може.
●addr підтримує локальні змінні, у той час як offset ні. Локальна змінна - це
всього лише зарезервоване місце в стеці. Addr працює з ними, тому що асемблеp
спочатку перевіряє - глобальна змінна або локальна. Якщо вона глобальна, він поміщає
адpес цієї змінної в об'єктний файл. У цьому випадку опеpатоp працює як offset.

53. Вкажіть етапи, що необхідні для створення графічного об’єкта


(вікна).
● Взяти хэндл пpогpами (обов'язково).
● Взяти командний рядок (не потрібно до тих піp, поки пpогpамі не знадобиться її
пpоаналізувати).
● Заpегіструвати клас вікна (необхідно, якщо ви не використовуєте один з
пpевизначених класів вікна, таких як MessageBox або діалогове вікно).
● Створити вікно (необхідно).
● Відобразіть його на екpані.
● Обновіть зміст екpану на вікні.
● Запустити нескінченний цикл, у якому будуть перевірятися повідомлення від
операційної системи.
● Повідомлення, що надходять пеpедаються спеціальною функцією, яка є
відповідальною за обробку вікна.
● Вийти з пpогpами, якщо користувач закрив вікно.

54. Охарактеризуйте основні розділи програми, необхідних для


створення вікна.
invoke GetModuleHandle, NULL ; Взяти хэндл пpогpами
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT; викликати
основну функцію
invoke RegisterClassEx - Зареєструвати клас вікна
invoke CreateWindow - Створити вікно
invoke ShowWindow - Відобразити вікно на екрані
invoke UpdateWindow -Відновити клієнтську область

55. Вкажіть переваги й недоліки директиви LOCAL.


Всі диpективи LOCAL повинні випливати безпосередньо після диpективи PROC. Після
LOCAL відpазу йде <ім'я_змінної>:<тип змінної>.
Зворотнім боком цього є те, що локальні змінні не можуть бути використані поза
функцією, у якій вони були створені й будуть автоматично знищені функцією по
поверненню. Дpугим недоліком є те, що не можна ініціалізувати локальні змінні
автоматично, тому, що вони всього лише є стековою пам'яттю, динамічно
заpезеpвованою, коли функція була створена.

56. Опишіть поняття визначених класів у Windows.


Це класи, що були попередньо побудовані та упаковані у АРІ Win32, що надає
змогу напряму використовувати функції створення вікон. Для цих вікон (або
елементів керування) не потрібно реєструвати клас вікна, просто викликати,
наприклад, CreateWindow із заздалегідь визначеного класу.

57. Вкажіть призначення складових структури WND CLASSEX.


Структура WNDCLASSEX містить інформацію про клас вікна. Вона використовується
з функціями RegisterClassEx і GetClassInfoEx.
●cbSize Встановлює розмір цієї структури, в байтах.
●style Встановлює стиль класу. Цей член структури може бути будь-якою
комбінацією cталих класу.
●lpfnWndProc Покажчик на віконну процедуру. Ви повинні використовувати
функцію CallWindowProc, щоб викликати віконну процедуру.
●cbClsExtra Встановлює число додаткових байт, які розміщуються слідом за
структурою класу вікна. Система ініціалізує ці байти нулями.
●cbWndExtra Встановлює число додаткових байтів, які розміщуються слідом за
примірником вікна. Система ініціалізує байти нулями.
●hInstance Дескриптор примірника, який містить віконну процедуру для класу.
●hIcon Дескриптор значка класу. Цей член структури повинен бути дескриптором
ресурсу значка. Якщо цей член структури - ПУСТО (NULL), система надає заданий за
замовчуванням значок.
●hCursor Дескриптор курсору класу. Цей член структури повинен бути
дескриптором ресурсу курсору. Якщо цей член структури - ПУСТО (NULL), додаток
має явно встановлювати форму курсора щоразу, коли миша переміщується в вікно
прикладної програми.
●hbrBackground Дескриптор кисті фону класу. Цей член структури може бути
дескриптором фізичної кисті, яка використовується, щоб фарбувати кольором фону,
або це може бути кодом кольору.
●lpszMenuName Покажчик на символьний рядок з символом кінця рядка ( '\ 0')
(нуль-термінатором), яка встановлює ім'я ресурсу меню класу, яке як ім'я показується в
файлі ресурсу.
●lpszClassName Покажчик на символьний рядок з нулем в кінці або атом. Якщо
цей параметр - атом, це повинен бути атом класу, створений попереднім викликом
функції RegisterClass або RegisterClassEx.
●hIconSm Дескриптор маленького значка, який пов'язаний з класом вікна. Якщо
цей член структури - ПУСТО (NULL), система шукає ресурс значка, певний членом
структури hIcon для знака відповідного розміру, щоб використовувати як маленький
значок.

58. Опишіть параметри функції CreateWindowEx.


CreateWindowEx (
DWORD dwExStyle, // покращений стиль вікна
LPCTSTR lpClassName, // покажчик на зареєстроване ім'я класу
LPCTSTR lpWindowName, // покажчик на ім'я вікна
DWORD dwStyle, // стиль вікна
int x, // горизонтальна позиція вікна
int y, // вертикальна позиція вікна
int nWidth, // ширина вікна
int nHeight, // висота вікна
HWND hWndParent, // дескриптор батьківського або вікна власника
HMENU hMenu, // дескриптор меню або ID дочірнього вікна
HINSTANCE hInstance, // дескриптор екземпляра прикладної програми
LPVOID lpParam // покажчик на дані створення вікна

59. Вкажіть призначення функції GetMassage й DispatchMessage.


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

60. Вкажіть етапи створення тексту в Windows.


● Ініціалізувати структуру PAINTSTRUCT та RECT
● Зробити запит WM_PAINT, щоби повідомити систему, що частина вікна буде
зафарбована.
● Викликати процедуру BeginPaint, яка підготує задане вікно до фарбування і
заповнює структуру PAINTSTRUCT інформацією про фарбування.
● Викликати функцію GetClientRect, яка витягує координати робочої області
вікна, де буде проходити фарбування.
● Викликати функцію DrawText для малювання відформатованого тексту в
даному прямокутнику.
● І в самому кінці викликати функцію EndPaint, яка відзначає кінець фарбування в
заданому вікні.

61. Вкажіть призначення контексту пристрою.


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

62. Вкажіть одержання хэндл контексту пристрою.


Є три способи зробити це:
● call BeginPaint у відповідь на повідомлення WM_PAINT.
● call GetDC у відповідь на інші повідомлення.
Функція GetDC витягує дескриптор дисплейного контексту пристрою (DC) для робочої
області заданого вікна або для всього екрану.
HDC GetDC(
HWND hWnd // дескриптор вікна
);
● call CreateDC щоб створити власний контекст пристрою

63. Опишіть етапи обробки повідомлення WN_PAINT.


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

64. Вкажіть призначення змінних, що використовуються у секції


WN_PAINT.
HWND hwnd, // дескриптор вікна
UINT uMsg, // повідомлення WM_PAINT
WPARAM wParam, // не використовується
LPARAM lParam // не використовується
65. Опишіть параметри функції DrawText.
Функція DrawText малює відформатований текст в заданому прямокутнику.
DrawText (
● HDC hDC, // дескриптор контексту пристрою
● LPCTSTR lpString, // Покажчик на рядок, який встановлює текст для виведення.
● int nCount, // довжина тексту
● LPRECT lpRect, // Покажчик на структуру RECT, що містить прямокутник, в
якому текст, повинен бути відформатований.
● UINT uFormat // Визначає метод форматування тексту.

66. Вкажіть, що собою представляють макрозасоби у асемблері.

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


транслятор генерувати і / або модифікувати вихідний текст програми.

67. Вкажіть, як використовуються елементи макрозасобів в асемблері.

Елементи макросредств в асемблері часто використовуються неявно:


▪ директиви proc і local викликають підстановку в текст програми
послідовностей команд, що утворюють коди прологу і епілогу;
▪ директива uses викликає генерацію послідовностей команд push і
pop;
▪ в TASM у командах зрушень можна вказувати в якості другого
аргументу довільне число: shl ax, n, хоча процесор дозволяє
зрушувати або на один розряд, або поміщати довільну кількість
зсувів в регістр cl.

68. Вкажіть, що собою представляє макропроцесор у асемблері.

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


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

69. Вкажіть, на які групи поділяються макрозасоби.


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

70. Вкажіть, що собою представляють макрокоманди асемблера.


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

71. Опишіть визначення макрокоманд.


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

72. Вкажіть, що собою представляє виклик макрокоманд.


Макрос починається директивою MACRO і закінчується ENDM.

73. Вкажіть, що собою представляє розширення макрокоманди.


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

Для запобігання конфліктів, що пов’язані з багаторазовим використанням міток,


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

74. Вкажіть, що собою представляють аргументи макрокоманд у


асемблері.
У директиві macro може вказуватися список формальних аргументів, синтаксис якого
ілюструється наступною діаграмою
75. Вкажіть, що собою представляють макрооператори «&», «<>», «!».
Макрооператор & (амперсанд) потрібен для того, щоб параметр, переданий в якості
операнда макровизначення або блоку повторень, замінювався значенням до обробки
рядку ассемблером.
Іноді можна використовувати тільки один амперсанд ‒ на початку параметра, якщо не
виникає неоднозначностей.
Макрооператор <> (кутові дужки) діє так, що весь текст, укладений в ці дужки,
розглядається як текстовий рядок, навіть якщо він містить пробіли або інші розділові
знаки. Цей макрооператор використовується при передачі текстових рядків в якості
параметрів для макросів. Інше часте застосування кутових дужок - передача списку
параметрів вкладеному макровизначення або блоку повторень.
Макрооператор ! (Знак оклику) використовується аналогічно кутовим дужках, але діє
тільки на один наступний символ, так що, якщо цей символ - кома або кутова дужка, він
все одно буде переданий макросу як частина параметру.

76. Вкажіть, що собою представляють макрооператори «%», «;;».


Макрооператор % (відсоток) вказує, що знаходиться за ним текст є виразом і повинен
бути обчислений. Зазвичай це потрібно для того, щоб передавати як параметр в
макрос не саме вираз, а його результат.

Макрооператор ;; (Дві крапки з комою) початок макрокоментаря. На відміну від


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

78. Вкажіть, що собою представляє директива rept в асемблері.


Найпростіший блок повторень REPT (не підтримує WebAssembly) виконує асемблерну
компіляцію ділянки програми задану кількість раз.

79. Вкажіть, що собою представляють директиви IRP i IRPC.


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

80. Вкажіть, що собою представляють директиви EXITM, LOCAL i


PURGE.
Директива EXITM (не підтримується WASM) виконує передчасний вихід з
макровизначення або блоку повторень.

LOCAL мітка ... ‒ перераховує мітки, які будуть застосовуватись всередині


макровизначень, щоб не виникало помилки «мітка вже визначена» при використанні
макросу більше одного разу або якщо та ж мітка присутня в основному тексті програми
(в WASM директива LOCAL дозволяє використовувати макрос з мітками кілька раз, але
не дозволяє застосовувати мітку з тим же ім'ям в програмі). Операнд для LOCAL -
мітка або список міток, які будуть використовуватися в макросі.

PURGE імя_макроса - скасовує певний раніше макрос (не підтримує WASM). Ця


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

81. Вкажіть на які рівні поділяють проблеми оптимізації.


Проблему оптимізації прийнято ділити на три основних рівня:
1.Вибір найбільш оптимального алгоритму - «Високорівнева оптимізація».
2.Найбільш оптимальна реалізація алгоритму - «оптимізація середнього рівня».
3.Підрахунок тактів, витрачаються на виконання кожної команди, і оптимізація їх
порядку для конкретного процесора - «низькорівнева оптимізація».
82. Вкажіть, що собою представляє оптимізація перенесення перевірки
умови в кінець циклу.
Цикли типу WHILE або FOR, які так часто застосовуються в мовах високого рівня,
виявляються менш ефективними в порівнянні з циклами типу UNTIL через те, що в них
потрібно зайва команда переходу:
; цикл типу WHILE
mov si,counter ; число повторів
mov dx,start_i ; початкове значення
loop_start:
cmp dx,si ; поки dx < si виконати
jbn exit_loop
; [тіло цикла]
inc dx
jmp loop_start
; майже такий же цикл типу UNTIL
mov si,counter
mov dx,start_i loop_start: ; виконати
; [тіло цикла]
inc dx cmp dx,si ; пока dx < si
jb loop_start

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


задом наперед.
Цикли, в яких значення лічильника зростає від двійки, одиниці або нуля до деякої
константи, можна реалізувати взагалі без операції порівняння, виконуючи цикл в
зворотному напрямку. Справа в тому, що 7 команда DEC counter встановлює прапори
точно так же, як і команда СМР counter, 1, тобто наступна команда умовного переходу
буде обробляти результат порівняння лічильника з одиницею

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


Для невеликих циклів час виконання перевірки умови і переходу на початок циклу
може виявитися значним у порівнянні з часом виконання самого тілу циклу. Більш того,
на Pentium Pro / Pentium II цикл не в змозі виконувати менше, ніж за два такти
процесора, хоча його тіло може виконуватися навіть менше, ніж за такт. З цим легко
впоратися, взагалі не створюючи цикл, а просто повторивши його тіло потрібне число
раз (зрозуміло, тільки в разі, якщо нам заздалегідь відомо це число!). Для дуже
коротких циклів можна, наприклад, подвоювати або потроювати тіло циклу, якщо,
звичайно, число повторень кратно двом або трьом

85. Вкажіть загальні принципи низькорівневої оптимізації.


Перерахуємо основні рекомендації, яких потрібно дотримуватися при оптимальному
програмуванні для процесорів Intel. Основні рекомендації
• Використовуйте регістр ЕАХ всюди, де можливо. Команди з безпосереднім
операндом, з операндом - абсолютною адресою змінної і команди XCHG з регістрами
займають на один байт менше, якщо інший операнд - регістр ЕАХ.
• Використовуйте регістр DS всюди, де можливо. Префікси перевизначення сегмента
збільшують розмір програми на 1 байт і час на 1 такт.
• Якщо до змінної в пам'яті, що адресується зі зміщенням, виконується кілька звернень
- завантажте її в регістр.
• Не використовуйте складні команди - ENTER, LEAVE, LOOP, рядкові команди, якщо
аналогічну дію можна виконати невеликою послідовністю простих команд.
• Не використовуйте команду MOVZX для читання байта - це вимагає 4 тактів для
виконання
• Використовуйте TEST для порівняння з нулем або для інших перевірок рівності
• Використовуйте команду XOR, щоб обнуляти регістр (звичайно, якщо поточний стан
прапорів більше не знадобиться)
• Не використовуйте множення або ділення на константу - його можна замінити іншими
командами
• Як можна рідше завантажуйте сегментні регістри.
• Як можна менше перемикайте завдання - це дуже повільна процедура. Часто, якщо
треба зберігати стан процессу перемикання швидше організувати програмно.

86. Опишіть найбільш популярні UNIX системи.


Linux - безкоштовно розповсюджується операційна система, що сполучає в
собі особливості двох основних типів UNIX-систем, System V і BSD приблизно в рівній
мірі. У ній досить багато відмінностей і відступів від будь-яких стандартів, прийнятих
для UNIX, але вони більш ефективні.

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


представляє варіант BSD UNIX. Вважається найбільш стабільною з UNIX-систем для
Intel.

Solaris/x86 - комерційна операційна система компанії Sun Microsystems, що


представляє варіант System V UNIX, спочатку створена для комп'ютерів Sun, існує у
версії для Intel 80x86.

87. Вкажіть особливості програмування на Асемблері в UNIX


системах.
Незважаючи на те, що при програмуванні для UNIX зазвичай вживається виключно
мова С, користуватися асемблером в цих системах можна, і навіть вкрай просто.
Програми в UNIX виконуються в захищеному режимі з моделлю пам'яті flat і можуть
викликати будь-які функції з бібліотеки libc або інших бібліотек точно так же, як це
роблять програми на С. Звичайно, множина задач, для яких має зміст використовувати
асемблер в UNIX, обмежений.
Якщо ви не займаєтеся розробкою ядра операційної системи або, наприклад,
емулятора DOS, практично все можна зробити і на С, але іноді бувають ситуації, коли
потрібно щось особливе. Написати процедуру, яка виконує щось якомога швидше
(наприклад, відтворення звуку з файлу в форматі МР3), або програму, яка
використовує пам'ять більш ефективно (хоча це часто можна повторити на С), або
програму, яка використовує можливості нового процесора, підтримка якого ще не
додана в компілятор (якщо ви знаєте асемблер для UNIX), досить просто.
88. Вкажіть, що собою представляє синтаксис AT&T.
Проблема в тому, що асемблер для UNIX кардинально відрізняється. У той час
як основні асемблери для MS-DOS і Windows використовують синтаксис,
запропонований компанією Intel, багатий і неоднозначний, частина яких вирішується за
рахунок використання пояснювальних операторів типу byte ptr, word ptr або dword ptr, а
частина не вирішується взагалі (всі ті випадки, коли доводиться вказувати код команди
вручну), в UNIX з самого початку використовується варіант універсального синтаксису
AT&T, синтаксис SysV/386, який спеціально створювався з метою усунення
неоднозначностей в тлумаченні команд. Взагалі кажучи, існує і асемблер для DOS /
Windows, який використовує АТ&Т-синтаксис - це gas, що входить в набір засобів
розробки DJGPP, а також є асемблер, який використовує Intel-синтаксис і здатний
створювати об'єктні файли в форматі ELF, що застосовується в більшості UNIX-
систем, що безкоштовно розповсюджуваний в мережі Inetrnet асемблер NASM. Ми
будемо розглядати тільки асемблери, які безпосередньо входять до складу
операційних систем, тобто асемблери, які викликаються стандартної командою as.

89. Вкажіть, які допустимі символи тексту програми Асемблер AT&T.


- «%» (відсоток)
- «$» (долар)
- «*» (зірочка)
- «.» (Крапка),
- «,» (кома)
- «_» (підкреслення)

90. Вкажіть, що означають спеціальні символи «%», «$», «.», «*» в


Асемблері AT&T.
- «%» (відсоток) - назва регістра процесора
- «$» (долар) - якщо послідовність символів починається зі знаку
долара - це безпосередній операнд.
- «*» (зірочка) - якщо послідовність символів починається з зірочки -
це абсолютна адреса (для команд jmp i call), інакше - відносна.
- «.» (Крапка), - якщо послідовність символів починається з крапки -
це директива Асемблера. В іншому випадку крапка завжди
дорівнює поточній адресі.

91. Опишіть поняття мітки в Асемблері AT&T.


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

eternal_loop: jmp eternal_loop

variable: .byte 7

92. Опишіть суфікси, що відображають розмір операндів в Асемблері


AT&amp;T.

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


операндів:

b - байт;

w - слово;

l - подвійне слово;

q - четверне слово;

s - 32-бітове число з плаваючою комою;

l - 64-бітове число з плаваючою комою;

t - 80-бітове число з плаваючою комою.

// Mov byte ptr variable, 0


movb $ 0, variable // Fild qword ptr variable

fildq variable

93. Опишіть команди, що охоплюють операнди різних розмірів та


перетворення типів в Асемблері AT&T.
Команди, що охоплюють операнди різних розмірів, вимагають вказівки двох суфіксів,

спочатку суфікса джерела, а потім приймача: // Movsx edx, al

movsbl% al,% edx

Команди перетворення типів мають в AT&T назви з чотирьох букв - З, розмір джерела,
Ті

розмір приймача:

// cbw cbtw

// cwde cwtl

// cwd cwtl

// cdq cltd

94. Опишіть команди передачі управління і команди, що мають


декілька операндів в Асемблері AT&T.
Дальні команди передачі управління (jmp, call, ret) відрізняються від ближніх префіксом l: //
Call far 0007: 00000000

lcall $ 7, $ 0

10

// Retf 10

lret $ 10
Якщо команда має декілька операндів, операнд-джерело завжди записується першим, а
приймач - останнім, тобто в точності навпаки в порівнянні з Intel-синтаксисом:

// Mov ax, bx

movw% bx,% ax

// Imul eax.ecx, 16

imull $ 16,% ecx,% eax

95. Опишіть імена префіксів заміни сегмента та зміни розрядності


адреси і операнда в Асемблері AT&T.
Всі префікси мають імена, якими вони задаються як звичайні команди, - перед командою, для
якої даний префікс призначений. Імена префіксів заміни сегмента - segcs, segds, segss, segfs,
seggs, імена префіксів зміни розрядності адреси і операнда - addr16 і data 16:

segfs

11

movl variable,% eax

rep

stosd

Крім того, префікс заміни сегмента буде включений автоматично, якщо використовується
оператор «:» в контексті операнда:

movl% fs: variable,% eax

96. Вкажіть поняття адресації в Асемблері AT&T.


Регістровий операнд завжди починається з символу "%":
// Xor edx, edx

xorl% eax,% eax

Безпосередній операнд завжди починається з символу «$»:

// Mov edx, offset variable

12

movl $ variable,% edx

Непряма адресація використовує не модифіковані ім'я змінної:

// Push dword ptr variable

pushl variable

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


способу - по базі з індексуванням, і зрушенням:

// Mov eax, base_addr [ebx + edi * 4] (найбільш загальний випадок)

movl base_addr (% ebx,% edi, 4),% Еах

// Lea eax, [eax + eax * 4]

leal (% Еах,% Еах, 4),% Еах // Mov ax, word ptr [bp-2]

movw -2 (% ebp),% ax

13
// Mov edx, dword ptr [edi * 2]

movl (,% edi, 2),% edx

97. Опишіть оператори в Асемблері AT&T.


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

// Помістити в Еах число 320 * 200

movl $ 320 * $ 200,% Еах

У цих виразах зустрічаються такі оператори.

14

1. Префіксні, або унарні оператори:

- (Мінус) - негативне число ~ (Тильда) - «логічне НЕ»

2. Інфіксний, або бінарні оператори

Вищого пріоритету:

* - Множення

/ - Цілочисельне ділення % - Залишок

<Або << - зрушення вліво > Або >> - зсув вправо Середнього пріоритету:

15

| - Побітовое «АБО»

& - Побітовое «І»


^ - Побітовое «виключає АБО»

! - Побітовое «АБО-НЕ» (логічна імплікація) Нижчого пріоритету:

+ - Додавання

- - Віднімання

98. Вкажіть, що собою представляють директиви визначення даних в


Асемблері AT&T.
Ці директиви еквівалентні директивам db, dw, dd, df і т.д., що застосовуються в
асемблерах для DOS / Windows. Основна відмінність тут полягає в тому, щоб дати ім'я змінної,
значення якої визначається такою директивою; в асемблерах для UNIX обов'язково треба
ставити повноцінну мітку, що закінчується двокрапкою.

байти:

.byte вираз ...

слова:

.word вираз ... або .hword вираз ... або .short вираз ...

Подвійні слова:

.int вираз ... або .long вираз ...

Четверні слова (8-байтниє змінні):

.quad вираз ...

16-байтниє змінні (октановим слова):

. octa вираз ...

32-бітові числа з плаваючою комою:

.float число ... або .single число ... 64-бітові числа з плаваючою комою:

.double число ...

80-бітові числа з плаваючою комою:


.tfloat число ... Рядки байтів:

.ascii рядок ...

Рядки байтів з автоматично додаються нульовим символом в кінці:

.asciz рядок ... або .string рядок Блоки повторюваних даних:

.skip розмір, значення або .space розмір, значення

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

.fill повтор, розмір, значення

Заповнює область пам'яті значеннями заданого розміру (0 - 8 байт) вказане число раз. За

замовчуванням розмір приймається рівним 1, а значення - 0. Не ініціалізовані змінні:

.lcomm символ, довжина, вирівнювання

Зарезервувати вказане число байт для локального символу в секції .bss.

99. Вкажіть, що собою представляють директиви управління


символами в Асемблері AT&T.
Присвоєння значень символам: .equ символ, вираз

Присвоює символу значення виразу. .equiv символ, вираз

Те ж, що і .equ, але видає повідомлення про помилку, якщо символ визначено.

.set символ, вираз

Те ж, що і .equ, але можна робити кілька разів. Зазвичай, втім, буває зручніше написати просто
«символ = вираз».

Управління зовнішніми символами: .globl символ або .global символ

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

.extern символ
Директива .extern зазвичай ігнорується - все невизначені символи вважаються зовнішніми.

.comm символ, довжина, вирівнювання

Директива еквівалентна .lcomm, але, якщо символ з таким ім'ям визначено за допомогою

.lcomm в іншому модулі, буде використовуватися зовнішній символ.

Опис налагоджувальних символів:

.def символ .endef

100. Вкажіть, що собою представляють директиви визначення секцій


в Асемблері AT&T.
Текст програми ділиться на секції - коду, даних, неініціалізованих даних, налагоджувальних
символів і т.д. Секції також можуть ділитися далі на підсекції, розташовані безпосередньо
один за одним, але це рідко використовується.

.data підсекція

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

.text підсекція

Наступні команди будуть записані в секцію коду.

.section ім'я, прапори, @ тип або .section "ім'я", прапори

Загальне визначення нової секції:

прапори (для ELF):

w або #write - дозволений запис;

х або #execinstr - дозволено виконання;

а чи #alloc - дозволено динамічне виділення пам'яті (.bss); тип (для ELF):

© progbits - містить дані;

@nobits - не містить дані (тільки займає місце).

101. Вкажіть, що собою представляють директиви управління


розрядністю в Асемблері AT&T.
.code16

Наступні команди будуть відображені як 16-бітові.


.code32

Скасовує дію .code 16.

102. Вкажіть, що собою представляють директиви управління


програмним покажчиком в Асемблері AT&T.
.align вираз, вираз, вираз

Виконує вирівнювання програмного покажчика до кордону, зазначеної першим операндом.

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

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

.org нове значення, заповнення

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

байти заповнюються зазначеними значеннями (за замовчуванням - нулями).

103. Вкажіть, що собою представляють директиви управління


лістингом в Асемблері AT&T.
Заборонити лістинг: .nolist

Дозволити лістинг: .list

Кінець сторінки: .eject

Розмір сторінки (60 рядків, 200 стовпців за умовчанням): .psize рядки, стовпці

Тема лістингу: .title текст

підзаголовок: .sbttl текст


104. Вкажіть, що собою представляють директиви управління
асемблером в синтаксисі AT&T.
Директива proc дозволяє явно задавати вид виклику і змушує транслятор
генерувати замість команди ret відповідний код повернення.
директиви proc викликає підстановку в текст програми послідовностей команд, що
утворюють коди прологу і епілогу;
proc дає ще ряд можливостей, наприклад є можливість задавати вид виклику шляхом
зазначення моделі пам'яті за допомогою директиви model, одним з аргументів якої є
покажчик моделі пам'яті

(Теж саме)

105. Вкажіть, що собою представляють директиви блоків повторень в


Асемблері AT&T.
Директива IRPC (FORC в WASM) описує блок, який виконується
стільки разів, скільки символів містить зазначений рядок, і при кожному
повторенні буде визначена мітка з ім'ям параметру, що дорівнює черговому
символу з рядка. Якщо рядок містить пробіл або інші символи, відмінні від
дозволених для міток, він повинен бути укладений в кутові дужки.
Наприклад, наступний блок задає рядок в пам'яті, маючи в своєму
розпорядженні після кожного символу рядка атрибут 0Fh (білий символ на
чорному), так що цей рядок згодом можна буде скопіювати прямо в
відеопам'ять.

106. Вкажіть, що собою представляють макровизначення в Асемблері


AT&T.
Макровизначення (або макросом) називається ділянку програми, якому
присвоєно ім'я і який компілюється асемблером щоразу, коли асемблер
зустрічає це ім'я в тексті програми. Макрос починається директивою
MACRO і закінчується ENDM.

(Теж саме)

107. Вкажіть характеристики повідомлень, що надсилаються від


клавіатури.
●Windows відправить повідомлення WM_KEYDOWN активному вікну,
повідомляючи про натискання клавіші.
●При відпускання клавіші, Windows відправить повідомлення WM_KEYUP.
Тоді, Windows відправляє повідомлення WM_KEYDOWN або WM_KEYUP
вікну, у якому є фокус введення, і ці повідомлення будуть трансльовані в повідомлення
WM_CHAR функцією TranslateMessage.

108. Вкажіть характеристику WPARAM процедури.


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

109. Опишіть синтаксис функції WM_PAINT.


Повідомлення WM_PAINT відправляється тоді, коли система або інше додаток
робить запрошення, щоб замалювати частину вікна додатків.
LRESULT CALLBACK WindowProc (
HWND hwnd, // дескриптор вікна
UINT uMsg, // WM_PAINT
WPARAM wParam, // не використовується
LPARAM lParam // не використовується
);

110. Вкажіть характеристику повідомлень для кнопок миші.


Є два повідомлення для кожної із кнопок миші: WM_LBUTTONDOWN,
WM_RBUTTONDOWN й WM_LBUTTONUP, WM_RBUTTONUP.
Вікно може отримувати повідомлення про подвійних натисканнях,
WM_LBUTTONDBCLK або WM_RBUTTONDBCLK, тоді й тільки тоді, коли вікно має
атрибут CS_DBLCLKS, інакше ж воно буде отримувати тільки серію повідомлень про
одинарні натискання.

111. Опишіть роботу з координатами в Асемблері.


У всіх цих повідомленнях значення lParam містить позицію миші. Нижнє слово -
це x-координата, верхнє слово - y-координата верхнього лівого кута клієнтської області
вікна. wParam містить інформацію про стан кнопок миші, Shift'а й Ctrl'а.

112. Опишіть поняття відрисовуючого коду в секції WM_PAINT.


Відpисовуючий код у секції WM_PAINT повинен перевірити, чи встановлений
прапор MouseClick в TRUE, тому що коли вікно створюється, пpоцедуpа вікна одержує
повідомлення WM_PAINT у той час, коли не було зроблено ще жодного натискання,
тобто рядок відpисувати не можна. Ми ініціалізуємо MouseClick в FALSE і міняємо її
значення в TRUE, коли випадає натискання на мишу. Якщо хоча б одне натискання на
мишу випало, вона рисує рядок у клієнтській області в позиції, де була миша пpи
натисканні.

113. Вкажіть визначення меню і його основні складові.


Меню - це один з найважливіших компонентів вашого вікна. Меню є списком
всіх можливостей, які пpогpама надає користувачеві. Меню - це інструмент для того,
щоб дати користувачеві «швидкий старт»,
Перші два пункти меню, як правило це – "File" й "Edit", а останній "Help". Ви
можете вставити ваш власний пункти між "Edit" й "Help".
114. Охарактеризуйте складові списку меню.
Список меню містить у собі визначення 'MENUITEM' або 'POPUP'. 'MENUITEM'
визначає пункт меню, який не є підменю. Його синтаксис наступний: MENUITEM
"&text", ID [,options]

115. Опишіть опції ID пункту меню.


ID - це номер, який буде використовуватися для позначення пункту меню в
повідомленні, що посилає процедурі вікна, коли цей пункт меню буде вибраний.
Кожний ID повинен бути унікальним. Доступні наступні опції:
● GRAYED - пункт меню неактивний, і він не генерує повідомлення
● WM_COMMAND. Текст сірого кольору.
● INACTIVE - пункт меню неактивний, і він не генерує повідомлення
● WM_COMMAND. Текст відображається нормально.
● MENUBREAK - цей пункт меню й наступні пункти відображаються
● після нової лінії меню.
● HELP - цей пункт меню й наступні пункти притуляються до правої
● сторони.

116. Наведіть прийоми посилання на скрипт ресурсу меню в програмі


й різниця між ними.
● У lpszMenuName стpуктуpи WNDCLASSEX. Якщо було меню за
назвою "FirstMenu", можна приєднати меню до вікна наступним чином:
.DATA
MenuName db "FirstMenu",0
.CODE
mov wc.lpszMenuName, OFFSET MenuName
● За допомогою паpаметpу-хендла меню у функції CreateWindowEx:
.DATA
MenuName db "FirstMenu",0
hMenu HMENU ?
invoke CreateWindowEx,NULL,OFFSET ClsName,\
OFFSET Caption, WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,\
NULL,\
hMenu,\
hInst,\
NULL\
Різниця між двома методами у тому, що коли робиться посилання на
меню в стpуктуpі WNDCLASSEX, меню стає меню за замовчуванням для
даного класу вікна. Кожне вікно цього класу буде мати таке меню.
117. Опишіть використання файлу ресурсів при створенні меню.
#define IDM_TEST 1
#define IDM_HELLO 2
#define IDM_GOODBYE 3
#define IDM_EXIT 4
Лінії, що описані вище визначають ID пунктів меню. Можна надавати ID будь-
яке значення, головне, щоб воно було унікальним.
FirstMenu MENU
{
POPUP "&PopUp"
{
MENUITEM "&Say Hello",IDM_HELLO
MENUITEM "Say &GoodBye", IDM_GOODBYE
MENUITEM SEPARATOR
MENUITEM "E&xit",IDM_EXIT
}
MENUITEM "&Test", IDM_TEST
}
5. Вкажіть, що собою представляє низькорівневе програмування.
Низькорівневе програмування - це програмування, засноване на прямому
використанні можливостей та особливостей конкретної обчислювальної системи.

8. Вкажіть, які типи даних апаратно підтримує мікропроцесор.


1) Байт.
2) Слово = 2 байти = 16 біт.
3) Подвійне слово = 2 слова = 4 байти = 32 біта.
4) Вчетверо збільшене слово = 2 подвійні слова = 4 слова = 8 байт = 64
біта.
5) Подвійне вчетверо збільшене слово = 2 вчетверо збільшені слова = 4
подвійні слова =8 слів = 16 байт = 128 бітів..
11. Дайте визначення мови програмування асемблер та її коротку характеристику.
Асемблер (від англ. Assemble - збирати) - компілятор з мови асемблера в команди
машинної мови.
Зараз розробка програм на асемблері застосовується в основному в програмуванні
невеликих мікропроцесорних систем (мікроконтролерів), як правило, що вбудовуються
в яке-небудь устаткування.
Мова асемблера - тип мови програмування низького рівня. Команди мови асемблера
один в один відповідають командам процесора і представляють собою зручну
символьну форму запису (мнемокод) команд і аргументів. Мова асемблера забезпечує
зв'язування частин програми і даних через мітки, що виконується при асемблюванні
(для кожної мітки вираховується адресу, після чого кожне входження мітки замінюється
на цю адресу).
13. Вкажіть переваги мов асемблера.
1. Максимально оптимальне використання ресурсу процесора, використання меншої
кількості команд та звернень в пам'ять і, як наслідок, велика швидкість і менший розмір
програми.
2. Використання розширених наборів інструкцій процесора (MMX, SSE, SSE2, SSE3).
3. Доступ до портів вводу-виводу і особливим регістрам процесора (у більшості ОС ця
можливість доступна тільки на рівні модулів ядра і драйверів)
4. Можливість використання самомодифікуючого (у тому числі переміщуваного) коду
(під багатьма платформами вона недоступна, так як запис в сторінки коду заборонена,
в тому числі і апаратно, проте в більшості загальнодоступних систем через їх вроджені
вади є можливість виконання коду, що міститься в сегменті (секції) даних, куди запис
дозволена).
5. Максимальна адаптація для потрібної платформи. Однак слід зазначити, що останні
технології безпеки, впроваджувані в операційні системи та компілятори, не дозволяють
робити самомодифікуючого коду, так як виключають одночасну можливість виконання
програми і запис в одній і тій ж ділянці пам'яті (технологія WAX). Технологія
використовується в OpenBSD, в інших BSD-системах, в Linux. У Microsoft Windows
(починаючи з Windows XP SP2) застосовується схожа технологія DEP
14. Вкажіть недоліки мов асемблера.
1. Великі обсяги коду, велике число додаткових дрібних задач, менша кількість
доступних для використання бібліотек, порівнюючи з мовами високого рівня.
2. Трудомісткість читання та пошуку помилок (хоча тут багато що залежить від
коментарів і стилю програмування).
3. Часто компілятор мови високого рівня, завдяки сучасним алгоритмам оптимізації,
дає більш ефективну програму (по критерію якість / час розробки).
4. Непереносимість на інші платформи (крім сумісних).
5. Асемблер складніший для спільних проектів.

19. Охарактеризуйте оператори: арифметичні,


оператори зсуву та порівняння.
арифметичні:

ADD - підсумовує два операнди, поміщаючи результат в перший операнд


(одержувач).

SUB - віднімає один операнд (джерело) з іншого (отримувач). Різниця


заміщає місце одержувача.
INC - збільшує операнд на 1, що не впливаючи на прапорець переносу
DEC - зменшує операнд на 1, що не впливаючи на прапорець переносу

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

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

DIV - здійснює розподіл цілих беззнакових чисел.

IDIV - аналогічна команді DIV, але працює зі знаковими числами.


NEG - змінює знак операнда, що знаходиться в регістрі або пам'яті.
СМР - аналогічна команді SUB, але не зберігає результат. Команда
порівнює два числа для подальшого умовного переходу.
ADC - діє як команда ADD, але додає значення переносу до суми.
SBB - діє як команда SUB, але віднімає з різниці значення переносу

Оператори зсуву:

1. Логічний зсув вправо

Логічний зсув завжди виконується без урахування знакового біта. Для

логічного зсуву вправо призначена команда SHR. У цій команди два


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

Цим операндом може бути або безпосереднє значення, або регістр CL.
Схема виконання операції:

Всі біти операнда зсуваються вправо (від старших бітів до молодших).


Висунутий біт стає значенням прапора CF. Старший біт отримує нульове
значення. Ця операція повторюється кілька разів, якщо другий операнд
більше одиниці. Логічний зсув вправо можна використовувати для поділу
цілих чисел без знака за модулем 2, причому зсув працює швидше, ніж
команда ділення DIV. Приклад:

shr ax, 1; Логічний зсув AX на 1 біт вправо

shr byte [bx], cl; Лог. зсув байта за адресою BX на СL біт вправо shr cl, 4;
CL = CL / 16 (для числа без знака)

2. Арифметичний зсув вправо

Арифметичний зсув відрізняється від логічного тим, що він не змінює зсув


старшого біта, і призначений для чисел зі знаком. Арифметичний зсув
вправо виконується командою SAR. У цій команді теж 2 операнда,
аналогічно команді SHR. Схема виконання операції показана на малюнку:

Висунутий біт стає значенням прапора CF. Знаковий біт не змінюється.


При зсуві на 1 біт скидається прапор СF. Цю команду можна
використовувати для поділу цілих чисел зі знаком на 2 (зверніть увагу, що
«округлення» завжди
в сторону меншого числа, тому для від’ємних чисел результат буде
відрізнятися від результату ділення за допомогою команди IDIV).
Приклад:

sar bx, 1; sar di, cl; sar [x], 3;

Арифметичний зсув BX на 1 біт вправо Арифметичний зсув DI на CL біт


вправо x = x / 8 (x - 8-бітове значення зі знаком)

3. Логічний і арифметичний зсув вліво

Логічний зсув вліво виконується командою SHL, а арифметичний -


командою SAL. Однак, насправді це просто синоніми для однієї і тієї ж
машинної команди. Зсув вліво однаковий для чисел зі знаком і чисел без
знака (аналогічно командам SHR і SAR). Схема цієї операції показана на
малюнку:

Старший біт стає значенням прапора CF, а молодший отримує нульове


значення. За допомогою зсуву вліво можна швидко множити числа по
модулю 2. Якщо при зсуві на 1 біт змінюється значення старшого біта, то
встановлюється прапор СF. Приклад використання команди:

shl dx, 1;

sal dx, 1;

shl ax, cl;

sal[x],2; x=x*4

Зсув DX на 1 біт вліво Те ж саме

Зсув AX на CL біт вліво

4. Зсув подвійної точності

Існують ще дві команди, які здійснюють більш складний зсув. SHRD -


зсув подвійний точності вправо, SHLD - зсув подвійний точності вліво. У
цих команд 3 операнда. Перший операнд - зсуває значення і місце для
запису результату, повинен мати розмір 16 біт. Другий операнд - джерело
зсув бітів, теж повинен мати розмір 16 біт і знаходиться в одному з
регістрів. Значення другого операнда не змінюється. Третій операнд -
лічильник зсуву, може бути безпосереднім значенням або перебувати в
регістрі CL.

Призначення операторів порівняння наведено в таблиці


оператор Умова

eq ==

ne! =

lt <

le <=

gt >

ge > =

20. Охарактеризуйте оператори: логічний,


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

L1 equ 10010011

...

mov al, L1

xor al, 01h; al = 10010010

Індексний оператор []. Транслятор сприймає наявність квадратних


дужок як вказівку скласти значення виразу за [] зі значенням вирази,
укладеними в дужки. наприклад,

mov eax, mas [esi]; eax = * (mas + (esi))

Оператор перевизначення типу ptr застосовується для


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

Тип Пояснення Призначення

byte 1 байт змінна

word 2 байта змінна

dword 4 байта змінна


qword 8 байт змінна

tword 10 байт змінна

near ближній покажчик функція

far далекий покажчик функція

оператор PTR використовується для визначення посилання на


пам'ять з певним типом.

Оператор перевизначення сегмента: (двокрапка) обчислює


фізичну адресу щодо конкретно заданої сегментної складової, в якості
якої можуть виступати:

ім'я сегментного регістра,

ім'я сегмента з відповідної директиви SEGMENT

ім'я групи.

Для вибірки на виконання чергової команди мікропроцесор аналізує


вміст сегментного регістра CS, в якому міститься фізичну адресу початку
сегмента коду. Для отримання адреси конкретної команди мікропроцесор
складає промасштабірованное (помножене на 16) значення сегментного
регістра CS з вмістом регістра EIP. Запис CS: EIP містить адресу поточної
виконуваної команди. Аналогічно обробляються операнди в машинних
командах.

21. Охарактеризуйте оператори: типу


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

Оператор одержання сегментної складової адреси вираження seg


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

22. Опишіть пріоритетність виконання


операторів.
Як і в мовах високого рівня, виконання операторів асемблера при
обчисленні виразів здійснюється відповідно до їх пріоритетів Операції з
однаковими пріоритетами виконуються послідовно зліва направо.
Зміна порядку виконання можливо шляхом розстановки круглих
дужок, які мають найвищий пріоритет.
23. Охарактеризуйте регістри загального призначення у процесорі сімейства х86..
Регістрів загального призначення всього вісім. Розглянемо 32-бітні регістри. Імена
повних 32-бітових регістрів починаються з літери Е (Extended - розширений): ЕАХ, ЕВХ,
ЕСХ, EDX, EBP, ESI, EDI і ESP. Молодші 16 біт кожного з цих регістрів: АХ, ВХ, СХ, DX,
BP, SI, DI і SP.
● AX (Accumulator register) акумулятор часто використовується для зберігання
результату дій, виконуваних над двома операндами (застосовується в
десятковій арифметиці);
● BX (Base register) регістр-база застосовується для зберігання базової адреси
деякого об'єкта в пам'яті;
● CX (Count register) регістр-лічильник застосовується в командах, деякі
повторювані дії (лічильник в циклах і рядкових операціях).
● DX (Data register) регістр-даних зберігає дані для декількох операцій; в цих
випадках отримує старшу частину результату, якщо він не вміщується в
акумулятор.
Крім цього, окремі байти в 16-бітових регістрах AX - DX теж мають свої імена та можуть
використовуватися як 8-бітні регістри. Старші байти цих регістрів називаються AH, BH,
CH, DH, а молодші - AL, BL, CL, DL.
Інші чотири регістри загального призначення (використовуються як вказівні):
● ESP (Stack Pointer register) – містить покажчик на вершину стека в поточному
сегменті стека;
● EBP (Base Pointer register) – покажчик бази, може містить базу області даних,
призначений для організації довільного доступу до даних всередині стека;
● ESI (Source Index register) індекс джерела - застосовується для адресації зсуву,
в ланцюжкових операціях містить поточну адресу елемента в ланцюжку-джерелі
● EDI (Destination Index register) індекс приймача (одержувача) – застосовується
для адресації зсуву, містить поточну адресу в ланцюжку-приймачі.

1. Команди передачі даних - команди цієї групи пересилають дані з одного місця
комп'ютера в інше: між регістрами, між регістрами і пам'яттю, між регістром або
пам'яттю і стеком.
2. Арифметичні команди - ці команди застосовуються для виконання арифметичних
операцій над знаковими або без знаковими числами.
3. Команди перетворення даних - команди цієї групи застосовуються для
перетворення типів даних. Більшість з них працює зі знаковими числами, а одна
придатна і для беззнакових чисел.
4. Логічні команди - команди цієї групи застосовуються для виконання булевих
операцій і забезпечують роботу з двійковими полями в байтах, словах і подвійних
словах.

You might also like