You are on page 1of 27

1

Лабораторна робота №8
ДОСЛІДЖЕННЯ МІКРОПРОЦЕСОРА 8086, СИСТЕМИ КОМАНД
ТА РОЗРОБКА ЕЛЕМЕНТАРНИХ ПРОГРАМ НА МОВІ АСЕМБЛЕРА

Мета роботи:
 Отримати основні поняття роботи мікропроцесора. Розробка програм
обчислення простих арифметичних виразів та обробки бітової
інформації.

Теоретичний матеріал

1. Типи даних та їх представлення у комп’ютері


Основною і неподільною одиницею даних є біт. Слово «bit» — це
скорочення від «binary digit» – двійкова цифра. Біт може приймати два значення
— 0 і 1 (хибність або істина, вимкнено або включено).
Двійкове число містить стільки бітів, скільки двійкових цифр в його
записі, тому діапазон допустимих значень визначається з кількості розрядів
(цифр), відведених для числа. Візьмемо додатне ціле двійкове число, що
складається із чотирьох бітів, то тоді воно може виражати 2 4 або шістнадцять
різних значень.
Біти (розряди) двійкового числа нумеруються справа наліво, від найменш
значущого до найбільш значущого. Нумерація починається з 0. Крайній правий
біт числа – це біт з номером 0 (перший біт). Цей біт називається LSB-бітом
(Least Significant Bit – найменш значущий біт). Подібно до цього крайній лівий
біт називається MSB-бітом (Most Significant Bit – найбільш значущий біт).
Як ви вже знаєте комп’ютер оперує тільки двійковими числами, які часто
зручно представляти у вигляді шістнадцяткового числа. Так як ми будемо мати
справу з різними системами числення то будемо використовувати наступні
позначення для запису чисел в різних системах числення:
 запис шістнадцяткового числа починається з 0х чи $ або закінчується
символом «h». Якщо перша цифра шістнадцяткового числа – символ A-F,
то перед таким числом потрібно обов’язково написати «0» щоб
компілятор зрозумів, що перед ним число, а не ідентифікатор, наприклад,
0DEADh. Таким чином, записи 0x1234, $01234 і 01234h представляють
число (1234)16;
 десяткові числа можуть записуватися без змін або закінчуватися
постфіксом «d». Наприклад, 1234 і 1234d представляють число(1234)10;
 двійкові числа повинні закінчуватися постфіксом «b», наприклад, 1100b –
це (1100)2;
 вісімкові числа закінчуються на «o»: 12o – це (12)8.
Комп’ютер не працює з окремими бітами, зазвичай він оперує групами
бітів, наприклад, група з восьми бітів утворює базовий тип даних, який
називається байтом. Вісім бітів у байті – це не закон природи, а кількість,
довільно вибрана розробниками IBM, які створювали перші комп’ютери.
2

Більші групи бітів називаються словом (word) або подвійним словом (dword –
double word). Щодо PC-сумісних комп’ютерів ми можемо сказати наступне:

Один байт – це найменша кількість даних, що може бути прочитана з


пам’яті або записано в неї, тому кожен байт пам’яті має індивідуальну адресу.
Байт може містити число в діапазоні 0-255 (то є 28=256 різних чисел). У
більшості випадків цього значення недостатньо, тому використовується
наступна одиниця даних – слово. Слово може містити число в діапазоні 0-65535
(тобто 216= 65 536 різних значень). Подвійне слово має діапазон значень 0-4 294
967 295 (232= 4 294 967 296 значень).

Від біта до подвійного слова

Ще за часів перших комп’ютерів, ємність носіїв інформації


представлялася в байтах. З часом технології удосконалились ціни на пам’ять
падали, а вимоги до обробки інформації зростали. Тому вказувати ємність у
байтах стало незручно. Вирішили, що ємність буде виражатися в кілобайтах
(KB, Kb, Кб або просто k). Але, на відміну від міжнародної системи SI,
приставка «кіло» означає не 1000, а 1024. Чому саме 1024? Оскільки все в
комп’ютері було зав’язано на двійковій системі, для простоти будь-яке значуще
число повинне було виражатися як степінь двійки. 1024 – це 2 10. Наступні
приставки – М (мегабайт, MB, Mb, Мб), G (гігабайт, GB, Гб), Т (терабайт, TB,
ТБ) і Р (петабайт, РВ, ПБ) – обчислюються множенням 1024 на попереднє
значення, наприклад, 1 Кб = 1024, отже, 1 Мб = 1 Кб * 1024 = 1024 * 1024 = 1
048 576 байт.
У мовах програмування високого рівня є спеціальні типи даних, що
дозволяють зберігати символи та рядки. У мові Асемблера таких типів даних
немає. Замість них для представлення одного символу використовується байт, а
для подання рядка – група послідовних байтів. Тут все просто. Кожне значення
3

байта відповідає одному з символів ASCII-таблиці (American Standard Code for


Information Interchange). Перші 128 символів – символи управління, латинські
літери, цифри – однакові для всіх комп’ютерів та операційних систем.
Давайте розглянемо таблицю кодів ASCII:

Шістнадцяткові цифри в заголовках рядків і стовпців таблиці


представляють числові значення окремих символів. Наприклад, координати
великої латинської літери А – 40 і 1. Склавши ці значення, отримаємо 0x41
(тобто 65 в десятковій системі) – код символу 'A' в ASCII-коді. Друковані
символи в ASCII-таблиці починаються з коду 0x20 (або 32d). Символи з кодом
менше 32 представляють так звані керуючі символи. Найбільш відомі з них – це
0хA або LF – розрив рядка, і 0xD CR – повернення каретки.
Важливість керуючих символів CR і LF обумовлена тим, що вони
позначають кінець рядка – той символ, який у мові програмування С
позначається як \n.
Символи з кодами від 128 до 256 і вище стали «жертвами» різних
стандартів і кодувань. Зазвичай вони містять національні символи, наприклад, у
4

нас це будуть символи українського алфавіту і, можливо, деякі символи


псевдографіки, у Чехії – символи чеського алфавіту і т.д.

2. Поняття мікропроцесора
Структура мікропроцесора Intel 8086
Мікропроцесор в найзагальнішому вигляді можна подати як набір чорних
ящиків (окремих його частин), які виконують цілком певні функції. До таких
чорних ящиків відносять:
 операційний пристрій;
 шинний інтерфейс;
 арифметично-логічний пристрій;
 лічильник команд ІР;
 конвеєр;
 пристрій управління.
Під операційним пристроєм традиційно розуміють набір регістрів через
які мікропроцесор спілкується з периферією. Під регістром розуміють
поіменовану комірку пам’яті.
Під шинним інтерфейсом розуміють 3 шини (шини адресу, даних,
управління).
Під арифметично-логічним пристроєм розуміють пристрій, який
виконує необхідні операції (власне процесор), а також те, що цьому сприяє –
регістр прапорців і пристрій управління.
Лічильник команд IP – основний регістр з якого пристрій управління
бере дані про команду і як слід виконати наступні.
Конвеєр – набір комірок пам’яті в які загружені команди, які будуть
виконуватися наступними. Конвеєри дозволяють прискорити роботу процесора,
оскільки деякі команди можна виконувати паралельно, а також процес передачі
даних по шинах є традиційно дуже повільним.
Пристрій управління – забезпечує синхронізацію роботи всіх пристроїв.
Саме він синхронізує пристрої по шині управління, генерує переривання
завдяки яким обслуговується вся периферія навколо процесора.
Структуру мікропроцесора показано на рис.1.
5

