You are on page 1of 52

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

Області застосування з 1960 років:


- Обробка ділової інформації
- Наукові дослідження
- Системна область
- Штучний інтелект
2. Вкажіть основні сучасні мови програмування та їх області застосувань.
● C++, Java, COBOL, spreadsheet - Обробка ділової інформації
● FORTRAN, C, C++, Java - Наукові дослідження
● C, C++, Java - Системна область
● LISP, Prolog - Штучний інтелект
● TeX, Postscript, текстовые процессоры - Видавнича діяльність
● UNIX, shell, TCL, Perl, JavaScript - Створення процесів
● ML, Smalltalk - Нові парадигми
3. Вкажіть та охарактеризуйте види стандартів мов програмування.
Як і в будь-якій області, питання стандартизації стосовно до мов програмування мають
величезне значення. Стандарти зазвичай бувають двох видів:
1. Приватний стандарт.
Сюди входять визначення, зроблені тією компанією, яка розробила мову і має
на нього авторські права. У більшості випадків для популярних і широко
використовуваних мов такі стандарти не працюють, оскільки в цих випадках часто
з’являються нові реалізації, удосконалені і несумісні.
2. Погоджувальний стандарт.
До нього відносяться створені спеціальними організаціями документи, засновані
на угоді всіх зацікавлених учасників. Погоджувальний стандарт є основним способом
забезпечення однаковості різних реалізацій мови. Наприклад: ANSI, ISO.
4. Охарактеризуйте аспекти стандартизації мов програмування.
Щоб використовувати стандарт ефективно, слід розглянути три аспекти стандартизації.
1. Своєчасність, тобто слід створювати стандарт мови не надто рано, щоб
накопичилося достатньо досвіду в його застосуванні, але і не занадто пізно, щоб не
заохочувати створення несумісних реалізацій.
2. Відповідність. Програма вважається відповідною стандарту, якщо вона
використовує тільки ті можливості, які визначені даним стандартом. Компілятор є
відповідним стандартом, коли після компіляції відповідного стандарту програми при її
виконанні виходить правильний результат.
3. Застарівання. Процес стандартизації передбачає можливість оновлення.
Кожен стандарт має переглядатися раз на п’ять років і або оновлюватися, або зовсім
скасовуватися.
5. Вкажіть, що собою представляє низькорівневе програмування.
Низькорівневе програмування - це програмування, засноване на прямому
використанні можливостей та особливостей конкретної обчислювальної системи.
6. Зобразіть схему програмної моделі процесора.

-
7. Вкажіть та охарактеризуйте різновидності низькорівневих мов програмування.
В історії розвитку програмування існували три різновидності низькорівневих
мов, послідовно змінили один одного:
• машинний код;
• мнемокод;
• асемблер.
У машинних кодах програма представляється у вигляді послідовності чисел, що
є кодами команд процесора, адресами оперативної пам’яті, номерами регістрів
процесора і зовнішніх пристроїв і т. д.
Мнемокоди замість чисел дозволяли використовувати мнемонічні (символьні)
імена, відображаючі сенс виконуваної команди.
Асемблер відрізняється від свого попередника - мнемокода великим набором
директив транслятора, що істотно спрощують процес кодування програми, в першу
чергу директивами оформлення програми у вигляді логічно закінчених елементів і
макрозасобів.
8. Вкажіть, які типи даних апаратно підтримує мікропроцесор.
1) Байт.
2) Слово = 2 байти = 16 біт.
3) Подвійне слово = 2 слова = 4 байти = 32 біта.
4) Вчетверо збільшене слово = 2 подвійні слова = 4 слова = 8 байт = 64
біта.
5) Подвійне вчетверо збільшене слово = 2 вчетверо збільшені слова = 4
подвійні слова =8 слів = 16 байт = 128 бітів.
9. Вкажіть, що собою представляє шістнадцяткова система числення.
Головна незручність двійковій системи числення - це розміри чисел, з якими
доводиться звертатися. На практиці з двійковими числами працюють, тільки якщо
необхідно стежити за значеннями окремих біт, а коли розміри змінних перевищують
хоча б чотири біта, використовується шістнадцяткова система. Ця система хороша
тим, що вона більш компактна, компактніше десяткової, і тим, що переклад в
двійкову систему і назад відбувається дуже легко. У шістнадцятковій системі
використовується 16 «цифр»: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, А, В, С, D, E, F, і номер позиції
цифри в числі відповідає ступеню, в яку треба звести число 16, так що:
96h = 9 * 16 + 6 = 150
Перевід в двійкову систему і назад здійснюється вкрай просто - замість кожної
шістнадцяткової цифри підставляють відповідне чотиризначне двійкове число:
9h = 1001b, 6h = 0110b, 96h = 10010110b
У асемблерних програмах при записі чисел, що починаються з А, В, С, D, E, F, на
початку приписується цифра 0, щоб не можна було сплутати таке число з назвою
змінної або іншим ідентифікатором. Після шістнадцяткових чисел ставиться буква «h».

10. Опишіть логічні операції над бітами.


AND – логічне «і»
XOR – виключення «або»
OR – логічне «або»
NOT – заперечення
Всі ці операції побітові, тому, щоб виконати логічну операцію над числом, треба
перевести його в двійковий формат і виконати операцію над кожним бітом.
11.Дайте визначення мови програмування асемблер та її коротку характеристику.
Асемблер (від англ. Assemble - збирати) - компілятор з мови асемблера в команди
машинної мови.
Зараз розробка програм на асемблері застосовується в основному в програмуванні
невеликих мікропроцесорних систем (мікроконтролерів), як правило, що вбудовуються
в яке-небудь устаткування.
Мова асемблера - тип мови програмування низького рівня. Команди мови асемблера
один в один відповідають командам процесора і представляють собою зручну
символьну форму запису (мнемокод) команд і аргументів. Мова асемблера забезпечує
зв'язування частин програми і даних через мітки, що виконується при асемблюванні
(для кожної мітки вираховується адресу, після чого кожне входження мітки замінюється
на цю адресу).

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


1. Вставка фрагментів на мові асемблера в текст програми (спеціальних директивами
мови) або написання процедур на мові асемблера. Спосіб хороший для нескладних
перетворень даних, але повноцінного асемблерного коду з даними і підпрограмами,
включаючи підпрограми з безліччю входів і виходів, які не підтримуються
високорівневими мовами, за допомогою нього зробити не можна.
2. Модульна компіляція. Більшість сучасних компіляторів працюють в два етапи. На
першому етапі кожен файл програми компілюється в об'єктний модуль. А на другому
об'єктні модулі лінкуются (зв’язуються) в готову програму. Принадність модульної
компіляції полягає в тому, що кожен об'єктний модуль майбутньої програми може бути
повноцінно написаний на своїй мові програмування і скомпільований своїм
компілятором (асемблером).
13. Вкажіть переваги мов асемблера.
1. Максимально оптимальне використання ресурсу процесора, використання меншої
кількості команд та звернень в пам'ять і, як наслідок, велика швидкість і менший розмір
програми.
2. Використання розширених наборів інструкцій процесора (MMX, SSE, SSE2, SSE3).
3. Доступ до портів вводу-виводу і особливим регістрам процесора (у більшості ОС ця
можливість доступна тільки на рівні модулів ядра і драйверів)
4. Можливість використання самомодифікуючого (у тому числі переміщуваного) коду
(під багатьма платформами вона недоступна, так як запис в сторінки коду заборонена,
в тому числі і апаратно, проте в більшості загальнодоступних систем через їх вроджені
вади є можливість виконання коду, що міститься в сегменті (секції) даних, куди запис
дозволена).
5. Максимальна адаптація для потрібної платформи. Однак слід зазначмікроesi

