You are on page 1of 36

Перелік питань на модульний контроль №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