Рис. 1. Структура мікропроцесора

Регістри
Одним з найважливіших пристроїв є регістр. Кожному з регістрів
присвоюється індивідуальне ім’я. Всі регістри майже рівноправні, але деяким
надано спеціальні функції.
Історично склалось, що перші 8-бітові регістри були доповнені до рівня
16-бітових регістрів і стали називатись АХ, ВХ (рис.2). На сучасних машинах
з’явились розширені регістри (EAX).
Ми будемо оперувати регістрами: AX (AH, AL), BX (BH, BL), CX (CH,
CL), DX (DH, DL), і т.д. Структура регістра AX (16-бітовий) представлена на
рис.2, регістр AX складається із двох 8-бітовий регістрів AH – старша тетрада,
AL – молодша тетрада.

Рис.2. Структура регістра AX

Регістри загального призначення AX, BX, CX, DX і є тим основним


інструментом, який передає дані з пам’яті в мікропроцесор. Інакше кажучи всі
операнди команд мікропроцесора можуть бути передані через ці регістри.
Особливе призначення цих регістрів є наступні:
 EАХ-акумулятор – в ньому зберігається результати арифметичних
операцій, принаймні множення і ділення можна виконати тільки через
нього.
 EВХ (base) – базові провідні, спеціальні форми адресації (адресація по
базі).
 EСХ (counter – лічильник) – через СХ можна запускати встроєні цикли
loop.
6

 EDX (data) – через нього передають дані, особливо тоді, коли


використовується міжсегментна адресація.
До регістрів загального призначення іноді відносять й індексні регістри
процесора 80386 – ESI, EDI і ЕВР (або SI, DI і ВР для 16-розрядних дій).
Зазвичай ці регістри використовуються для адресації пам’яті: звернення до
масивів, індексації тощо. Звідси їхні імена: індекс джерела (Source Index),
індекс приймача (Destination Index), вказівник бази (Base Pointer). Але зберігати
у них тільки адреси зовсім не обов’язково: регістри ESI, EDI і ЕВР можуть
містити довільні дані. Ці регістри програмно доступні, тобто їх вміст може бути
змінено програмістом. Інші регістри краще «руками не чіпати». У регістрів ESI,
EDI і ЕВР існують тільки 16-розрядні і 32-розрядні версії.
Регістр ESP (SP) – це вказівник пам’яті, який вказує на вершину стека
(х86-сумісні процесори не мають апаратного стека).
Сегментні регістри. Цю групу регістрів можна віднести до регістрів
стану. Регістри з цієї групи використовуються при обчисленні реальної адреси
(адреса, яка буде передано на шину адрес). Процес обчислення реальної адреси
залежить від режиму процесора (реальний або захищений). Сегментні регістри
тільки 16-розрядні, такі ж, як в 80286. Назви цих регістрів відповідають
виконуваним функціям: CS (Code Segment, сегмент коду) разом з EIP (IP)
визначають адресу пам’яті, звідки потрібно прочитати наступну інструкцію;
аналогічно регістр SS (Stack Segment, сегмент стеку) в парі з ESP (SS:SP)
вказують на вершину стеку. Сегментні регістри DS, ES, FS, і GS (Data, Extra, F і
G сегменти) використовуються для адресації даних в пам’яті.

Лічильник команд (регістр IP)


Оскільки з точки зору процесора всі комірки пам’яті рівноправні і вони
ніяк не підписані додатково, то процесор сам не може розібрати, яка саме
інформація міститься в них (дані числового характеру, текстового, програми,
музика і ін.). Для того, щоб «розказати» мікропроцесорові де лежить програма
(точніше де розпочинається) існує спеціальний регістр ІР (EIP). Це так званий
лічильник команд, який завжди вказує з якої комірки слід взяти число, щоб
його інтерпретувати як команду. Більш строго слід вказати, що таке число
береться за адресою CS:ІР. Причому, як тільки команда виконується
мікропроцесор автоматично замінить вміст ІР. Саме в цьому і заключається
алгоритм роботи МП:
 Взяти число з CS:ІР;
 Вияснити, скільки байт обслуговує команду, яка кодується даним числом;
 Саме на таке число зміниться ІР перед тим, як процесор приступить до
виконання даної команди;
 Вернутись до (1).

Регістр прапорців (EFLAGS)


Для роботи програми важливим є регістр прапорців. Іноді його називають
регістром ознак – EFLAGS. Він складається з однорозрядних прапорців, що
відображають в основному поточний стан арифметико-логічного пристрою. Так
7

наприклад біт Т (trace) відповідає за покрокове виконання команд МП і якщо


він встановлений то тоді всі програми виконуватимуться покроково. Біт (U)
роказує в яку сторону будуть відбуватись зсуви в тексті інформації. (Z) zero –
даний результат 0 чи ні. (С) cary – перенос. (O) overflow – переповнення. (Р)
parity – парність (парна чи не парна кількість „1” в даному байті).
Ситуація в процесорі настала, якщо прапорець піднято (він=1) і не
настала, якщо опущено.

EFLAGS (біти)

У наших програмах ми будемо використовувати не всі 32 прапорця, поки


розглянемо лише найважливіші з них:
 Ознака нуля ZF=1 (Zero Flag), якщо результат попередньої операції
дорівнює нулю.
 Ознака знаку SF=1 (Sign Flag), якщо результат попередньої операції
від’ємний.
 Ознака переповнення OF=1 (Overflow Flag), якщо під час виконання
попередньої операції сталося переповнення (overflow), тобто результат
операції більше, ніж зарезервована для нього пам’ять.
 Ознака перенесення CF=1 (Carry Flag), якщо біт був «перенесено» і став
бітом більш високого порядку (про це ми поговоримо, коли будемо
розглядати арифметичні операції).
 Ознака переривання IF=1 (Interrupt Flag), якщо переривання процесора
дозволені.
 Ознака напрямку DF (Direction Flag) – використовується для обробки
рядків.

3. Найпростіші команди мови Асемблера


Дані, які обробляються командами, називаються операндами. Операнди в
мові Асемблера записуються безпосередньо після команди, якщо їх декілька, то
через кому. Одні команди взагалі не мають ніяких операндів, інші мають один
або два операнди. Як операнд можна вказати безпосереднє значення
(наприклад, 0x123), ім’я регістра або посилання на комірку пам’яті (так звані
непрямі операнди).
Що ж до розрядності, є 32-розрядні, 16-розрядні, і 8-розрядні операнди.
Майже кожна команда вимагає, щоб операнди були однакового розміру
(розрядності). Наприклад команда: MOV АХ, 0x1234 – має два операнди:
регістр і безпосереднє значення, і обидва вони 16-бітні.