ити, що останні технології безпеки, впроваджувані в операційні системи та


компілятори, не дозволяють робити самомодифікуючого коду, так як виключають
одночасну можливість виконання програми і запис в одній і тій ж ділянці пам'яті
(технологія WAX). Технологія використовується в OpenBSD, в інших BSD-системах, в
Linux. У Microsoft Windows (починаючи з Windows XP SP2) застосовується схожа
технологія DEP
14. Вкажіть недоліки мов асемблера.
1. Великі обсяги коду, велике число додаткових дрібних задач, менша кількість
доступних для використання бібліотек, порівнюючи з мовами високого рівня.
2. Трудомісткість читання та пошуку помилок (хоча тут багато що залежить від
коментарів і стилю програмування).
3. Часто компілятор мови високого рівня, завдяки сучасним алгоритмам оптимізації,
дає більш ефективну програму (по критерію якість / час розробки).
4. Непереносимість на інші платформи (крім сумісних).
5. Асемблер складніший для спільних проектів.
15. Вкажіть взаємодію асемблерних програм у MS-DOS.
У MS-DOS для обслуговування прикладних програм передбачений набір
процедур, які називаються функціями MS-DOS. Кожна функція має свій унікальний
номер, який перед передачею управління в DOS прикладна програма зобов'язана
розмістити в регістрі Аh. Залежно від викликаючої функції в інші регістри поміщається
різна інша інформація, що описує передаючий запит. Передача управління з
прикладної програми в DOS проводиться за допомогою програмного переривання з
вектором 21h: INT 21h.

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


запросила програма, намагається виконати її, а якщо це неможливо, повертає
керування в прикладну програму з встановленим прапором переносу (CF). У цьому
випадку в регістр Аh вона поміщає код помилки. Якщо запит виконаний успішно,
управління в програму повертається зі скинутим CF. У цьому випадку, якщо запит має
результати, вони розміщуються в регістрах процесора.
16. Вкажіть основні групи функцій MS-DOS.
Основними групами функцій DOS є:
1. системна інформація. У цю групу входять такі функції, як отримання системних
дати і часу, версії системи, поточного каталогу і т. д.
2. символьне введення-виведення. У цю групу входять функції введення і
виведення символів і рядків;
3. Handle - орієнтоване введення-виведення. Ця група включає в себе функції для
роботи з файлами;
4. традиційні FCB операції. Ці функції є застарілими аналогами Handle -
орієнтованого введення-виведення;
5. функції файлової системи. У цю групу зібрані функції створення і видалення
каталогів, перейменування файлів;
6. управління процесами. Функції цієї групи дозволяють породжувати і знищувати
процеси;
7. управління пам'яттю. Дозволяє динамічно запитувати і звільняються ділянки
оперативної пам'яті;
8. змішані операції. Цю групу утворюють різні функції, що не ввійшли в інші групи;
9. драйвери пристроїв. Група функцій для роботи з драйверами зовнішніх
пристроїв.
17. Вкажіть характеристику та склад пакету програмування MASM.
Microsoft Macro Assembler - транслятор. Програма для перетворення вихідного тексту
(коду) програми в файл який містить машинні коди команд мікропроцессора.
До складу пакету асемблера фірми Microsoft входять наступні програми:
● masm.exe - асемблер;
● ml.exe (Masm and Link) - асемблер і компонувальник;
● link.exe - компонувальник;
● pwb.exe (Programmer's WorkBench) - інтегроване середовище розробки
асемблерних програм, що дозволяє редагувати, формувати, налагоджувати і
виконувати асемблерну програму. Середовище володіє макромовою, за
допомогою якої істотно підвищується гнучкість управління її роботою;
● cv.exe (CodeView) - відладчик асемблерних програм, призначений для
виявлення помилок в асемблерних програмах. Існують два варіанти
налаштування - один для MS DOS, інший для Microsoft Windows;
● допоміжні утиліти lib.exe, nmake.exe та ін.
18. Вкажіть характеристику та склад пакету програмування ТASM.
До складу пакету TASM входять наступні програми і утиліти:
1. 16- і 32-розрядні транслятори tasm.exe і tasm32.exe.
2. 16- і 32-розрядні редактори зв'язків tlink.exe і tlink32.exe.
3. Turbo Debuger (TD) - відладчик, що працює на рівні початкового тексту.
Має 16- і 32-розрядні версії td.exe td32.exe. Існує відладчик tdw.exe, що дозволяє
проводити налагодження Windows-додатків.

19. Опишіть основні поняття про регістри процесора.


Регістри - спеціальні осередки пам'яті, розташовані фізично всередині процесора,
доступ до яких здійснюється не за адресами, а по іменах.
Регістр процесора – комірка швидкодійної внутрішньої пам'яті процесора, яка
використовується для тимчасового зберігання операндів, з якими безпосередньо
проводяться обчислення, а також часто використовуваних даних з метою швидкого
доступу до них.
Регістри характеризуються своєю розрядністю, тобто кількістю біт інформації, яка
може в них розміщуватись
20. Зобразіть схему архітектурних регістрів 64 розрядної моделі.
21. Вкажіть та охарактеризуйте підходи реєстрових моделей сучасних процесорів.
Реєстрова модель процесора - набір доступних внутрішніх регістрів.
У другому підході, характерному для процесорів фірми Intel, багато регістрів
спеціалізованих.
22. Вкажіть, як поділяються регістри процесора за функціональним призначенням.
1. регістри даних – використовуються для збереження цілочисельних даних. В
деяких архітектурах, відомих як акумуляторні, такий регістр лише один;
2. адресні регістри (індексні, базові) – зберігають адреси (номери комірок) в
пам'яті та використовуються в операціях з пам'яттю.
3. регістри загального призначення – можуть зберігати як дані, так і адреси;
4. регістри плаваючої коми – призначаються для зберігання даних для
обчислень з плаваючою комою;
5. регістри констант – зберігають константи;
6. векторні регістри – зберігають векторні дані та забезпечують векторні
обчислення (наприклад, в мультимедійних розширеннях архітектури x86).
23. Охарактеризуйте регістри загального призначення у процесорі сімейства х86.
+24. Вкажіть значення кожного регістру загального призначення.
Регістрів загального призначення всього вісім. Розглянемо 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) індекс приймача (одержувача) – застосовується
для адресації зсуву, містить поточну адресу в ланцюжку-приймачі.
25. Охарактеризуйте сегментні регістри у процесорі сімейства х86.
Сегментні регістри CS, DS, SS, ES, FS, GS являють собою той апаратний
ресурс, що використовується для розподілу й керування пам'яттю. Значення в
сегментному регістрі називається селектор і воно визначає (не дорівнює!) базову
адресу секції (сегмента), і в якій власне секції перебуває об'єкт в пам'яті.
При виділенні пам'яті програмі, операційна система завантажує значення
селекторів у відповідні сегментні регістри: в CS (Code Segment) – для секції коду, в DS
(Data Segment) – для секції даних, в SS (Stack Segment) – для секції стека, в ES, FS й
GS для додаткових і спеціальних секцій.
При використанні кожної з сегментованих моделей пам'яті для формування будь-якої
адреси застосовуються два числа - адреса початку сегмента і зміщення шуканого
байта щодо цього початку.
Для адресації команд у секції коду використовується регістр RIP (EIP)(Instruction
Pointer register) – регістр-покажчик команд.
Апаратну підтримку структури стеку,організованого згідно з принципом LIFO,
забезпечує регістр RSP (ESP) – регістр-покажчик верхівки стеку. Завжди, у будь-який
час, RSP містить поточну адресу верхівки стеку, за якою команди для роботи зі стеком
виконують читання і запис даних.
Стек розташовується в сегменті пам'яті, описуваному регістром SS, а поточне
зміщення вершини стека записано в регістрі ESP, причому під час запису в стек
значення цього зміщення зменшується, тобто стек росте вниз від максимально
можливої адреси.
26. Охарактеризуйте регістри стану і управління.
Регістр RFLAGS є впорядкованою послідовністю ознак або прапорців, що визначають
стан обчислюваного процесу в кожен момент часу.
Отже, регістр прапорців FLAGS (16 біт) / EFLAGS (32 біта) / RFLAGS (64 біта) –
містить поточний стан процесора.
Розрізняють три типи прапорців:
1. системні (вони відображають поточний стан комп'ютера в цілому і частіше
використовуються операційною системою, а не прикладними програмами,
контролюють операційну систему та пристрої);
2. стану (показують стан конкретної програми);
3. управління
27. Охарактеризуйте систечмні прапорці (VM, RF, NT).
1. VM (Virtual mode) (біт 17) – віртуальний режим.
0 = захищений режим;
1 = режим віртуального х86.
Цей прапорець показують, чи працює ваша програма в режимі віртуального х86. Щоб
повернутись в захищений режим, його опускають.
2. RF (Resume flag) (біт 16) продовження (відновлення).
0 = немає помилки;
1 = помилка налагодження;
Цей прапорець тимчасово включає засоби налагодження, коли програма відновлює
роботу після особливого випадку налагодження.
3. NT (Nested task) (біт 14) - вкладена задача.
0 = поточна завдання не вкладена;
1 = поточна задача вкладена.
Цей прапорець показує, чи виконується поточна задача «під» деяким іншим
завданням. Він впливає на виконання команди IRET.
28. Охарактеризуйте системні прапорці (IOPL, IF, TF).
IOPL (I/O priviledge level field) (біти 12 і 13) - рівень привілеї вводу/виводу. Чим
менше рівень, тим більше повноважень має задача. Два біта IOPL використовуються
процесором і операційною системою для визначення прав доступу прикладної
програми до засобів вводу / виводу. Допустимі рівні варіюються від 0 (найбільш
привілейований) до 3 (найменш привілейовані). 5.
IF (Interrupt enable flag) дозвіл переривання (біт 9). 0 = зовнішні переривання
заборонені; 1 = дозволені. Цей прапорець визначає, чи буде процесор реагувати
на зовнішні переривання або ігнорує їх. Він не впливає на особливі випадки
переривання (породжувані програмою) і немасковані зовнішні переривання.
TF (Trap flag) (біт 8) - трасування. 0 = немає трасування; 1 = переривання після кожної
команди. Цей прапорець викликає генерування особливого випадку переривання
по кожній команді. Застосовується для покомандної роботи при налагодженні.
29. Охарактеризуйте прапорці стану (OF, SF, ZF).
OF (Overflow Flag) (біт 11) – прапорець переповнення. Цей прапорець
встановлюється в 1, якщо результат арифметичної операції перевищує доступні
межі; якщо цього немає, прапорець переповнення скидається в 0.
SF (Sign Flag) (біт 7) – прапорець знаку. Цей біт показує знак результату: 0 – вказує
на додатне значення, 1 – від'ємне.
ZF (Zero Flag) (біт 6) – прапорець нуль. Цей прапорець встановлюється в 1 (істина),
якщо результат операції нуль, і скидається в 0 (хибне), якщо результат
ненульовий.
30. Охарактеризуйте прапорці стану (AF, PF, CF).
AF (Adjust Flag) (біт 4) – корекція або допоміжний перенос. Якщо арифметична
операція спричинює перенос, чи виходить за межі на три біти. Цей прапор
використовується в арифметиці з двійково-десятковим представленням. 0 - не має
внутрішнього переносу; 1 - внутрішній перенос.
PF (Parity Flag) – парність (біт 2). Якщо найменш значущий байт результату містить
парне число одиничок. Інакше опускається.
0 - молодший байт має парний паритет; 1 - молодший байт має непарний паритет.
CF (Carry Flag) (біт 0) – перенос. Якщо арифметична операція генерує перенос, чи
виходить за межі значущих бітів результату.арифметична операція генерує перенос,
чи виходить за межі значущих бітів результату. Показує переповнення при операціях з
беззнаковими цілими. 0 - немає переносу зі старшого біта; 1 - є перенос. Показує, чи
викликали додавання чи віднімання перенесення або запозичення зі старшого біта
результату.
31. Охарактеризуйте прапорці управління.
Прапорці управління діють тільки на циклічні команди.
DF (Direction Flag) – прапорець напрямку. Знаходиться в біті 10.
Цей прапорець управляє «напрямком» операцій. Коли D = 0, цикли обробляються від
молодших адрес до старших, а коли D = 1, обробка проводиться від старших адрес до
молодших.
Інструкція STD піднімає цю позначку, а CLD – опускає.
32. Вкажіть та охарактеризуйте різновиди систем команд процесора.
1. Команди передачі даних - команди цієї групи пересилають дані з одного місця
комп'ютера в інше: між регістрами, між регістрами і пам'яттю, між регістром або
пам'яттю і стеком.
2. Арифметичні команди - ці команди застосовуються для виконання арифметичних
операцій над знаковими або без знаковими числами.
3. Команди перетворення даних - команди цієї групи застосовуються для
перетворення типів даних. Більшість з них працює зі знаковими числами, а одна
придатна і для беззнакових чисел.
4. Логічні команди - команди цієї групи застосовуються для виконання булевих
операцій і забезпечують роботу з двійковими полями в байтах, словах і подвійних
словах.
5. Команди управління виконанням - у цю групу включаються команди, що
порушують природній порядок виконання команд програми, такі як програмні
переривання і повернення з переривань, виклик і повернення з підпрограм, різні умовні
та безумовні переходи.
6. Команди зрушень - виконують різні порозрядні зрушення вліво і вправо.
33. Охарактеризуйте та зобразіть схематично синтаксис рядка у асемблері.
Рядок - основна одиниця асемблерної програми:

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

35. Вкажіть, яким чином описується синтаксис директиви та макрокоманди.


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

Максимальний розмір сегмента обмежений і становить 216 байт.


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

38. Дайте характеристику директивам режимів трансляції та наведіть приклади цих


директив.
Директиви визначення загального режиму трансляції визначають глобальні
особливості трансляції, які повинні враховуватися при обробці тексту програми.
Директиви управління лістингом визначають, що слід включати в вміст файлу
лістингу. Прикладами директив цієї групи є:
● .LIST - Включити в лістинг всі рядки вихідного тексту програми;
● .NOLIST - Виключити з лістингу вихідний текст;
● . SUMS - включити в лістинг таблиці символів;
● .NOSUMS - Виключити з лістингу таблицю символів і т. д.
Директиви вказівки типу процесора визначають, які регістри процесора, режими
адресації, команди дозволено використовувати в програмі. Приклади цих директив:
● .8086 - Дозволено використовувати апаратуру мікропроцесора +8086;
● .80286 - Те ж саме, але мікропроцесор 80286;
● .80286Р - Дозволяє використання привілейованих команд мікропроцесора
● 80286.
Найбільш широкі можливості дає директива .80586Р.
Основа системи числення визначає, як будуть інтерпретовані числа за
замовчуванням. Для цих цілей використовуються директиви .RADIX:
● .RADIX 2 - як двійкові;
● .RADIX 8 - як вісімкові;
● .RADIX 10 - як десяткові;
● .RADIX 16 - як шістнадцяткові.
Директиви assume фактично визначають точки програми, від яких
транслятор відраховує зміщення до міток, які у програмі як символічних адрес.
Директива model найчастіше використовується спільно з директивами
спрощеної сегментації. Вона визначає, як будуть розташовані сегменти по
відношенню один до одного, яким чином будуть адресуватися дані, як будуть
викликатися підпрограми.
39. Дайте характеристику директивам режимів секціонування програми та наведіть
приклади цих директив.
Директиви секціонування програми призначені для оформлення логічно
закінчених частин програми.