Опис даних
Щоб описати дані в оперативній пам’яті або зарезервувати для них місце,
використовуйте одну з директив, перерахованих у табл.1.
8

Таблиця 1
Кількість
байт в порції Команда Приклад
даних
1 db db 1,3,8; три послідовних байти
2 dw dw 0x1234; двобайтове число в пам’яті розміститься так
0х34, 0x12
4 dd number dd 0x1; змінна number ініціалізована значенням 1
Змінна «number» тепер представляє адресу в пам’яті, за яким
записано значення 0x00000001 довжиною в подвійне слово.

За директивою опису даних повинно слідувати одне або кілька числових


значень, розділених комами. Ці вирази визначають значення для найпростіших
елементів даних, розмір яких залежить від того, яка директива
використовується. Наприклад «db 1,2,3» описує три байти зі значеннями 1, 2 і 3
відповідно.
Директива «db» також підтримує рядки будь-якої довжини, взяті в лапки,
які будуть конвертовані в послідовність байтів. Наприклад, "db 'abc'" визначає
три байти зі значеннями 61, 62 і 63.
Всі перераховані директиви підтримують використання спеціального
оператора «Dup» для створення копій даних значень. Кількість примірників
повинна стояти перед цим оператором, а їх значення повинне стояти після – це
може бути навіть ланцюг значень, розділених комами, але цей ланцюг має бути
взятий в дужки, наприклад «db 5 dup (1,2)» визначає п’ять копій даної
послідовності з двох байт.
Всі директиви опису даних також підтримують значення «?», що означає,
що в цю комірку не повинно бути присвоєно якесь конкретне значення.

Команда пересилки даних MOV


MOV – команда пересилки даних. Хоча її назва походить від слова move
– переміщати, вона не переміщає, а копіює дані. Ця команда використовується
у варіанті
Схема команди: MOV <параметр 1>, <параметр 2> ,
де операнд <параметр 2> може бути регістр, число або вміст комірки
пам’яті, а операнд <параметр 1> – тільки регістр або комірка пам’яті.

Приклади виконання команди MOV:


mov AX,12;
mov CX,100;
mov IP,112.
mov AL, [CS:IP] – вміст комірки пам’яті.
mov AL, BX – невірна розрядність;
mov BL, [CX] – правильно;
mov DX, AX – правильно;
mov AL, AL – правильно хоч і без толку;
mov 5, AL – цифрі неможливо присвоїти інформацію;
9

mov AL, 100 – правильно;


mov BH, 300 – 8 біт це число до 255, а регістр ВН 8-бітовий;
mov AX, AB – немає регістра АВ.

Використовуючи дану команду слід особливо пильнувати стосовно


відповідності даних між собою. Мається на увазі те, що не можна присвоювати
16-бітові числа 8-бітним регістрам чи 8-бітні числа 16-бітним регістрам тощо.
Команда MOV застосовується для пересилання даних, при цьому,
незважаючи на всю простоту цієї дії, необхідно пам’ятати про деякі обмеження
й особливості виконання даної операції:
 напрямок пересилання в команді MOV завжди виконується зліва направо,
тобто з другого операнда в перший;
 значення другого операнда не змінюється;
 обидва операнда не можуть бути одночасно в пам’яті;
 тільки один з операндів може бути сегментним регістром;
 бажано використовувати в якості одного з операндів акумулятор, тобто
один з регістрів AL/AX/EAX, тому що в цьому випадку Асемблер генерує
більш швидку форму команди MOV.

Команда обміну XCHG


Команда обміну XCHG замінює місцями значення двох осередків. Ця
команда може замінити місцями вміст двох регістрів, або регістра і пам’яті. У
цьому випадку операндами не використовують сегментні регістри. Команда
XCHG замінює три команди пересилання і не вимагає проміжного елемента
пам’яті. Якби команда обміну не існувала, програмі необхідно було б здійснити
три пересилання, щоб обміняти значення в регістрі AX і в регістрі BX.
Спочатку вона повинна була б переслати вміст регістра AX в робочий
осередок, потім переслати вміст регістра BX в регістр AX, і, нарешті, переслати
вміст робочого осередку в регістр BX. Команда XCHG одна виконує цю
операцію.

Команди двійкового додавання та віднімання


Команди двійкового додавання та віднімання обробляють знакові та
беззнакові цілі числа розміром у байт, слово та подвійне слово.
а) Команда додавання двох чисел ADD.
Схема команди: ADD <параметр 1>, <параметр 2>
Алгоритм роботи: до операнда параметр 1 додається операнд параметр
2, результат записується в – параметр 1.
б) Команда віднімання двох чисел SUB.
Схема команди: SUB <параметр 1>, <параметр 2>
Алгоритм роботи: від операнда параметр 1 віднімається операнд
<параметр 2>, результат записується в – параметр 1.

Розглянемо, що відбудеться, якщо спочатку занести в AL (8-розрядний


регістр) найбільше допустиме значення якого (255), а потім додати до нього 8:
10

MOV AL, 255 ; заносимо в AL значення 255, тобто 0xFF


ADD AL, 8 ; додаємо число 8

У результаті в регістрі AL ми отримаємо значення 7.

Але ж ми очікували 0x107 (263 в десятковому вигляді). Що сталося? У


регістрі AL може поміститися тільки 8-розрядне число (максимальне значення
– 255). Дев’ятий, «втрачений», біт прихований в регістрі ознак, а саме в
прапорці CF – ознака переносу. Ознака переносу використовується в
арифметичних командах при роботі з більшими діапазонами чисел, ніж можуть
підтримувати регістри.
Корисними для такого випадку є команди ADC (Add With Carry –
додавання з переносом) і SBB (Subtract With Borrow – віднімання з
позичанням).
в) Команда додавання двох чисел ADC (додавання з перенесенням).
Схема команди: ADC <параметр 1>, <параметр 2>
Алгоритм роботи: до операнда параметр 1 додається операнд параметр
2 та значення прапорця CF, результат записується в – параметр 1.
г) Команда віднімання двох чисел SBB (віднімання з позичанням).
Схема команди: SBB <параметр 1>, <параметр 2>
Алгоритм роботи: від операнда параметр 1 віднімається операнд
<параметр 2> та значення прапорця CF, результат записується в – параметр 1.

Команди інкременту INC і декременту DEC


а) Команда збільшення значення операнда на одиницю INC.
Схема команди: INC операнд
Алгоритм роботи: до операнда додається одиниця.
б) Команда зменшення значення операнда на одиницю DEC.
Схема команди: DEC операнд
Алгоритм роботи: від операнда віднімається одиниця.
Допустимі типи операнда такі ж, як у команд ADD і SUB.
11

4. Від’ємні числа – цілі числа зі знаком