Сегменти програми можуть описуватися традиційними директивами segment і


ends, і директивами спрощеної сегментації. Прикладами таких директив є:
● .code - відкриває опис сегмента кодів команд;
● .data - починає опис сегмента даних;
● .stack - описує сегмент стека, як аргумент цієї директиви може вказуватися
розмір стека в байтах.
Для опису процедур в асемблері передбачені директиви proc і endp.
Схематичне оформлення процедури з ім'ям Р:
40.Дайте характеристику директивам макрозасобів та їх класифікацію.
Директиви макрозасобів дозволяють при написанні програми оперувати
заздалегідь заготовленими фрагментами текстів. Класифікація:
1. макрокоманди;
2. блоки повторень;
3. умовна трансляція;
4. допоміжні.
41.Дайте характеристику директивам резервування даних.
Директиви резервування даних розміщують і в разі необхідності, ініціалізують
області пам'яті під дані програми. До них відносяться:
● db (define byte) - резервує область для байтових даних;
● dw (define word) - резервує область для двобайтових даних;
● dd (define double word) - резервує область для чотирьох байтових даних;
● df (define float) - резервує область для шестибайтових даних;
● dq (define діакеук word) - резервує область для восьмибайтових даних;
● dt (define ten bytes) - резервує область для десятибайтових даних.
Формат цих директив однаковий.

Синтаксис значення ініціалізації.


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

42. Охарактеризуйте команди передачі даних: MOV, XCHG, PUSH.


Команди цієї групи пересилають дані з одного місця комп'ютера в інше: між
регістрами, між регістрами і пам'яттю, між регістром або пам'яттю і стеком.
MOV - пересилає один елемент даних з одного місця в інше.
• Команда: MOV приймач, джерело
• Призначення: пересилання даних
• Процесор: 8086
Базова команда пересилання даних. Копіює вміст джерела в приймач, джерело не
змінюється. Команда MOV діє аналогічно операторам присвоювання з мов високого
рівня, тобто команда mov ax, bx еквівалентна висловом ах: = bх; мови Паскаль або ах
= bх; мови С, за винятком того, що команда асемблера дозволяє працювати не тільки з
змінними в пам'яті, а й з усіма регістрами процесора.
В якості джерела для MOV можуть використовуватися: число (безпосередній операнд),
регістр загального призначення, сегментний регістр або змінна (тобто операнд, що
знаходиться в пам'яті). Як приймач - регістр загального призначення, сегментний
регістр (окрім CS) або змінна. Обидва операнди повинні бути одного і того ж розміру -
байт, слово або подвійне слово.
Не можна виконувати пересилання даних за допомогою MOV з однієї змінної в іншу, з
одного сегментного регістра в інший і не можна поміщати в сегментний регістр
безпосередній операнд - ці операції виконують двома командами MOV (з сегментного
регістра в звичайний і вже з нього в інший сегментний) або парою команд PUSH / POP.
XCHG - обмінює вміст двох регістрів або вміст регістра і осередки пам'яті.
Часто застосовується для синхронізації декількох процесів, так як її можна переривати
іншим пристроєм, що використовують шину даних.
• Команда: XCHG операнд1, операнд2
• Призначення:Обмін операндів між собою
• Процесор: 8086
Вміст операнда 2 копіюється в операнд 1, а старий вміст операнда 1 - в операнд 2.
XCHG можна виконувати над двома регістрами або над регістром і змінній.
xchg eax, ebx ; те ж, що три команди на мові С:
; temp = eax; eax = ebx; ebx = temp;
xchg al, al ; а ця команда не робить нічого
PUSH - копіює операнд-джерело в вершину стека. Застосовується для
приміщення параметрів в стек перед викликом процедури. Корисна також для
тимчасового збереження даних в стек.
• Команда: PUSH джерело
• Призначення: Помістити дані в стек
• Процесор: 8086
Поміщає вміст джерела в стек. Джерелом може бути регістр, сегментний регістр,
безпосередній операнд або змінна. Фактично ця команда копіює вміст джерела в
пам'ять за адресою SS: [ESP] і зменшує ESP на розмір джерела в байтах (2 або 4).
Команда PUSH практично завжди використовується в парі з POP (зчитати дані з стека).
Так, наприклад, щоб скопіювати вміст одного сегментного регістра в інший (що можна
виконати однією командою MOV), можна використовувати таку послідовність команд:
push cs pop ds ; тепер DS вказує на той же сегмент, що і CS
43. Охарактеризуйте команди передачі даних: POP, PUSHA, POPA.
POP - бере верхній елемент з стека і пересилає його в операнд-одержувач.
Застосовується для повернення з стека значень, включених до нього командою PUSH.
• Команда:POP приймач
• Призначення:Вважати дані з стека
• Процесор: 8086
Поміщає в приймач слово або подвійне слово, яке перебуває в вершині стека,
збільшуючи ESP на 2 або 4 відповідно. POP виконує дію, повністю протилежну PUSH.
Приймачем може бути регістр загального призначення, сегментний регістр, крім CS
(щоб завантажити CS з стека, треба скористатися командою RET), або змінна. Якщо в
ролі приймача виступає операнд, який використовує ESP для непрямої адресації,
команда POP обчислює адресу операнда вже після того, як вона збільшує ESP.
Інше часте застосування команд PUSH / POP - тимчасове зберігання змінних,
наприклад:
push eax ; зберігає поточне значення ЕАХ
... ; тут розташовуються якісь команди,
; які використовують еах, наприклад CMPXCHG
pop eax ; відновлює старе значення ЕАХ
Починаючи з 80286, команда PUSH ESP (або SP) поміщає в стек значення ESP до
того, як ця ж команда його зменшить, в той час як на 8086 SP поміщався в стек вже
зменшеним на два.
PUSHA і PUSHAD - застосовуються для приміщення вмісту всіх 8 регістрів
загального призначення в стек (PUSHA - оперує 16-бітними регістрами, PUSHAD - 32-
бітними регістрами). Ці команди використовуються перед викликом процедур.
• Команда: PUSHA
PUSHAD
• Призначення: Помістити в стек всі регістри загального призначення
• Процесор: 80186
80386
PUSHA поміщає в стек регістри в наступному порядку: АХ, СХ, DX, ВХ, SP, ВР, SI і DI.
PUSHAD поміщає в стек Еах, ЕСХ, EDX, ЕВХ, ESP, EBP, ESI і EDI. (В разі SP і ESP
використовується значення, яке знаходилося в цьому регістрі до початку роботи
команди.) В парі з командами POPA / POPAD, що зчитують ці ж регістри з стека в
зворотному порядку, це дозволяє писати підпрограми (зазвичай обробники
переривань), що не повинні змінювати значення регістрів після закінчення своєї
роботи. На початку такої підпрограми викликають команду PUSHA, а в кінці - РОРА.
-------------------------------------------------------------------------------------------
Насправді PUSHA і PUSHAD - одна і та ж команда з кодом 60h. Її поведінка
визначається тим, чи виконується вона в 16- або в 32-бітному режимі. Якщо програміст
використовує команду PUSHAD в 16-бітному сегменті або PUSHA в 32-бітному,
асемблер просто записує перед нею префікс зміни розмірності операнда (66h).
Це ж буде поширюватися на деякі інші пари команд: РОРА / POPAD, POPF / POPFD,
PUSHF / PUSHFD, JCXZ / JECXZ, CMPSW / CMPSD, INSW / INSD, LODSW / LODSD,
MOVSW / MOVSD, OUTSW / OUTSD, SCASW / SCASD і STOSW / STOSD.
--------------------------------------------------------------------------------------------
РОРА і POPAD - відновлюють з стека вміст 8 регістрів загального призначення,
будучи доповненням команд PUSHA і PUSHAD.
• Команда: POPA, POPAD
• Призначення:Завантажити з стека всі регістри загального призначення
• Процесор: 80186, 80386
Ці команди виконують дії, повністю обернені діям PUSHA і PUSHAD, за винятком того,
що поміщене в стек значення SP або ESP ігнорується. РОРА завантажує з стека DI, SI,
BP, збільшує SP на два, завантажує ВХ, DX, CX, AX, a POPAD завантажує EDI, ESI,
ЕВР, збільшує ESP на 4 і завантажує ЕВХ, EDX, ЕСХ, ЕАХ.

2 МОДУЛЬ
Перелік питань на модульний контроль №2 з дисципліни

«Основи програмування на мові Асемблер»

1. Охарактеризуйте арифметичні
команди: ADD, SUB, INC.
ADD - підсумовує(додає) два операнди, поміщаючи результат в
перший операнд
(одержувач).

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


Різниця

заміщає місце одержувача.

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


переносу.

2. Охарактеризуйте арифметичні
команди: DEC, MUL, IMUL.
DEC - зменшує операнд на 1, що не впливаючи на прапорець
переносу.

Застосовується в циклах для декремента індексу.

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

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

команда. Вона має 4 базові форми по числу і типу операндів (один,


два або три операнда).

3. Охарактеризуйте арифметичні
команди: DIV, IDIV, NEG.
DIV – здійснює розподіл цілих беззнакових чисел.
Призначення: Цілочисельне ділення без знака

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


числами.

Призначення: Цілочисельне ділення зі знаком


NEG – змінює знак операнда, що знаходиться в регістрі або
пам'яті.

4. Охарактеризуйте арифметичні
команди: CMP, ADC, SBB.
CMP - аналогічна команді SUB, але не зберігає результат.
Команда порівнює два числа для подальшого умовного переходу.
Призначення: порівняння

ADC - діє як команда ADD, але додає значення переносу до


суми. Призначення: Додавання з переносом

SBB - діє як команда SUB, але віднімає з різниці значення


переносу. Призначення: Віднімання з позикою

5. Охарактеризуйте команди
перетворення даних: MOVSX, MOVZX, CBW.
MOVSX - копіює вміст даного операнда в більший за розміром
регістр отримувача даних, знак залишається за даним операндом.

MOVZX - копіює вміст даного операнда в більший за розміром


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

CBW - виконує перетворення значення, який знаходиться в регістрі


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

6. Охарактеризуйте команди
перетворення даних: CWDE, CWD, CDQ.
CWDE - виконує перетворення значення ах до розміру подвійного
слова і поміщає його в еах, при цьому вільні старші біти еах заповнюються
знаковим бітом ах.
CWD - виконує перетворення значення ах до розміру подвійного
слова і поміщає його в пару dx:ax, при цьому вільні біти dх
заповнюються знаковим бітом ах.

CDQ - виконує перетворення значення eах до розміру


вчетверо збільшеного слова і поміщає його в пару еdx:еax, при
цьому вільні біти dх заповнюються знаковим бітом еах.

7. Охарактеризуйте логічні команди: AND,


OR, NOT.
AND - виконує логічну функцію І для двох операндів і зручна для

установки довічного поля в нуль.

OR - виконує логічну функцію АБО для двох операндів. Звичайно

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

NOT - інвертує біти свого операнда. Кожен біт приймача (регістр


або змінна), що дорівнює нулю, встановлюється в 1, і кожен біт, що
дорівнює 1, скидається в 0. Прапори не зачіпаються.

8. Охарактеризуйте логічні команди:


TEST, XOR, SETxx.
TEST - команда логічного порівняння аналогічна команді AND, але
результат не зберігається. Застосовується для перевірки довічного поля на
нуль (або не нуль).

XOR - виконує логічну функцію виключає АБО для двох операндів.


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

SETxx - ці команди застосовуються для збереження результату


деякого порівняння. Значення «хх» визначає умова порівняння. Якщо
порівнювати істинно, то одержувач встановлюється в 1, а якщо порівняння
хибне, одержувач встановлюється на 0.
9. Охарактеризуйте команди операцій
над бітами: BT, BTS, BTR, BTC.
Команда перевірки біта ВТ просто поміщає значення зазначеного

біта під прапорець переносу. Три інші команди виконують цю ж функцію,

але дозволяють адресується біт встановити в 1 (BTS), скинути в 0 (BTR)

або інвертувати (ВТС).

10. Охарактеризуйте команди операцій над


бітами: BSF, BSR.
BSF, BSR - дві команди сканування біта: BSF (вперед) і BSR (назад)

- знаходять перші 1 в операнде, починаючи з молодшого біта (BSF) або

старшого біта (BSR). Обидві команди зручні при роботі з двійковими

образами.

11. Охарактеризуйте команди підтримки


мови високого рівня: BOUND, ENTER.
Команда BOUND дозволяє переконатися в тому, що знаковий індекс
масиву знаходиться в межах, визначених в блоці пам'яті, що складається з
верхньої і нижньої меж. Кожна межа займає слово при атрибуті розміру
операнда рівному 16 біт і подвійне слово при атрибуті розміру операнда
рівному 32 біта. Перший операнд (завжди регістр) повинен бути більше
або дорівнює першій меежі в пам'яті (нижній межі) і менше або дорівнює
сумі другій межі в пам'яті (верхньої межі) і кількості байт, відведених
розміром операнда. Якщо значення регістру не знаходиться в межах, то
відбувається генерація особливої ситуації #BR, а зберігається при цьому
CS: EIP вказує на команду BOUND.
Команда ENTER виконує виділення кадру стека після входу в
процедуру. Команда ENTER створює кадр стека, необхідний для
більшості мов високого рівня. Перший операнд задає число байтів пам'яті,
що виділяється в стеці при входженні в процедуру. Другий операнд задає
рівень вкладеності процедури в вихідному коді мови високого рівня. Він
визначає число покажчиків кадру стека, що копіюються в новий кадр стека
з попереднього.

Якщо поточна розрядність дорівнює 16 бітам, процесор


використовує регістр BP в якості покажчика кадру і регістр SP в якості
покажчика стека. Якщо розрядність дорівнює 32 бітам, то процесор
використовує регістри EBP і ESP відповідно.

12. Охарактеризуйте команду підтримки


мови високого рівня LEAVE.
LEAVE звільняє стек на виході з нього. Команда LEAVE має дію,
протилежне команді ENTER. Фактично команда LEAVE тільки копіює
вміст EBP в ESP, тим самим викидаючи з стека весь кадр, створений
командою ENTER, і зчитує з стека значення регістра EBP для попередньої
процедури.

13. Охарактеризуйте команди керування


прапорами: STC, CLC, CMC, STD.
Команда: STC

• Призначення: Встановити прапор переносу

• Процесор: 8086

Встановлює прапор CF в 1.

Команда: CLC

• Призначення: Скинути прапор переносу

• Процесор: 8086
Скидає прапор CF в 0.

Команда: CMC

• Призначення: Інвертувати прапор переносу

• Процесор: 8086

Інвертує прапор СF.

Команда: STD

• Призначення: Встановити прапор напрямку

• Процесор: 8086

Встановлює прапор DF в 1, так що при наступних строкових


операціях

регістри DI і SI будуть зменшуватися.

14. Охарактеризуйте команди керування


прапорами: CLD, LAHF, SAHF, PUSHF,
PUSHFD.
Команда: CLD

• Призначення: Скинути прапор напрямки

• Процесор: 8086

Скидає прапор DF в 0, так що при наступних строкових операціях

регістри DI і SI будуть збільшуватися.

Команда: LAHF

• Призначення: Завантажити прапори стану в АН

• Процесор: 8086

Копіює молодший байт регістра FLAGS в АН, включаючи прапори


SF
(біт 7), ZF (біт 6), AF (біт 4), PF (біт 2) і CF (біт 0). Біт 1
встановлюється в 1,

біти 3 і 5 - в 0.

Команда: SAHF

• Призначення: Завантажити прапори стану з АН

• Процесор: 8086

Завантажує прапори SF, ZF, AF, PF і CF з регістра АН значеннями


біт 7,

6, 4, 2 і 0 відповідно. Зарезервовані біти 1, 3 і 5 регістра прапорів не

змінюються.

Команда: PUSHF

• Призначення: Помістити FLAGS в стек

• Процесор: 8086

• Команда: PUSHFD

• Призначення: Помістити ЕFLAGS в стек

• Процесор: 80386

Ці команди копіюють вміст регістра FLAGS або EFLAGS в стек

(зменшуючи SP або ESP на 2 або 4 відповідно). При копіюванні


регістра

EFLAGS прапори VM і RF (біти 16 і 17) ця функція не копіює


відповідні біти

в подвійному слові, вміщеному в стек, обнуляються.


15. Охарактеризуйте команди керування
прапорами: POPF, POPFD, CLI, STI, SALC.
Команда: POPF

• Призначення: Завантажити FLAGS з стека

• Процесор: 8086

• Команда: POPFD

• Призначення: Завантажити EFLAGS з стека

• Процесор: 80386

Зчитує з вершини стека слово (POPF) або подвійне слово (POPFD) і

поміщає в регістр FLAGS або EFLAGS. Ефект цих команд залежить


від

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


захищеному

режимі з рівнем привілеїв 0 модифікуються всіне зарезервовані


прапори в

EFLAGS, крім VIP, VIF і VM. VIP і VIF обнуляються, і VM не


змінюється. У

захищеному режимі c рівнем привілеїв, великим нуля, але меншим


або рівним

IOPL, модифікуються всі прапори, крім VIP, VIF, VM і IOPL. У


режимі V86 не

змінюйте прапори VIF, VIP, VM, IOPL і RF.

Команда: CLI

• Призначення: заборонити переривання

• Процесор: 8086
Скидає прапор IF в 0. Після виконання цієї команди процесор
ігнорує всі

переривання від зовнішніх пристроїв (крім NMI). У захищеному


режимі ця

команда, так само як і всі інші команди, що модифікують прапор IF


(POPF або

IRET), виконується, тільки якщо програмі дано відповідні привілеї


(CPL

<IOPL).

• Команда: STI

• Призначення: дозволити переривання

• Процесор: 8086

Встановлює прапор IF в 1, скасовуючи тим самим дію команди CLI.

• Команда: SALC

• Призначення: Встановити AL відповідно до CF

• Процесор: 8086

Встановлює AL в 0FFh, якщо прапор CF = 1, і скидає в 00h, якщо CF


= 0.

Це не документована команда з кодом 0D6h, присутня у всіх


процесорах Intel

і сумісних з ними (починаючи з 8086). В документації на Pentium Pro


ця

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


описується. Дія
SALC аналогічно SBB AL, AL, але SALC не змінює значень
прапорів.

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


операнди та як вони класифікуються.
Дуже важливим для команд є поняття операнда. Це те значення даних, яке
«обробляє» команда. Хоча кожна команда має свою структуру операндів, але є і
багато спільних особливостей.

Операнд зазвичай розглядається як джерело або одержувач (в залежності від


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

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

17. Охарактеризуйте операнди: адресні,


переміщувальні та операнд лічильник адреси.
Адресні

Адресные операнды — задают физическое расположение операнда в памяти с


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

К примеру:

mov ax,0000h

mov ds,ax

mov ax,ds:0000h ;записать слово в ax из области памяти по

;физическому адресу DS:0000

Здесь третья команда mov имеет адресный операнд.

Переміщувальні

Перемещаемые операнды — любые символьные имена, представляющие


некоторые адреса памяти. Эти адреса могут обозначать местоположение в памяти
некоторых инструкций (если операнд — метка) или данных (если операнд — имя
области памяти в сегменте данных).
Перемещаемые операнды отличаются от адресных тем, что они не привязаны к
конкретному адресу физической памяти. Сегментная составляющая адреса
перемещаемого операнда неизвестна и будет определена после загрузки программы в
память для выполнения.

К примеру:

data segment

mas_w dw 25 dup (0)

code segment

lea si,mas_w ;mas_w - перемещаемый операнд

В этом фрагменте mas_w — символьное имя, значением которого является


начальный адрес области памяти размером 25 слов. Полный физический адрес этой
области памяти будет известен только после загрузки программы в память для
выполнения.

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

Счетчик адреса — специфический вид операнда. Он обозначается знаком $.

Специфика этого операнда в том, что когда транслятор ассемблера встречает в


исходной программе этот символ, то он подставляет вместо него текущее значение
счетчика адреса. Значение счетчика адреса, или, как его иногда называют, счетчика
размещения, представляет собой смещение текущей машинной команды
относительно начала сегмента кода.

В формате листинга счетчику адреса соответствует вторая или третья колонка


(в зависимости от того, присутствует или нет в листинге колонка с уровнем
вложенности). Если взять в качестве пример любой листинг, то видно, что при
обработке транслятором очередной команды ассемблера счетчик адреса
увеличивается на длину сформированной машинной команды. Важно правильно
понимать этот момент.

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


счетчика. Директивы, в отличие от команд ассемблера, — это лишь указания
транслятору на выполнение определенных действий по формированию машинного
представления программы, и для них транслятором не генерируется никаких
конструкций в памяти. В качестве примера использования в команде значения
счетчика адреса можно привести следующий:
jmp $+3 ;безусловный переход на команду mov

cld ;длина команды cld составляет 1 байт

mov al,1

При использовании подобного выражения для перехода не забывайте о длине


самой команды, в которой это выражение используется, так как значение счетчика
адреса соответствует смещению в сегменте команд данной, а не следующей за ней
команды. В нашем примере команда jmp занимает 2 байта. Но будьте осторожны,
длина команды зависит от того, какие в ней используются операнды. Команда с
регистровыми операндами будет короче команды, один из операндов которой
расположен в памяти. В большинстве случаев эту информацию можно получить, зная
формат машинной команды и анализируя колонку листинга с объектным кодом
команды.

18. Охарактеризуйте операнди: регістровий,


базовий, індексний та структурний.
Регистровый операнд — это просто имя регистра. В программе на
ассемблере можно использовать имена всех регистров общего назначения и
большинства системных регистров.

mov al,4 ;константу 4 заносим в регистр al

mov dl,pass+4 ;байт по адресу pass+4 в регистр dl

add al,dl ;команда с регистровыми операндами

Базовый и индексный операнды. Этот тип операндов используется для


реализации косвенной базовой, косвенной индексной адресации или их комбинаций и
расширений.

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.

порівняння:

Команда CMP призначена для порівняння чисел. Вона виконується


аналогічно команді SUB: з першого операнда віднімається другий, але

результат не записується на місце першого операнда, змінюються тільки


значення прапорів. Наприклад:

cmp al, 5; jl c1; cmp al, 5; jb c1;

Порівняння AL і 5

Перехід, якщо AL <5 (числа зі знаком) Порівняння AL і 5

Перехід, якщо AL <5 (числа без знака)

Команда TEST працює аналогічно команді AND, але також результат не


зберігається, змінюються лише прапори. За допомогою цієї команди
можна перевірити стан різних бітів операнда. Наприклад:

test bl, 00000100b; Перевірити стан 2-го біта BL

jz c2; Перехід, якщо 2-й біт дорівнює

Оператори порівняння (повертають значення істина або брехня)


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

size equ 30; розмір таблиці

mov al, tab_size ge 50; al = 0

cmp al, 0; якщо size <50, то

je m1; перехід на m1
Якщо значення size більше або дорівнює 50, то результат в аl дорівнює 1, в
іншому випадку - 0. Команда cmp порівнює значення аl з нулем і
встановлює відповідні прапори в EFLAGS. Команда je на основі аналізу
цих прапорів передає або залишають поза передачею управління на мітку
m1.

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

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

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 далекий покажчик функція

наприклад,

str1 db «Привіт», 0

...

lea esi, str1

cmp byte ptr [esi], 0; [Esi] == 0?

У прикладі для порівняння значення за адресою esi з константою


необхідно явно вказати, дані якого типу будуть порівнюватися.

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


пам'ять з певним типом. Асемблер визначає правильну інструкцію для
складання, грунтуючись на типі операндів інструкції. У деяких випадках
можна вказати операнд, який не має типу. Ці випадки включають
використання числових або реєстрових виразів. Тут оператор PTR
використовується для вказівки типу операнда. Наступні приклади
ілюструють це використання:

MOV WORD PTR [BX], 5; set word pointed to by BX = 5

INC DS: BYTE PTR 10; increment byte at offset 10

; From DS
Ця форма також може використовуватися для перевизначення
атрибута типу змінної або мітки. Якщо, наприклад, ви хочете отримати
доступ до вже визначеної змінної word у вигляді двох байтів, ви можете
закодувати наступне:

MOV CL, BYTE PTR AWORD; get first byte

MOV CL, BYTE PTR AWORD + 1; get second byte

значення полів: тип це поле може мати одне з наступних значень:


BYTE, WORD, DWORD, QWORD, TBYTE, NEAR, FAR назва цього поля
може бути: 1. Ім'я змінної. 2. Ім'я мітки. 3. Вираз адреси або регістра. 4.
Ціле число, яке представляє собою зсув.

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


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

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

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

ім'я групи.

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


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

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


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

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


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

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


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

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


безумовний перехід.
Безумовний перехід - це перехід, який виконується
завжди. Безумовний перехід здійснюється за допомогою
команди JMP. У цій команди один операнд, який може бути
безпосереднім адресою (міткою), регістром або осередком пам'яті,
що містить адресу.
jmp metka; Перехід на мітку
jmp bx; Перехід за адресою в BX
jmp word [bx]; Перехід за адресою, що міститься в
пам'яті за адресою в BX

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


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

У всіх цих командах один операнд ‒ ім'я мітки для переходу.

Для беззнакових чисел ознакою переповнення буде прапор


CF, а відповідними командами переходу JC і JNC. Для чисел зі
знаком про переповнення можна судити за станом прапора OF, тому
їм відповідають команди переходу JO і JNO. Команди переходів не
змінюють значення прапорів.
25. Вкажіть, що собою представляють
команди CMP і TEST.
Часто для формування умов переходів використовуються команди CMP і TEST.
Команда CMP призначена для порівняння чисел. Вона виконується аналогічно команді
SUB: з першого операнда віднімається другий, але результат не записується на місце
першого операнда, змінюються тільки значення прапорів. Наприклад:

cmp al, 5; Порівняння AL і 5

jl c1; Перехід, якщо AL <5 (числа зі знаком)

cmp al, 5; Порівняння AL і 5

jb c1; Перехід, якщо AL <5 (числа без знака)

Команда TEST працює аналогічно команді AND, але також результат не


зберігається, змінюються лише прапори. За допомогою цієї команди можна перевірити
стан різних бітів операнда. Наприклад:

test bl, 00000100b; Перевірити стан 2-го біта BL

jz c2; Перехід, якщо 2-й біт дорівнює 0

26. Опишіть синтаксис оголошення міток.


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

Наприклад:

m1: mov ax, 4C00h

int 21h
Тепер замість імені m1 компілятор всюди буде підставляти адреса комади mov
ax, 4C00h. Можна оголошувати мітку на порожній рядок перед командою:

exit_app:

mov ax, 4C00h

int 21h

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

no_error:

exit_app:

m1: mov ax, 4C00h

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


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

Вміст CX інтерпретується командою як число без знака. У CX потрібно поміщати


число, рівне необхідній кількості повторень циклу. Максимально може бути 65535
повторень. Ще одне обмеження пов'язане з дальність переходу. Мітка повинна
знаходитися в діапазоні -127 ... + 128 байт від команди LOOP.
28. Вкажіть, для чого потрібні та де зручно
використовувати команди LOOPZ і LOOPNZ.
29. Охарактеризуйте режими адресації
пам’яті: неявна адресація, безпосередня та
абсолютна.
30. Охарактеризуйте режими адресації
пам’яті: відносна пряма, регістрова та непряма
регістрова.
31. Охарактеризуйте режими адресації
пам’яті: непряма регістрова зі зміщенням,
непряма базова індексна та непряма базова
індексна адресація зі зміщенням.
32. Вкажіть яким чином обчислюється
ефективна адреса.
Для ефективного програмування потрібно використовувати декілька

способів іменування комірок пам'яті. У асемблерному операторі для

визначення адреси можна об'єднувати 4 можливих елемента. Обчислений, або

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

остаточний адресу. Ось ці елементи:

1. База. Це вміст одного з регістрів загального призначення. База

вважається початковою точкою, а інші елементи додаються до неї з ефективної

адреси. У регістр можна помістити початкову комірку масиву даних.

2. Зсув. Це адреса комірки в сегменті пам'яті. Довжина зсуву 8, 16 або 32

біта.
3. Індекс. Як і в базової адресації, для утворення ефективної адреси

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

індексування призначені SI і DI, а в разі 32-бітових операндів - будь-який

регістр, крім ESP.

4. Масштаб. Якщо індекс є 32-бітної величиною, його можна помножити

на 2, 4 або 8. Це зручно при зверненні до масивів з елементами фіксованого

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

ЕА = База + (Індекс * Масштаб) + Зсув


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

немає індексу, то ЕА = База + Зсув.

33. Опишіть, що собою представляє


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

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

shr byte [bx], cl; Лог. зсув байта за адресою BX на СL біт вправо

shr cl, 4; CL = CL / 16 (для числа без знака)

34. Опишіть, що собою представляє


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

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


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

sar bx, 1; Арифметичний зсув BX на 1 біт вправо

sar di, cl; Арифметичний зсув DI на CL біт вправо

sar [x], 3; x = x / 8 (x - 8-бітове значення зі знаком)

35. Опишіть, що собою представляє


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

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


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

shl dx, 1; Зсув DX на 1 біт вліво

sal dx, 1; Те ж саме


shl ax, cl; Зсув AX на CL біт вліво

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

36. Опишіть, що собою представляє зсув


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

Приклад використання команди SHLD:

shld ax, bx, 3; зсув ax на 3 біти вліво,

; 3 старших біта BX стають молодшими бітами AX


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

1. Переліком елементів масиву в полі операндів однієї з директив


опису даних.

а). При переліку елементи розділяються комами.

Наприклад:

;массив з 5 елементів. Розмір кожного елементу 4 байти:

mas dd 1,2,3,4,5

б). Використовуючи оператор повторення dup.