Ціле число може займати будь-яке число байтів, але система команд мови
Асемблера підтримує числа розміром у байт (8 біт), слово (16 біт), подвійне
слово (32 біти) та елемент даних у 8 байт (64 біти).
Цілі числа мають дві форми представлення: цілі числа без знаку та цілі
числа зі знаком.
Числа зі знаком використовуються для представлення додатних та
від’ємних чисел, а без-знакові, тільки додатних чисел. У представленні без-
знакового числа всі біти – інформаційні (рис.3), а в представленні знакового –
старший біт відводиться для знаку (рис.4). Вважається, що біт 0 – молодший
біт і розташовується крайнім справа. Старший біт – 7 (15, 31 або 63) – тобто
крайній зліва біт, відповідно до елементів даних розміром байт, слово, подвійне
слово та 8 байт.
Для знакових чисел значення 0 старшого біту визначає додатне число, а
значення 1 визначає від’ємне число.

Інформаційне поле
2
31 30 29 … 4 3 2 1 0
8
Старши
Біти Молодший
й
Рис.3. Форма представлення 32-бітового без-знакового числа

Знак Інформаційне поле


3
31 30 39 … 4 3 2 1 0
8
Старши
Біти Молодший
й
Рис.4. Форма представлення 32-бітового знакового числа

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


Доповняльний код можна уявити собі як відображення деякого діапазону, що
включає додатні і від’ємні цілі числа, на інший діапазон, який містить лише
додатні цілі числа. Розглянемо доповняльний код одного байта. Один байт
може містити числа в діапазоні від 0 до 255. Код доповнення замінює цей
діапазон іншим – від -128 до +127. Діапазон від 0 до 127 відображається сам на
себе, а від’ємним числам ставиться у відповідність діапазон від 128 до 255:
числу «-1» відповідає число 255 (0xFF), «-2» – 254 (0xFE) тощо.
Зверніть увагу: найстарший біт негативного числа завжди встановлюється
в 1 – так можна визначити, що число від’ємне.
Доповняльний код може бути розширений до 2-ох байтів (від 0 до 65535).
Він буде охоплювати діапазон чисел від -32768 до +32767. Якщо доповняльний
код розширити до 4-ох байтів, то отримаємо діапазон від -2147483648 до
+2147483647.
Виконувати арифметичні операції над від’ємними числами в
доповняльму коді можна за допомогою звичайних команд ADD і SUB.
12

Розглянемо, як це відбувається, на прикладі суми чисел «-6» і «7» в


доповняльному коді з 2-ох байтів. Число 7 буде відображено само в себе, а
число «-6» буде представлено числом 65536-6 = 65530 (0xFFFA). Що вийде,
якщо ми додамо ці два числа (7 і 65530)? Спробуємо вирішити це завдання на
мові Асемблера:

mov AX, 0XFFFA ; AX=–6, тобто 65530 або 0xFFFA


mov DX, 7 ; DX=7
add AX, DX ; AX=AX+DX

Ми отримаємо результат 65530+7=65 537=0x10001, який не вміщається в


регістрі АХ, тому буде встановлено прапорець переносу CX. Але якщо ми його
проігноруємо, тоді те значення що залишилося в АХ буде правильним
результатом. Механізм доповняльного коду ввели саме для того, щоб при
додаванні і віднімання від’ємних чисел не доводилося виконувати додаткових
дій.
Тепер давайте додамо два від’ємних числа. Емулятор Emu8086 дозволяє
вказувати від’ємні числа безпосередньо, тому нам не потрібно перетворювати
їх вручну в доповняльний код:

mov AX, –6
mov DX, –6
add AX, DX

Отримається результат 0xFFF4 (встановлений також прапорець CF, але


ми його ігноруємо). У десятковій системі 0xFFF4=65524. У доповняльному коді
ми отримаємо правильний результат: -12 (65536-65524 =12).
Знакові цілі числа записуються в двійковій системі числення, займаючи
всі розряди осередку даних, крім знакового біту. Додатні знакові
представляються, як без-знакові у межах інформаційного поля. Від’ємні цілі
числа представляються у доповняльному коді, в якому враховано розмір
осередку даних (байт, слово, подвійне слово або 8 байтів).

Розглянемо для прикладу десяткове число «-89».


1) Прямий код числа 89, який в двійковій системі числення має представлення
1011001 записується:
а) в осередок даних розміром «байт» (у шістнадцятковій системі числення
– 59h).
Біти 7 6 5 4 3 2 1 0
Числ
0 1 0 1 1 0 0 1
о
h 5 9
Форма представлення 8-бітового без-знакового числа 89

б) в осередок даних розміром «слово» (у шістнадцятковій системі


числення – 0059h).
13

1
Біти 15 13 12 11 10 9 8 7 6 5 4 3 2 1 0
4
Число 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1
h 0 0 5 9
Форма представлення 16-бітового без-знакового числа 89
в) в осередок даних розміром «подвійне слово» (у шістнадцятковій
системі числення – 00000059h).
Біти 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
Числ
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
о
h 0 0 0 0
Біти 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Числ
0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1
о
h 0 0 5 9
Форма представлення 32-бітового без-знакового числа 89

2) Здійснюємо інверсію.
Для даних розміром «байт» у шістнадцятковій формі – А6h, для даних
розміром «слово» у шістнадцятковій формі – FFА6h та для даних розміром
«подвійне слово» у шістнадцятковій формі – FFFFFFА6h.

Біти 7 6 5 4 3 2 1 0
Числ
1 0 1 0 0 1 1 0
о
h A 6
Форма представлення 8-бітової інверсії числа 89

1
Біти 15 13 12 11 10 9 8 7 6 5 4 3 2 1 0
4
Число 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 0
h F F A 6
Форма представлення 16-бітової інверсії числа 89

Біти 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
Числ
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
о
h F F F F
Біти 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Числ
1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 0
о
h F F A 6
Форма представлення 32-бітової інверсії числа 89

3) Додаємо 1, отримаємо представлення від’ємного числа –89 у


доповняльному коді.
14

Для даних розміром «байт» у шістнадцятковій формі – А7h, для даних


розміром «слово» у шістнадцятковій формі – FFА7h та для даних розміром
«подвійне слово» у шістнадцятковій формі – FFFFFFА7h.

Біти 7 6 5 4 3 2 1 0
Числ
1 0 1 0 0 1 1 1
о
h A 7
Форма 8-бітового доповняльного числа –89

1
Біти 15 13 12 11 10 9 8 7 6 5 4 3 2 1 0
4
Число 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1
h F F A 7
Форма 16-бітового доповняльного числа –89

Біти 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
Числ
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
о
h F F F F
Біти 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Числ
1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1
о
h F F A 7
Форма 32-бітового доповняльного числа –89

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

Приклад. Число 89 в регістрі АХ


1 1 1
Біти 14 13 11 9 8 7 6 5 4 3 2 1 0
5 2 0
AX 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1
h 0 0 5 9
AH AL
Форма представлення числа 89 в регістрі АХ

Приклад. Число «-89» в регістрі АХ.


1 1 1
Біти 14 13 11 9 8 7 6 5 4 3 2 1 0
5 2 0
AX 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 0
h F F A 6
AH AL
Форма представлення числа «-89» в регістрі АХ

5. Команди логічних операцій


Як відомо, логічні операції є важливим елементом в проектуванні
15