Наприклад:

;массив з 5 нульових елементів. ;Розмір кожного елементу 2 байти:

mas dw 5 dup (0)

Такий спосіб визначення використовується для резервування пам'яті


з метою розміщення і ініціалізації елементів масиву.
2. Використовуючи директиви label і rept. Пара цих директив може
полегшити опис великих масивів в пам'яті і підвищити наочність такого
опису.

Директива rept відноситься до макрозасобів мови асемблера і


викликає повторення вказане число раз рядків, укладених між директивою
і рядком endm.

3. Використовування циклу для ініціалізації значеннями області


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

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


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

mas dw 0,1,2,3,4,5

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


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

база + (індекс * розмір елемента)

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


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

цифрою 2, 4 або 8, то вміст індексного регістра помножатиметься на


2, 4 або 8, тобто масштабуватиметься.

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


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

потрібно лише завантажити в індексний регістр значення


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

майже ніяк не відображається ‒ пам'ять під масив виділяється за


допомогою директив резервування і ініціалізації пам'яті.

Якщо послідовність однотипних елементів в пам'яті трактується як


двомірний масив, розташований по рядках, то адреса елементу (i, j)
обчислюється по формулі

(база + кількість_елементів_в_рядку * розмір_елемента * i+j)

Де i = 0...n–1 вказує номер рядка, а j = 0...m–1 вказує номер стовпця.