цифрових електронних схем. Але двійкова логіка має також багато спільного із
логікою програмування. Наприклад, всі арифметичні операції здійснюються на
апаратному рівні як послідовність великого числа логічних операцій. В мові
програмування Асемблер підтримується п’ять головних команд для виконання
логічних операцій: AND, OR, XOR, NOT та TEST.
Ці команди обробляють один байт або одне слово в регістрі або в комірці
пам’яті. Встановлюють прапори: CF (прапорець переносу), OF (прапорець
переповнення), PF (прапорець парності), SF (прапорець знака), ZF (прапорець
нуля).
Працюють команди логічних операцій наступним чином:
а) Команда логічного множення – AND ( Логічне І)
Схема команди: AND приймач, джерело
Призначення: операція логічного множення для операндів, приймач і
джерело розмірністю байт, слово або подвійне слово.
Алгоритм роботи: виконати операцію логічного множення над бітами
операндів, при цьому кожен біт результату дорівнює 1, якщо відповідні біти
операндів рівні 1, в інших випадках біт результату дорівнює 0; записати
результат операції в приймач;
б) Команда логічного множення TEST – працює як команда AND, але
тільки змінює прапорці стану, не впливаючи на результат. Може бути
використана для перевірки окремих байтів числа на наявність одиниць. Не
змінює операнд (приймач).
в) Команда логічного додавання – OR ( Логічне АБО)
Схема команди: OR приймач, джерело
Призначення: операція логічного АБО над бітами операндів.
Алгоритм роботи: виконати операцію логічного додавання над бітами
операндів, при цьому біт результату дорівнює 0, якщо відповідні біти операндів
джерела і приймача рівні 0, у противному випадку біт дорівнює 1; записати
результат операції в – приймач (операнд джерело залишається незмінним);
г) Команда логічного додавання за модулем двійки – XOR
Схема команди: XOR приймач , джерело
Призначення: операція логічного виключного АБО над двома операндами
розмірністю байт, слово або подвійне слово.
Алгоритм роботи: виконати операцію логічного виключного АБО над
бітами операндів, причому біт результату дорівнює 1, якщо значення
відповідних бітів операндів різні, в інших випадках біт результату дорівнює 0;
записати результат в приймач;
д) Команда логічного заперечення бітів операнда – NOT
Схема команди: NOT джерело
Призначення: інвертування всіх бітів операнда джерело.
Алгоритм роботи: інвертувати всі біти операнда джерела: з 1 у 0, з 0 у 1.

Приклади виконання логічних команд наведені в табл:

Команда AND OR XOR NOT


16

Перше число 10100101 10100101 10100101 10100101


Друге число 10010011 10010011 10010011 -
Результат 10000001 10110111 00110110 01011010

6. Команди зсуву бітів числа


В мові Асемблер існує чотири команди зсуву бітів – SAR, SAL, SHR та
SHL. Зсув може здійснюватись праворуч або ліворуч на 8 позицій для байта або
на 16 для слова. Команди містять по 2 операнди – регістр або комірку пам’яті,
де міститься байт або слово, які треба обробити, та вказівник на кількість
позицій зсуву. Зсув на одну позицію може бути вказаний безпосередньо, а для
зсуву на дві позиції або більше треба вказати кількість позицій у регістрі CL.
На відміну від попередніх команд з двома операндами тут перший
операнд є водночас і джерелом, і приймачем, тобто число, над яким
проводиться зсув, змінюється безпосередньо у тій комірці пам’яті або регістрі,
куди воно було завантажене. Зрозуміло, що само число при такий операції
втрачається. Другим операндом команди зсуву може бути або безпосередньо
число 1, або регістр CL.
Команда SHR визначає логічний зсув праворуч без урахування знака, а
команда SAR – арифметичний зсув праворуч з урахуванням знака. Різниця між
цими командами полягає у тому, що для заповнення старшого байта при
виконанні команди SHR використовується нуль, а в команді SAR – біт знака.
а) Команда зсуву логічного операнда вправо – SHR
Схема команди: SHR операнд , кількість зсувів
Призначення: логічний зсув операнда вправо.
Алгоритм роботи: зсув всіх бітів операнда вправо на один розряд; при
цьому висунутий праворуч біт стає значенням ознаки переносу прапорця CF;
одночасно ліворуч в операнд засовується нульовий біт; зазначені вище дві дії
повторюються задану кількість раз, яка значена у другому операнді.
б) Команда зсуву арифметичного операнда вправо SAR
Схема команди: SAR операнд , кількість зсувів
Алгоритм роботи: зсув всіх бітів операнда вправо на один розряд, при
цьому висунутий праворуч біт стає значенням ознаки переносу прапорця CF;
одночасно ліворуч в операнд засовується не нульовий біт, а значення старшого
біта операнда; зазначені вище дві дії повторюються задану кількість раз, яка
значена у другому операнді.

Приклади використання команд SAR та SHR наведені у табл.


Приклад 1 Приклад 2
Асемблерна Асемблерна
Результат її виконання Результат її виконання
команда команда
MOV CL,3 CL=3 MOV CL,3 CL=3
MOV AX,10110111B AX=10110111B MOV AX,10110111B AX=10110111B
SHR AX,1 AX=01011011B SAR AX,1 AX=11011011B
SHR AX,CL AX=00001011B SAR AX,CL AX=11111011B
17

Оскільки при зсуві ліворуч молодші біти числа завжди замінюються


нулями, результат виконання команд SHL та SAL завжди буде однаковим.
в) Команда зсуву логічного операнда вліво – SHL
Схема команди: SHL операнд , кількість зсувів
Призначення: логічний зсув операнда вліво.
Алгоритм роботи: зсув всіх бітів операнда вліво на один розряд, при
цьому висунутий ліворуч біт стає значенням прапора переносу CF; одночасно
ліворуч в операнд засовується нульовий біт; зазначені вище дві дії
повторюються задану кількість раз, яка значена у другому операнді.
г) Команда зсуву арифметичного операнда вліво – SAL
Схема команди: SAL операнд , кількість зсувів
Призначення: арифметичний зсув операнда вліво.
Алгоритм роботи: зсув всіх бітів операнда вліво на один розряд, при
цьому висунутий ліворуч біт стає значенням ознаки перенесення CF; одночасно
праворуч в операнд засовується нульовий біт; зазначені вище дві дії
повторюються задану кількість раз, яка значена у другому операнді.
Важливим при виконанні команд арифметичного та логічного зсуву є те,
що біт, який звільнюється, переходить до прапорця перенесення. Це дає
можливість ефективно використовувати ці команди для множення та ділення
чисел на два.

7. Команди циклічного зсуву бітів числа


Циклічний зсув, на відміну від логічного та арифметичного, передбачає
перенесення біта, що зсувається, до розряду, який при цьому звільнюється. В
мові Асемблер існує чотири команди циклічного зсуву – ROR, ROL, RCR,
RCL.
Відмінність команд циклічного зсуву ROR та ROL від команд логічного
зсуву полягає у тому, що біт, який зсувається, переходить на позицію що
звільнюється.
а) Циклічний зсув операнда вліво – ROL
Схема команди: ROL операнд , кількість зсувів
Призначення: циклічний зсув операнда вліво.
Алгоритм роботи: зсув всіх бітів операнда вліво на один розряд, при
цьому старший біт операнда засовується в операнд праворуч і стає значенням
молодшого біта операнда; одночасно висунутий біт стає значенням ознаки
переносу CF; зазначені вище дві дії повторюються задану кількість раз, яка
значена у другому операнді.
б) Циклічний зсув операнда вправо – ROR
Схема команди: ROR операнд , кількість зсувів
Призначення: циклічний зсув операнда вправо.
Алгоритм роботи: зсув всіх бітів операнда вправо на один розряд, при
цьому молодший біт операнда засовується в операнд ліворуч і стає значенням
старшого біта операнда; одночасно цей молодший біт операнда стає значенням
ознаки переносу CF; зазначені вище дві дії повторюються задану кількість раз,
яка значена у другому операнді.
18

У командах RCR та RCL у зсуві приймає участь прапорець перенесення


CF. При цьому біт, який зсувається, переходить до прапорця CF, а значення
прапорця CF переходить до комірки, що звільняється. Як і в командах
логічного зсуву, зсув на одну позицію може бути вказаний безпосередньо, а для
зсуву на дві позиції або більше треба вказати кількість позицій у регістрі CL.
в) Циклічний зсув операнда вліво через ознаку переносу – RCL
Схема команди: RCL операнд , кількість зсувів
Призначення: циклічний зсув операнда вліво через ознаку переносу CF.
Алгоритм роботи: зсув всіх бітів операнда вліво на один розряд, при
цьому старший біт операнда стає значенням ознаки переносу CF; одночасно
старе значення ознаки переносу CF засовується в операнд праворуч і стає
значенням молодшого біта операнда; зазначені вище дві дії повторюються
задану кількість раз, яка значена у другому операнді.
г) Циклічний зсув операнда вправо через ознаку переносу – RCR
Схема команди: RCR операнд , кількість зсувів
Призначення: циклічний зсув операнда вправо через ознаку переносу CF.
Алгоритм роботи: зсув всіх бітів операнда вправо на один розряд, при
цьому молодший біт операнда стає значенням ознаки переносу CF; одночасно
старе значення ознаки переносу CF засовується в операнд ліворуч і стає
значенням старшого біта операнда; зазначені вище дві дії повторюються задану
кількість раз, яка значена у другому операнді.

8. Множення та ділення ціло-чисельних даних


Множення та ділення чисельних даних в мові Асемблер здійснюється за
допомогою команд MUL та DIV для без-знакових чисел та за допомогою
команд IMUL та IDIV для знакових чисел. Контроль над форматом чисел, що
обробляються, не може здійснюватись процесором автоматично, тому
вибирати для використання ту чи іншу команду повинен сам програміст.

а) Команда множення двох цілих чисел без знаку MUL


Схема команди: MUL множник
Алгоритм роботи: команда вимагає явної вказівки місця розташування
тільки одного співмножника, який може бути розташований у комірці пам’яті
або регістрі. Місце розташування другого співмножника фіксоване і залежить
від розміру першого співмножника:
 якщо операнд, зазначений у команді, розміром «байт», то другий
співмножник розташовується в AL;
 якщо операнд, зазначений у команді, розміром «слово», то другий
співмножник розташовується в AX;
 якщо операнд, зазначений у команді, розміром «подвійне слово», то
другий співмножник повинний розташовуватися в EAX.
Результат множення міститься також у фіксованому місці, обумовлене
розміром співмножників:
 при множенні байтів результат міститься в AX;
 при множенні слів результат міститься в парі DX:AX;
19

 при множенні подвійних слів результат міститься в парі EDX:EAX.


б) Команда множення двох цілих чисел зі знаком IMUL
Схема команди: IMUL множник
Схема команди: IMUL множник1, множник2; для і386 і вище
Схема команди: IMUL результат, множник1, множник2; для і386 і вище
Алгоритм роботи: Алгоритм команди з одним операндом співпадає з
алгоритмом команди MUL. Команди з двома і трьома операндами однозначно
визначають розташування результату і співмножників у такий спосіб:
 у команді з двома операндами перший операнд визначає місце
розташування першого співмножника. На його місце згодом буде
записаний результат. Другий операнд визначає місце розташування
другого співмножника;
 у команді з трьома операндами перший операнд визначає місце
розташування результату, другий операнд – місце розташування першого
співмножника, третій операнд може бути безпосередньо заданим
значенням розміром у байт, слово чи подвійне слово.
в) Ділення двох цілих чисел без знаку DIV та зі знаком IDIV.
Схема команди: DIV дільник; без знака
Схема команди: IDIV дільник; зі знаком
Алгоритм роботи: для команд необхідно задати два операнди – ділене і
дільник. Ділене задається неявно і розмір його залежить від розміру дільника,
що вказується в команді:
 якщо дільник розміром у байт, то ділене повинне бути розташоване в
регістрі AX. Після операції частка міститься в AL, а залишок – у AH;
 якщо дільник розміром у слово, то ділене повинне бути розташоване в
парі регістрів DX:AX, причому молодша частина діленого знаходиться в
AX. Після операції частка міститься в AX, а залишок – у DX;
 якщо дільник розміром у подвійне слово, то ділене повинне бути
розташоване в парі регістрів EDX:EAX, причому молодша частина
діленого знаходиться в EAX. Після операції частка міститься в EAX, а
залишок – у EDX.
Для команди IDIV залишок завжди має знак діленого. Знак частки
залежить від стану знакових бітів (старших розрядів) діленого і дільника.
Результатом ділення є частка і залишок від ділення. При виконанні операції
ділення можливе виникнення виняткової ситуації: 0 – помилка ділення. Ця
ситуація виникає в одному з двох випадків: дільник дорівнює 0 або частка
занадто велика для його розміщення в регістрі EAX/AX/AL.

9. Демонстрація розв’язку декількох завдань

Задача 1. Задано вміст регістрів AL (01110001b), BL (11010101b) і DL


(01010111b). Знайти вміст регістрів після виконання групи команд:
or BL, AL
and AL, DL
not AL
20

xor DL, BL
test AL, DL

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


Команди Вміст регістрів
or BL, AL; al (1111 0101 ) bl (1101 0101 ) dl( 0101 0111 )
and AL, DL; al (0101 0101 ) bl (1111 0101 ) dl( 0101 0111 )
not AL; al (1010 1010 ) bl (1111 0101 ) dl( 0101 0111 )
xor DL, BL ; al (1010 1010 ) bl (1111 0101 ) dl( 1010 0010 )
test AL, DL; al (1010 1010 ) bl (1111 0101 ) dl( 1010 0010 ).

Задача 2. Написати процедуру для обчислення виразу без використання