Наприклад, нехай є масив чисел (розміром в 1 байт) mas(i, j) з


розмірністю

4 на 4 (i=0...3, j = 0...3):

23 04 05 67

05 06 07 99

67 08 09 23

87 09 00 08

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


витягнути, наприклад, елемент mas(2, 3)=23, то:

Ефективна адреса mas(2, 3)= mas + 4 * 1 * 2 + 3 = mas + 11

У програмі це виглядатиме приблизно так:

;Фрагмент програми вибірки елементу ;массива mas(2,3) і його

обнулення

.data

mas db
23,4,5,67,5,6,7,99,67,8,9,23,87,9,0,8

i=2

j=3

.code

...

mov si,4*1*i

mov di,j

mov al,mas[si][di] ;в al елемент mas(2,3)

41. Вкажіть, чим необхідно керуватися для


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

1.Безпосередньо звертатися до пристроїв вводу-виводу. Цей спосіб є


єдиним у разі програмування

«голої» машини. Коли повністю відсутні готові процедури для роботи із


зовнішніми пристроями.

2.Використання процедур BIOS, розміщених в ПЗП (постійно записуючий


пристрій) і відповідно постійно присутніх в ПК (звернення до функцій BIOS). Цей
спосіб використовується при програмуванні в відсутність операційної системи.