операцій множення (заміна зсувом вліво) та ділення (заміна зсувом вправо):
a=((a*2+1)/4+(c*2-d)/8+(d-1))/4+5-b*16,
де a=657, b=265, c=738, d=273.
Розв’язування.
org 100h
mov AX, a ;Записати в регістр AX число а
shl AX, 1 ;AX*2
inc AX ;AX+1
shr AX,2 ;AX/4
mov CX, c ;Записати в регістр CX число с
shl CX, 1 ;CX*2
sub CX, d ;Відняти d від вмісту регістра CX
shr CX,3 ;СХ/8
mov DX, d ;Записати в регістр DX число d
dec DX ;Зменшити вміст регістра DX на 1
add AX, CX ;Додати до вмісту регістра AX вміст регістра CX
add AX, DX ;Додати до вмісту регістра AX вміст регістра DX
shr AX, 2 ;АХ/4
add AX, 5 ;Додати 5 до вмісту регістра AX
mov BX, b ;Записати в регістр ВX число b
shl BX, 4 ;BX*16
sub AX, BX ;Відняти BX від вмісту регістра AX
ret
a dw 657
b dw 265
c dw 738
d dw 273

Задача 3. У програмі-емуляторі мікропроцесора EMU8086 (version 4.08)


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

MOV AL,0FFH ;записати в регістр AL число FF


21

MOV BL,0FFH ;записати в регістр ВL число FF


MUL BL ;перемножити вмістиме регістрів AL та BL
MOV [10H],AX ;в комірку пам’яті з адресою 10H записати вмістиме
регістру AX

Результат має бути таким:

Дослідіть модель мікропроцесора 8086, що є у складі системи


схемотехнічного моделювання Proteus.

21
RESET AD[0..15]
22
READY A[16..19]
24
INTA/QS1
18 25
INTR ALE/QS0
31 34
HOLD/GT1 BHE
30 27
HLDA/GT0 DT/R/S1
23 26
TEST DEN/S2
17 32
NMI RD
33 29
MN/MX W R/LOCK
19 28
CLK M/IO/S0
8086

Компонент 8086 у складі системи Proteus можна представити як такий,


що містить «внутрішню пам’ять» (Internal memory) або «зовнішню пам'ять»
(External memory). У випадку моделювання мікропроцесора, що містить
«внутрішню пам’ять» та «внутрішній генератор синхроімпульсів», вікно
редагування компонента може мати такий вигляд:
22

Тут файл «noname.bin» отримано в результаті компіляції відповідної


програми в EMU8086.
Результат виконання програми мікропроцесором можна спостерігати у
відповідному вікні:

ЗАВДАННЯ ДО ЛАБОРАТОРНОЇ РОБОТИ

Завдання 1.
Розробити програму в емуляторі Emu8086 для обчислення простих
арифметичних виразів згідно варіанту.
Варіант Вираз Змінні
1 y=a+c-(d-(d+8)+(a+b+c+d)-9)-b+c a=51, b=22, c=5ah, d=48h
2 y=b+b-(d-(d-1-(a+c+d-1)+5))-a+b a=30, b=44h, c=63h, d=88
3 y=b-c-(c+(1+9-(b+c+d+1-1)-b))+c a=3ch, b=40h, c=12, d=5eh
4 y=(b+b-(c+(d+7+a)-c)+c)+d+1-a+b a=2ah, b=33, c=4ch, d=43h
5 y=b-d+(c-d+1-((a-c-d)+1-1)+b)+b a=6ch, b=72h, c=32h, d=19
6 y=b-(c+c-1-(1-(a+b-c)+1))+8+a+c a=71, b=2ah, c=4bh, d=68h
7 y=(a+c-(d-(1+1+b-c))-c)+1+1+b+b a=31h, b=73, c=14, d=67
8 y=a+c+(d-(1+2+(a+c)+c))-1-5-b+b a=13h, b=24, c=1eh, d=5bh
9 y=a-(b+d-(1+1+a-(c+c)+d-5)+b)+c a=37h, b=39, c=6bh, d=2eh
10 y=b-(b-d-(d+(5-b+c))-d+1+1)-a+c a=34h, b=93, c=3eh, d=97
11 y=(a+b+(d-(1+1)+a)-c-d+1)+7-b-c a=31h, b=64, c=56, d=15h
12 y=(b+b-d+1+(5-(b-c))-d+1-9)+b-c a=4ch, b=44, c=85, d=2ch
13 y=b+(b-c+d+1+(a-(c-d)-d+1))-a+b a=12, b=51, c=42h, d=42
14 y=(a-b-d-(1+1)-b-(b-c+d)+5)+a+c a=11, b=64h, c=12, d=58h
15 y=b-(c-(c+d+9-(b-b)-c)-1)-4-a-b a=6fh, b=25, c=39, d=1ch
23

Завдання 2.
Розробити програму в емуляторі Emu8086 для обчислення
арифметичного виразу, замінюючи операції множення та ділення у виразі
командами зсуву бітів згідно варіанту.
Варіант Вираз Змінні
1 y=(b*128-d*64+(25-(b+c)/8)-a*16)/2 a=57h b=31h c=46 d=3fh
2 y=b*16+(c*128+(d-1)/2+a*256)/32 a=1bh b=5eh c=2ah d=15h
3 y=(a*64-b*16-(d+b*32)/8+c*16)/64 a=70h b=83 c=50 d=16h
4 y=b*32-(c/8+d*4+9-b*128)/256-a*16 a=73 b=95 c=89 d=24h
5 y=a*1024-(c*32+(d+1)/8-a/4)+b*8)/2 a=36h b=39 c=43 d=33
6 y=b*512-c*8+(7+(b-c)/8-d/4)/2-a*16 a=25h b=3eh c=29 d=82
7 y=b*16+c*8-(c+a)/2-(b*64+d+7)/128 a=30h b=62h c=24 d=17
8 y=a*256+((b+d*2-1)/4-(b+c)/2)*2-c a=10 b=21h c=18h d=86
9 y=(b+а)*64+c*32-(a/2+d*128)/32 a=33h b=54 c=83 d=38h
10 y=a*32+((c/16+(d+1)*8-a/4)+b/8)*2 a=73 b=95 c=89 d=24h
11 y=b/4-c+(7-d*256+(b-c)/8-d*4)/16-a*8 a=36h b=39 c=43 d=33
12 y=a*1024+c*64-(c+a-b)/2-(b*64+d)/16 a=25h b=3eh c=29 d=82
13 y=(c*16+d*64-(25-(b/8+c)*32)-a/16)*2 a=30h b=62h c=24 d=17
14 y=a*32+(c128+(d-1)/2+a*32)*256 a=10 b=21h c=18h d=86
15 y=(a*8-b/4-(d+b*32)/8+c*16)/16 a=57h b=31h c=46 d=3fh