3.Звернення до сервісів ОС із запитами на введення-виведення для


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

Будь-яка операційна система обов'язково забезпечує символьний


введення-виведення та операції для роботи з файлами.
42. Охарактеризуйте символьне введення-
виведення інформації на асемблері.
Символьне введення-виведення. Для введення символу досить
користуватись функцією 01 DOS:

· Mov ah, 01; номер функції поміщаємо в ah

· Int 21h; передаємо керування DOS

Далі ОС поміщає код натиснутої клавіші в регістр ah і повертає


управління програмі. Для виведення символу призначена функція 02:

· Mov ah, 02; номер функції поміщаємо в ah

· Mov dl, '*'; код символу, що виводиться поміщаємо в dl

· Int 21h; передаємо керування DOS

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


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

43. Охарактеризуйте введення-виведення


на консоль чисел в різних системах числення.
Вивід на консоль чисел в різних системах числення зводиться до того,
щоб перетворити двійкове число в рядок символів, а потім вивести цей рядок
на екран. Для початку розглянемо дві корисні процедури, які будуть
використовуватися в подальшому. Щоб постійно не звертатися в коді в функції
DOS 09h, зручно написати маленьку процедуру для виведення рядка:

Процедура виведення рядки на консоль

; DI - адреса рядка

print_str:

push ax

mov ah, 9; Функція DOS 09h - вивід рядка

xchg dx, di; Обмін значеннями DX і DI


int 21h; Звернення до функції DOS

xchg dx, di; Обмін значеннями DX і DI

pop ax

ret

Як параметр передається адреса рядка в регістрі DI. Рядок повинен


закінчуватися символом '$'. Тут використовується команда XCHG, яка виконує
обмін значеннями двох операндів.

Друга корисна процедура - вивід кінця рядка. Вона викликає першу


процедуру для виведення двох символів CR (13) і LF (10). Викликається без
параметрів і не змінює регістри.

; Процедура виведення кінця рядка (CR + LF)

print_endline:

push di

mov di,

endline; DI = адреса рядка з символами CR, LF

call print_str; Виведення рядка на консоль

pop di

ret ... endline db 13,10, '$'

44. Опишіть процедуру виводу чисел у


двійковому вигляді.
Потрібно проаналізувати всі біти числа і помістити в рядок символи
"0" або "1" в залежності від значення відповідного біта. Зручно робити це
за допомогою циклічного зсуву в циклі. Зрушений біт виявляється в
прапорі CF, а після завершення циклу в регістрі те ж значення, що і на
початку. Процедура byte_to_bin_str перетворює байт в регістрі AL в рядок.
Адреса буфера для рядка передається в регістрі DI. Процедура завжди
записує в буфер 8 символів, так як в байті 8 біт.
45. Опишіть процедуру виводу чисел у
десятковому вигляді.
Щоб перетворити число в десятковий рядок необхідно в циклі
ділити його на 10 (це основа системи числення). Отже, перетворення числа
в рядок знаків проводиться послідовним цілочисельним поділом на
підставі системи числення до отримання нуля і збереженням залишків від
ділення. Отримані залишки і є цифрами, якими записується число. Далі
необхідно перетворити цифри в коди відповідних символів (додати 48 -
код символу '0') і в зворотному порядку вивести їх на екран.

46. Вкажіть, яким чином відбувається


обчислення виразів у асемблері.
В асемблері поняття виразів істотно відрізняється від мов високого рівня.
Вирази в асемблері розраховуються при трансляції, і в них можуть
використовуватися тільки імена, значення яких відомі транслятору. При цьому
слід пам'ятати, що значеннями міток (та імен областей пам'яті) є зміщення від
початку сегмента, і вони можуть брати участь у виразах. У асемблерних
виразах можна використовувати чотири цілочисельні арифметичні операції: +, -,
*, /, і чотири логічні -and, or, not, xor. У виконуваному модулі замість виразів
будуть присутні константи, що є результатом обчислення значень цих виразів
транслятором.

47. Вкажіть, яким чином реалізована у


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

байт - резервується директивою db; слово (2 байти) - резервується


директивою dw; подвійне слово (4 байти) - резервується директивою dd;
квадрослово (8 байтів) - резервується директивою dq.

Іноді виникає ситуація, коли необхідна розрядність операндів перевищує


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

В основі багаторозрядних додавань, віднімання та множення лежить


уявлення операндів у вигляді двох доданків:

де X - подвійне слово; Хh - старше слово X; Хl - молодше слово X.

Тоді додавання двухсловних X і У виглядає наступним чином:

І фактично зводиться до попарного додаванню молодших і старших слів


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

You might also like