Завдання 3.
Написати програму обчислення арифметичного виразу з використанням
операцій множення та ділення згідно варіанту.
Варіант Вираз Змінні
1 f=a-b+(c-d+(a-b)/(c+d)-a-b+c)*d a=53h b=3eh c=-72 d=-73
2 f=a/(b+c-(d-a/b+(c*d)+a))*b-c+d a=28h b=55 c=67h d=42
3 f=(a+b*(c-(d+a)/b)-c+d*a-b+c)/d a=4fh b=35 c=-18h d=-69
4 f=a/b*c+((d/(a*b+c-d*a+b)-c))-d a=91 b=31h c=54h d=-88
5 f=a-b*c*d/((a-b)-(c/d+a/b)-c-d) a=94 b=38 c=59h d=57
6 f=a-b+c*(d+((a+b))/c+d)+a-b/c/d a=5ah b=66 c=-61h d=-6ch
7 f=(a-b-c*((d-a)/b)+c+d)*a+b/c+d a=4fh b=36 c=74 d=39h
8 f=a-(b+c-d+(a-(b/c))+d+a*b)/c+d a=6eh b=33 c=-98 d=53
9 f=a-(b/(c*d+(a/b)/c/d)+a+b+c)*d a=46h b=64 c=60 d=-32
10 f=a*b/c+(d*a*b+c-d*a+b)-d*5 a=53h b=3eh c=-72 d=-66
11 f=a+b*c*d/((a-b-10)-(c/d+a/b)+d) a=28h b=55 c=67h d=57
12 f=a/b+c*(d+5*((a+b))/c+d)+a-b/c a=4fh b=35 c=-18h d=-80
13 f=a-(b+c*((d*a)+c)*d)-a+b/c+d a=91 b=31h c=54h d=-57
14 f=(b+c-d+(a-(b/c))+d*2+a*b)/c+d+4 a=94 b=38 c=59h d=49
15 f=(b*2+(c*d+(a/b)/c/d)+b/c)*d/5 a=5ah b=45 c=-61h d=-6ch

Завдання 4.
Змоделювати взаємодію мікропроцесора із зовнішніми пристроями. На
алфавітно-цифровий LCD-дисплей вивести прізвище та ім’я студента,
враховуючи, що прізвище виводиться в першій строці, а ім’я – в другій строці
LCD-дисплея.
24
LM016L

VDD
VSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
E
1
2
3

4
5
6

7
8
9
10
11
12
13
14
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
21 AD[0..15]
RESET AD[0..15]
22
READY A[16..19]
24
INTA/QS1
18 25
INTR ALE/QS0 DL QL
31 34 AD1
HOLD/GT1 BHE D0 Q0
30 27 AD2
HLDA/GT0 DT/R/S1 D1 Q1
23 26
TEST DEN/S2 D2 Q2
17 32
NMI RD D3 Q3
33 29
MN/MX WR/LOCK DU QU
19 28
CLK M/IO/S0
CLK
8086
RESET
HOLD
UP
LOAD
OE
SHIFTREG_4

Реалізація 1

MOV AL,01H ;код команди очищення LCD-дисплея


OUT 100B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,0FH ;код команди ініціалізації LCD-дисплея
OUT 100B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,3CH ;код команди вибору вигляду курсору LCD-дисплея
OUT 100B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'Z' ;код команди літери «Z»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'h' ;код команди літери «h»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'i' ;код команди літери «i»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'k' ;код команди літери «k»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'h' ;код команди літери «h»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'a' ;код команди літери «a»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'r' ;код команди літери «r»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'e' ;код команди літери «e»
25

OUT 110B,AL ;запис команди у регістр команд LCD-дисплея


MOV AL,'v' ;код команди літери «v»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'i' ;код команди літери «i»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'c' ;код команди літери «c»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'h' ;код команди літери «h»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,0C0H ;код команди переведення курсору на нижню строку LCD-
дисплея
OUT 100B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'V' ;код команди літери «V»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'l' ;код команди літери «l»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'a' ;код команди літери «a»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'d' ;код команди літери «d»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'i' ;код команди літери «i»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'m' ;код команди літери «m»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'i' ;код команди літери «i»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,'r' ;код команди літери «r»
OUT 110B,AL ;запис команди у регістр команд LCD-дисплея

Реалізація 2

JMP BEGIN ;«перестрибування» через область даних


M1 DB " Zhikharevich ",0 ;область даних – набори із символів, що
закінчуються нулем
M2 DB " Vladimir ",0 ;(строки М1 та М2)
BEGIN:
MOV AL,01H ;код команди очищення LCD-дисплея
OUT 100B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,0FH ;код команди ініціалізації LCD-дисплея
OUT 100B,AL ;запис команди у регістр команд LCD-дисплея
MOV AL,3CH ;код команди вибору вигляду курсору LCD-
дисплея
OUT 100B,AL ;запис команди у регістр команд LCD-дисплея
AGAIN: LEA BX,M1 ;завантаження у регістр ВХ початкової адреси
строки М1
26

CALL WRITE_WORD ;виклик підпрограми виведення строки на LCD-


дисплей
MOV AL,0C0H ;код команди переведення курсору на нижню
строку LCD-дисплея
OUT 100B,AL ;запис команди у регістр команд LCD-дисплея
LEA BX,M2 ;завантаження у регістр ВХ початкової адреси
строки М2
CALL WRITE_WORD ;виклик підпрограми виведення строки на LCD-
дисплей
MOV AL,080H ;код команди переведення курсору на верхню
строку LCD-дисплея
OUT 100B,AL ;запис команди у регістр команд LCD-дисплея
JMP AGAIN ;повернутися на початок процесу виведення строк
WRITE_WORD:
MOV DL,0 ;скидання в нуль вмісту регістра DL (початок
підпрограми виводу)
NEXT_LETTER:
MOV AL,DL ;запис вмісту регістра DL у регістр AL
XLATB ;запис у регістр AL вмісту комірки пам’яті за
адресою DS:[BX+AL]
CMP AL,0 ;порівняти вміст регістра AL із нулем
JE END_WRITE ;перехід у кінець підпрограми, якщо AL=0 (кінець
строки)
OUT 110B,AL ;запис символу у позицію курсору LCD-дисплея
INC DL ;збільшення на одиницю вмісту регістра DL
JMP NEXT_LETTER ;повернутися на етап зчитування з пам’яті
наступного символу
END_WRITE: RET ;повернення із підпрограми виведення строки на
LCD-дисплей

Зміст звіту

1. Звіт потрібно оформити в зошиті для звітів або на аркушах формату А4.
2. У звіті мають бути вказані:
 номер лабораторної роботи;
 тема лабораторної роботи та мета її виконання;
 відповіді на контрольні запитання;
 висновки по лабораторній роботі.

Контрольні запитання

1. Структура мікропроцесора Intel 8086.


2. Охарактеризуйте регістри загального призначення та сегментні регістри.
3. Охарактеризуйте лічильник команд (регістр IP).
27

4. Для чого використовують регістр прапорців (EFLAGS).


5. Найпростіші команди мови Асемблера: MOV, XCHG, команди
двійкового додавання та віднімання, INC, DEC, команди множення та
ділення ціло-чисельних даних.
6. Задано вміст регістрів AL, BL і DL. Знайти вміст регістрів після
виконання групи команд:
xor AL, BL
and BL, DL
test AL, DL
not AL
or DL, AL
де
Варіант AL BL DL
10110101
1 11011110b 11011110b
b
10110111
2 10011111b 11011110b
b
10101111
3 10010111b 11011010b
b

You might also like