1. Лабораторна р о б о т а №1
Основи програмування на мові асемблер та знайомство з програмним забезпеченням для виконання лабораторних робіт
Мета роботи: Знайомство з структурою персонального комп’ютера та основами програмування на мові асемблера. Студенту
треба навчитися працювати з програмою-транслятором Turbo-Assembler (TASM) та з засобами для відлагодження асемблерних програм
AFD та TD.
Необхідні знання та практичні навички: Знання структури мікропроцесорів сімейства Intel 80х86 [2,4,5,12] та основ
програмування на мові асемблер [1,4]. Вміння працювати з інтерфейсом типу Turbo-Vision [7-9]. Студентам обов’язково треба відновити
свої знання з таких розділів:
• “Поняття про системи числення.”
• “Арифметичні дії над числами при їх представлені у двійковій, вісімковій та шістнадцятирічній системах.”
• “Переведення чисел з однієї системи числення до іншої.”
1. Теоретичні відомості
1.1 Особливості архітектури мікропроцесора типу Intel 80х86
Найважливішою особливістю комп'ютерних систем на основі мікропроцесорів (МП) типу Intel 8086 є сегментна організація пам'яті.
Сегментом називається область пам'яті, що починається з адреси, кратної 16, і містить дані однієї структури. Загалом це можуть
бути:
•інструкція для МП, або коди команд;
•дані користувача;
•адреси повернення з підпрограм.
Таким чином, відрізняють три головних сегмента програми, яким відповідають сегментні регістри процесора типу INTEL 8086:
•CS (code segment, тобто сегмент інструкцій програми);
•DS (data segment, тобто сегмент даних, які визначені користувачем);
•SS (stack segment, тобто сегмент стеку).
2. Як вам відомо [1], стеком називається область пам'яті ЕОМ, яка відрізняється організацією доступу до даних, які
поступають до стека за принципом «останній ввійшов – перший вийшов». Більш досконало про стекову організацію пам'яті та про
програмування стека на апаратному рівні ви дізнаєтесь з теоретичних відомостей до лабораторної роботи №2.
У мікропроцесорі Intel 8086 існує також розширений сегмент ES (extend segment), який ефективно використовується при роботі з
рядковими даними. Більш досконало про можливості використання цього сегменту при програмуванні ви дізнаєтесь з відповідного
розділу теоретичних відомостей до лабораторної роботи №4.
В програмі, яку обробляє ЕОМ, всі адреси прив'язанні до початку сегмента. Таким чином, адреса осередку пам'яті, до якого
звертається процесор, немов би складається з двох частин: старші розряди – адреса сегменту, молодші – адреса зміщення.
Головні регістри МП Intel 8086 та їх призначення
Сегментні регістри CS, DS, SS, ES.
Регістри-вказівники (РВ)
IP (interrupt point) – адреса, за якою на даний час припинено виконання програми, або лічильник команд. Таким чином, повна
адреса, за якою розташований код команди, що виконується, може бути записана таким чином: CS:IP.
DI (data interrupt) – відносна адреса, за якою розташована змінна користувача, що використовується програмою на даний час. Таким
чином, повна адреса, за якою розташовані дані користувача, може бути записана таким чином: DS:DI. Слід відзначити, що регістр DI
використовується також в парі з сегментним регістром ES.
SP (stack pointer)– вказівник стека. Вказує на відносну адресу останньої змінної, що була завантажена до стека. При виконанні
команди «вивантажити змінну зі стека» буде вивантажена саме ця змінна.
SI та DI – індексні регістри. Обидва цих регістра можуть бути використані для розширеної адресації та для реалізації
арифметичних операцій складання та віднімання. Але головне їх призначення – робота з рядковими даними. При цьому індексний регістр
DI пов'язаний з сегментним регістром DS, а індексний регістр SI - з сегментним регістром ES. Більш досконало про операції обробки
рядкових даних у мові асемблера можна прочитати в описі лабораторної роботи №4.
Регістри загального призначення (РЗП) та їхні функції
Акумулятор (АХ)
3. Акумулятор є головним з регістрів загального призначення. Навіть ті команди процесора, які можуть бути виконані за допомогою
інших регістрів, при використанні акумулятора виконуються значно швидше. Цей регістр безпосередньо зв'язаний з арифметико-логічним
пристроєм (АЛП) мікропроцесора, який реалізує виконання команд програми на апаратному рівні. Як і всі регістри процесора Intel 8086,
акумулятор має 16 розрядів і звертатись до нього на програмному рівні можна через абревіатуру АХ. Можна також заносити числа
лише до восьми молодших розрядів акумулятора, звертаючись до них через абревіатуру AL, або до восьми старших, звертаючись до
них через абревіатуру АН. Таке ж саме правило діє при звертанні до інших регістрів загального призначення, які будуть
розглядатися далі.
Головні функції, які виконуються за допомогою акумулятора у мікропроцесорній системі:
•всі арифметичні операції;
•всі логічні операції;
•всі операції введення/виведення даних;
•операції над рядками.
Базовий регістр (BX)
Регістр загального призначення BX є базовим регістром. Це єдиний регістр загального призначення, вміст якого може
розглядатися як посилання на відповідну комірку пам'яті при розширеній адресації. Також може бути використаний разом з акумулятором
для арифметичних та логічних операцій та проведення обчислень.
Регістр-лічильник (СХ)
Регістр загального призначення СХ – це регістр-лічильник, який є необхідним для керування числом повторень у циклах та при
операціях зсування двійкових чисел. Також може бути використаний для арифметичних та логічних операцій та для проведення
обчислень.
Регістр даних (DX)
Регістр загального призначення DX – це регістр даних, який застосовується для їх введення та виведення, для обчислень з
подвійною точністю, або для операцій над великими числами при недостатній розрядності регістру АХ. Цей регістр також
використовується як додатковий при множенні та діленні цілих чисел.
Регістр прапорів, або регістр стану (РС) Дев'ять з 16 біт регістра стану процесора Intel 8086 є активними та визначають стан
процесора після виконання останньої команди. Більшість арифметичних та логічних команд, а також команди зрівняння даних змінюють
4. значення прапорів регістра стану. Прапори регістра стану та їх призначення наведені у таблиці 1, а їх побітове розташування у комірках
регістра – у таблиці 2:
Таблиця 1. Призначення прапорів регістра стану
Назва прапора Умовне
№
п/п Українською Англійською Позна- Що визначає
мовою мовою чення
Наявність одиниці у цьому біті регістра
Прапор пере- Overflow Flag ОF стану вказує на переповнення старшого
1 повнення біта числа при виконанні арифметичних
команд.
Визначає направлення пересилання або
Вказівник порівняння рядкових даних. При цьому
напрямку при направлення ліворуч відповідає
виконанні Direction Flag DF збільшенню, а праворуч – зменшенню
2 операцій над адрес комірок пам'яті. Значення 1 для
рядками прапора DF відповідає направленню
праворуч.
Наявність одиниці у цьому біті регістра
3 Прапор Interrupt Flag IF стану вказує на можливість виконання
переривань переривань від зовнішніх пристроїв, які
маскуються.
Визначається знаком останньої
арифметичної операції, яка була зроблена
4 Прапор знаку Sign Flag SF процесором (1 – від'ємне число, 0 –
додатне число).
Визначається результатом останньої
арифметичної операції, яка була зроблена
5. Назва прапора Умовне
№
п/п Українською Англійською Позна- Що визначає
мовою мовою чення
5 Прапор нуля Zero Flag ZF процесором. Нульовий результат
обумовлює появу одиниці у цьому біті.
Наявність одиниці у цьому біті регістра
стану забезпечує покрокове виконання
Режим завантаженої програми, що дозволяє
трасування програмісту аналізувати стан всіх
6 (покрокового Trace Flag TF регістрів процесора та комірок пам'яті
виконання після виконанні кожної асемблерної
програми) команди. Цей режим є дуже важливим
при відлагодженні програм, але
безпосередньо у програмах загального
призначення він практично не
використається. Єдиним виключенням є
програми-компілятори.
Визначається результатом останньої
арифметичної операції, яка була зроблена
процесором. Одиниця у цьому біті
7 Зовнішнє Auxiliary Flag AF свідчить про перенесення з 3-го до 4-го
перенесення біту числа при виконання операцій над 8-
бітовими числами. Використовується при
виконанні особливих арифметичних
перевірок.
Визначається результатом останньої
арифметичної операції, яка була зроблена
процесором. Одиниця у цьому біті
8 Прапор Carry Flag свідчить про перенесення зі старшого
6. Назва прапора Умовне
№
п/п Українською Англійською Позна- Що визначає
мовою мовою чення
перенесення CF восьмого біта при виконанні
арифметичних операцій. При виконанні
операцій циклічного зсуву до прапора
перенесення переходить останній біт
числа.
Вказує на парність перших 8 бітів
отриманого результату (1-результат є
парним, 0 – не парним). Парність у
Контроль програмуванні та теорії інформації - це
9 парності Parity Flag PF кількість одиниць у двійковому числі.
числа Не плутайте цей параметр з
визначенням парності у арифметиці!
Не плутайте також прапор парності
процесора з бітом парності, який
використовується для контролю
передавання чисельних даних у
комп’ютерних системах та мережах.
Завдання для перевірки №1: Порівняйте поняття парності у звичайній та двійковій арифметиці. Наприклад, чи є парним число 3 з
точки зору теорії інформації? Наведіть інші приклади парних та непарних чисел.
Таблиця 2. Розташування бітів регістра стану мікропроцесора Intel 8086
Номер 1 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
біта 5
7. Прапор * * * * OF DF IF TF SF ZF * AF * PF * CF
* - біт у процесорі Intel 8086 не задіяний.
1.2 Організація обчислень та узагальнена архітектура комп’ютера IBM PC
Загальна структура комп’ютера
Як вам відомо, головні компоненти апаратних засобів комп’ютера – це системний блок, клавіатура, пристрій відображення
інформації (електронно-променевий або рідинно-кришталевий монітор), дисководи, друкуючий пристрій (принтер), а також різномінітні
засоби для асинхронного зв’язку з зовнішніми пристроями та керування програмами для іграшок. Сучасні комп’ютерні системи можуть
містити також інші різноманітні периферійні пристрої.
В свою чергу, системний блок складається з системної плати, блока живлення комп’ютера та комірок (слотів) для розміщення
додаткових інтерфейс них плат. На системній платі розташовані:
• мікропроцесор;
• мікросхеми постійної пам’ять (ПЗП), яка містить ядро для початкового завантаження операційної системи та інтерпретатор
мови програмування BASIC;
• мікросхеми оперативної пам’ять (ОЗП).
Комірки для розміщення додаткових інтерфейс них плат забезпечують підключення пристроїв відображення інформації
(моніторів), дисководів всіх типів, каналов телекомунікацій (мережних плат або модемів), додаткової пам’яті та інших різноманітних
пристроїв. Така конструкція комп’ютера була запропонована фірмою IBM та отримала назву “принципу відкритої архітектури”. Головною
перевагою цього принципу є простота модернізації комп’ютера через підключення до нього нових пристроїв або через заміну застарілих
пристроїв на сучасні.
Головною частиною комп’ютера є мікропроцесор, який безпосередньо виконує обробку команд та даних. Як видно з рис. 1, процесор
типу Intel 8086 розділений на дві головні частини: операційний пристрій (ОП) та шинний інтерфейс (ШІ). Операційний пристрій
безпосередньо виконує команди програми, у той час як шинний інтерфейс підготовлює дані та команди для виконання. Операційний
пристрій складається з арифметико-логічного пристрою (АЛП), системи керування (СК) та десяти розглянутих вище регістрів (чотири
регістра загального призначення, п’ять регістрів-вказівників та регістр стану). АЛП разом із СК називають виконуючим блоком (ВБ)
процесора. Схеми АЛП безпосередньо забезпечують виконання арифметичних та логічних команд на апаратному рівні, в той час як СК,
яка зв’язана з регістром стану та з лічильником команд, забезпечує слідкування за логікою виконання
8. програми при наявності у ній підпрограм або команд вітвлення та циклу. Більш досконало логіка та організація програми будуть
розглянуті у лабораторній роботі №3.
Блок керування шиною (БКШ), черга команд та розглянуті нами раніше сегментні регістри складають шинний інтерфейс
процесора та виконують три головних функції. По-перше, це передавання даних до ОП процесора, до зовнішніх пристроїв, або до
комірок пам’яті ЕОМ. По-друге, як вже відмічалось раніше, через сегментні
9.
10. ОП
ШІ
AH AL
Керування програмами
BH BL
РЗП
CH CL CS
DH DL DS
SP SS
BP
РВ ES
SI
DI
Керування
шиною
АЛП 1
СК ВБ 2
РС 3
4
IP Черга команд
Рис.1 Узагальнена схема мікропроцесора Intel 80х86.
11. Завдання для перевірки №2: Назвіть всі сегментні регістри процесора Intel 8086. За адресацію яких сегментів вони відповідають?
Третя функція ШІ – це вибирання команд з оперативної пам’яті комп’ютера. Як відомо, всі команди, які повинні бути виконані
програмою, розташовані в оперативній пам’яті комп’ютера. Тому для прискорення роботи процесора вона організована таким чином: ОП
та ШІ працюють одночасно, але ШІ попереджує роботу ОП на один крок. ОП “дає знати” ШІ, яка команда буде наступною та з якої
комірки оперативної пам’яті треба її вибирати. Таким чином, доки ОП виконує арифметичні та логічні дії над числами, ШІ вибирає з
оперативної пам’яті наступну команду або блок команд та завантажує його до верхньої частини черги команд, що значно прискорює
роботу комп’ютера. Тому збільшення розміру черги команд – дуже ефективний шлях для підвищення швидкодії процесорної системи.
Якщо процесор Intel 8086 мав чергу команд лише на чотири байти, то сучасні процесори мають окремі внутрішні області пам’яті як для
збереження кодів команд, так і для збереження даних користувача. Такі осередки пам’яті називаються “кешами” і розмір їх може складати
від 64 кБ до 512 кБ. Важливу роль також відіграє швидкість обміну даними між ОП та чергою команд або кешом процесора.
Організація пам’яті комп’ютера
Загалом пам’ять персонального комп’ютера складається з двох частин: постійної пам’яті (ROM – Read Only Memory) та
оперативної пам’яті (RAM – Random Accesses Memory). Пам’ять ROM – це спеціальна мікросхема, до якої занесена програма
початкового завантаження операційної системи. Але на теперішній час для цього використовуються не мікросхеми постійних
запам’ятовуючих пристроїв (ПЗП), а мікросхеми з електричним записуванням та зтиранням інформації (запам’ятовуючи пристрої, що
перепрограмуються). Найбільш цікавою частиною постійної пам’яті з точки зору програмування є базова система введення та
виведення даних, або BIOS (Base Input Output System). Ця система налагоджується при збиранні комп’ютера та при підключенні до
нього зовнішніх пристроїв, але при необхідності користувач може переналагодити її.
Загалом оперативну пам’ять персонально комп’ютера можна умовно поділити на верхні адреси пам’яті, які використовуються
системою BIOS та операційною системою MS-DOS, адреси відеопам’яті та нижні адреси пам’яті, де розташовуються драйвера зовнішніх
пристроїв та програми користувача. На рис. 2 наведений розподіл адрес пам’яті для мегабайтного адресного простору комп’ютера
IBM PC XT [3,4]. Всі адреси на рисунку вказані у десятковій та у шістнадцятирічній формі (шістнадцятирічні числа помічені літерою Н).
Для комп’ютера типа IBM PC AT на базі процесора Intel 80286 з 32-разрядною шиною є можливою адресація 16 Мб оперативної пам’яті, а
у комп’ютерах на базі процесора Intel 80386 для режиму реальних адрес пам’яті можлива адресація простору до 4 Гб, а при використанні
захищеного режиму роботи процесора - до 64 Гб [2,6]. Якщо розмір оперативної пам’яті комп’ютера є меншим, то процесор може
використовувати для тимчасового збереження даних простір вінчестера як віртуальну пам’ять [2].
1.3 Основи програмування на мові асемблер та її синтаксис. Позначки, коди команд, операнди та директиви
Формат запису команди асемблеру має такий вигляд [4,7-9]:
12. {позначка:} [асемблерний код команди] {операнди}; {коментарії}
Усі позначки у програмі повинні бути унікальними, і при цьому треба пам’ятати, що асемблер не відрізняє прописні та маленькі
літери. При максимальній довжині рядка програми 132 символи (більшість програмістів використовують з них лише 80 відповідно до
довжини екрану) максимальна довжина позначки - 31 символ. Позначка (якщо існує), асемблерний код команди та операнд
відокремлюються один від одного принаймні одним проміжком або символом табуляції. Коментарі можуть стояти в любому місці
асемблерної програми та повинні починатися з символу ; (крапка з комою). Всі символи в рядку асемблерної програми, що стоять
праворуч від крапки з комою, вважаються за коментарі. Коментарі можуть містити будь-які друковані символи української або латинської
абетки, цифрові та спеціальні символи, включаючи проміжок. Коментар може займати весь рядок або стояти праворуч від асемблерної
команди, наприклад:
; Програма виводу даних на друк
ADD AX, BX; Додати два числа, що містяться в регістрах АX та BX
13. 0000
Таблиця векторів переривань
1 кб
00400H Область даних BIOS
Драйвера пристроїв MS-DOS
Резидентні програми
Пам’ять, яка
адреується
операційною Префікс програмного
системою сегменту (PSP)
MS-DOS Програма
користувача
Файли даних, які
задіяні програмою
користувача
640 кб Незавантажена область пам’яті
Мегабайтний
простір адрес А0000Н
704 кб
Відеопам’ять монохром-
B0000H
ного монітора у
текстовому режимі Графічна
відеопам’ять
736 кб монітора
В8000Н Відеопам’ять
кольорового монітора у EGA
текстовому режимі
768 кб
С0000Н
BIOS відеоадаптера
800 кб
C8000H ПЗП фіксованого диска
984 кб
F6000H Бейсик-интерпретатор ПЗП
BIOS ПЗП
Рис. 2 Розподіл пам’яті комп’ютера IBM PC XT
14. Зрозуміло, що кількість коментарів ніяк не впливає на складність програми, оскільки вони не відносяться до машинних кодів.
Позначки в асемблері можуть містити такі символи:
1. Англійські літери A...Z, a...z
2. Цифри 0...9 (не можуть бути першим символом позначки).
3.Спеціальні символи Знак питання (?);
амперсанд(@);
підкреслення ( _ );
долар ($);
крапка (.) (тільки як перший символ позначки).
Також заборонено використовувати як позначки зарезервовані асемблером слова, до яких відносяться коди команд, директиви, імена
регістрів тощо. У таблиці 3 наведені приклади вірних та невірних позначок.
Таблиця 3. Приклади позначок
Приклади вірних позначок Приклади невірних позначок
CoU AX
1A
$10
Thislabelisverylongbutcorrect Thislabelisverylongandnotcorrect
It_is_a_label Це є позначка
_y_z It is a label
@2 ADD
.2 Proc
M2 2
2M
!2
2.
Асемблерний код команди вказує транслятору, яку дію треба виконати у даній операції. Це може бути пересилання даних між
регістарми процесору, з регістру до пам’яті або навпаки (команда MOV), команди обробки даних, наприклад збільшення чи зменшення на 1
15. (INC, DEC), додавання (АDD), віднімання (SUB), множення (MUL) або ділення (DIV), команди організації логіки програми, команди
переходу на підпрограму та багато інших.
Якщо передбачена робота з даними і кодом команди вони не визначаються, то асемблерна команда завжди містить операнд, який
може містити:
1. Чисельне значення даних;
2. Регістри та комірки пам’яті, над якими буде виконуватись дія, що обумовлюється кодом команди
Приклади асемблерних команд:
CNT DB 10; Визначити байт пам’яті з назвою CNT та занести до нього число 10.
MOV AL,CNT; Занести до регістру АL число з комірки CNT
ADD AL,12; Збільшити число, що міститься у регістрі AL на 12.
INC AL; Збільшити число у регістрі, що міститься у регістрі AL на 1.
MOV BL,AL; Переслати дані з регістру AL до регістру BL.
. RET; Команда повернення з підпрограми. Операндів не має.
Крім того, асемблер має велику кількість операторів, які дозволяють керувати процесом асемблювання та виведенням початкового тексту
програми на друк. Ці оператори називаються псевдокомандами або директивами [4,7-9]. Вони використовуються тільки при
асемблюванні програми та не генерують асемблерного коду. Головні з них наведені нижче.
Директива PAGE. Ця директива розміщується на початку програми та вказує на кількість рядків, що друкуються на сторінці, та
кількість символів в одному рядку. Формат директиви:
PAGE [кількість рядків], [кількість символів]
Наприклад, директива
PAGE 50,100
встановлює режим виведення даних на друк 50 рядків на лист при сотні символів в одному рядку. Кількість рядків може бути встановлена у
межах 10-255, кількість символів від 60 до 132.
Директиви SEGMENT та ENDS. Як вам вже відомо, будь-яка асемблерна програма має принаймні один сегмент - сегмент коду
програми. В більшості програм окремими сегментами виділяються чисельні дані користувача та стек. Сегмент описується за допомогою
директиви SEGMENT таким чином:
16. NSEG SEGMENT {параметри}
...
...; інструкції асемблера
...
NSEG ENDS
Ім’я сегменту є обов’язковим, мусить бути унікальним та відповідати узгодженням про імена позначок, які наводилися вище. Директива
ENDS з тією ж позначкою відповідає кінцю сегмента.
Директива ORG. Ця директива використовується для зміни вмісту лічильника адреси без допомоги асемблерних команд умовного
чи безумовного переходу. Найчастіше вживається для встановлення адреси завантаження програми на її початку. Наприклад, директива
ORG 100H
встановлює лічильник адреси на зміщення 100H (шістнадцятирічне число 100) відносно початку сегменту кода, а директива
ORG $+10H
збільшує адресу, яка завантажена у лічильник команд, на 10H (шістнадцятирічне число 10).
Директиви PROC та ENDP, команди CALL та RET. Сегмент коду може крім кодів основної програми містити одну чи декілька
процедур, які визначаються директивою PROC. В кінці процедури повинні стояти команда RET та директива ENDP. Директива ENDP
ставиться для того, щоб транслятор асемблера розпізнав початок та кінець процедури та її обсяг. Виклик процедури здійснюється за
допомогою команди CALL. Формат команди:
CALL [ім’я процедури]
При виклику процедури числа, що знаходяться у всіх регістрах процесора, завантажуються до стека, а до лічильника команд
завантажується адреса початку процедури. На кінці процедури перед директивою ENDP ставиться команда RET. Результатом її виконання є
завантаження вмісту верхніх комірок стеку до регістрів процесора та перехід на точку переривання головної програми. Команда RET може
ставитися і в середині процедури, якщо це передбачено логікою програми. Крім того, цією командою здійснюється вихід з асемблерної
програми до командного режиму MS-DOS. Таким чином, асемблерна програма, яка містить процедуру, буде мати такий вигляд:
NSEG SEGMENT; опис сегменту
NPROC PROC; опис процедури
17. ...
...
...
RET; повернення до основної програми
ENDP; кінець процедури
...
...
...
CALL NPROC;
...
...
RET; повернення до MS-DOS
ENDS;
Директива END. Ставиться останнею у програмі та завершує її. Якщо програма писалася як процедура, директива END містить ім’я
процедури як параметр (END {[ім’я процедури]}). Якщо це com-програма і виконується в одному сегменті, параметр не використовується.
1.4. Перетворення програми з тексту на мові асемблера у виконуваний модуль
Для того, щоб програма, написана на мові асемблера, могла бути виконана процесором, вона, як і програма на будь-якій іншій мові,
окрім машинної, має бути трансльована (за допомогою асемблера) та скомпонована (за допомогою редактора зв’язків).
Для виконання лабораторних робіт у визначеному нижче вигляді можна застосовувати будь-який асемблер, що використовує
синтаксис Intel. Можна використовувати асемблер з іншим синтаксисом, наприклад синтаксисом AT&T, але для цього буде потрібно внести
відповідні зміни у наведені нижче приклади та зразки.
Тут ми розберемо послідовність дій, необхідну для трансляції і компонування програм за допомогою транслятора MASM.
Трансляція виконується командою
18. MASM ім’я_файлу
Інші параметри команди можна подивитися за загальним правилом за допомогою команди
MASM /?
Компонування EXE-програми здійснюється за допомогою команди
LINK об’єктний_модуль
Для компонування COM-програми необхідно додати ключ /TINY:
LINK /TINY об’єктний_модуль
Інші параметри команди можна подивитися за загальним правилом за допомогою команди
LINK /?
Довідку з ассемблера MASM та його мови можна отримати за допомогою команди
QH
1.5. Основи роботи з програмою AFD
Програма AFD дозволяє відлагоджувати програми, які написані на мові асемблеру процесорів Intel 8086 та Intel 80286.
Основні можливості програми AFD:
1. Занесення до пам’яті ЕОМ виконуємих модулей та їх дізасемблювання (переведення тексту програми із двійкових машинних
кодів на мову асемблера).
2. Виконання всієї занесеної програми або її частини.
3. Виконання окремих інструкцій програми у покроковому режимі.
4. Аналіз стану всіх регістрів процесора та комірок пам’яті прямого доступу.
5. Внесення програмістом змін до всіх реєстрів процесора та комірок пам’яті ЕОМ прямого доступу.
Головне меню відладчика AFD (рис. 3) являє собою систему з шести вікон та командної строки. За допомогою клавіш керування
курсором ↑ та ↓ маркер строки переміщується по вікну програми-дізасемблера, а інші функції виконуються за допомогою функціональних
клавіш F1...F10 (таблиця 6) та системи команд (таблиця 7).
19. Регістри загального
призначення,
Регістр стану процесору
вказівники та
Стек
сегментні регістри
Командна строка
Асемблерний код завантаженої Перше вікно пам’яті
програми
Друге вікно пам’яті
Рис. 3. Загальний вигляд інтерфейсу програми AFD.
Головна перевага відладчика AFD - його відносна простота та зручність багатовіконного інтерфейсу. Ці переваги особливо відчутні
при відлагодженні невеликих com-модулей. Недоліки цієї програми - неможливість проглядання робочого екрана програми, що
виконується, та неможливість одночасного проглядання двох або більшої кількості програм.
Таблиця 6. Призначення функціональних клавіш системи AFD
Клавіша Функція Що виконує
програми
F1 Step Виконання однієї інструкції програми, відміченої маркером
у вікні дізасемблера.
F2 Step Proc Повне виконання одного рядка програми. Наприклад, якщо
це є викликання підпрограми, то вона буде виконана одразу
повністю як одна інструкція.
F3 Retrieve Повторення введених команд командної строки. Можна
повторити до шести команд.
F4 Help Виклик файлу допомоги.
F5 Set BRK Встановлення точок зупинення.
20. Клавіша Функція Що виконує
програми
F6 - Клавіша незадіяна.
F7 Up Перенесення маркера догори.
F8 Dn Перенесення маркера донизу.
F9 Le Перенесення маркера ліворуч.
F10 Ri Перенесення маркера праворуч.
Таблиця 7. Набір головних команд, які підтримуються відладчиком AFD
Команда Призначення
1. L ім’я файла {адреса} Ввести файл до пам’яті ЕОМ. Адреса розміщення може
бути вказана явно, але це не обов’язково. По
замовченню адреса розташування програми буде
CS:0100H.
Число прочитаних байтів після завершення програми
вказуєтьсся парою реєстрів BX:CX.
2. W ім’я файла, адреса, Записати дані до файлу. Початкова адреса повинна
довжина знаходитися у сегменті даних DS. Довжина файлу
повинна бути у межах чотирьох шістнадцятирічних
цифр. Всі параметри команди є обов’язковими.
3. D адреса Показати коди команд, починаючи з вказаної адреси.
Сегмент пам’яті визначається реєстром CS. З цієї ж
адреси можна і виконувати програму.
4. R реєстр = значення Занести число до регістра процесора. Наприклад,
R А=100H - команда заносить до реєстру А число 100H.
Якщо набрати R FL=значення - можна завантажити весь
реєстр стану як один шістнадцятирічний реєстр. Але є
можливим і окремий доступ до бітів реєстру стану
21. Команда Призначення
через імена OF, DF, IF, SF, ZF, AF, PF, CF.
5. Mn – адреса Показати перше або друге вікно стану пам’яті (значення
параметру n 1 або 2), починаючи з вказаної адреси.
6. G {стартова адреса}, Виконати програму від стартової адреси до адреси
{адреса зупинки} зупинки. Якщо не вказана стартова адреса, то
виконання програми почнеться з адреси, на який вона
була припинена. Якщо не вказана адреса зупинки, то
програма буде виконуватись до першої точки
припинення або до кінця. Крім того, можна припинити
виконання програми через натиснення клавіш Ctrl+Esc.
7. QUIT {R} Повернення до DOS. Опція R робить програму afd
резидентною. В цьому випадку її ініциалізація
проводиться через натиснення клавіш Ctrl+Esc.
1.6. Основи роботи з програмою TD
Програма TD (turbo-debugger) дозволяє відлагоджувати програми, які написані на мові асемблера мікропроцесорів Intel 8086 - Intel
80486 [8,9]. Ця програма є розробкою фірми «Borland International» та входить до складу пакетів програмування Borland Pascal та
Borland C++. Тому інтерфейс програми реалізовано у стандарті Turbo-Vision та відповідає загальному вигляду інтерфейсу цих середовищ,
що значно спрощує його вивчення.
Основні можливості програми TD:
1. Занесення до пам’яті ЕОМ виконуємого модуля та його дізасемблювання.
2. Виконання всієї занесеної програми або її частини. Кількість точок перевивань необмежена.
3. Виконання окремих інструкцій програми у покроковому режимі.
4. Аналіз стану всіх реєстрів процесора та комірок пам’яті, до яких є прямий доступ.
5. Внесення програмістом змін до всіх регістрів процесора та комірок пам’яті ЕОМ, до яких є прямий доступ.
22. 6. Проведення одночасного огляду даних, що знаходяться у комірках пам’яті ЕОМ з різними адресами (за допомогою опції меню Add
Watch або комбінації клавіш Ctrl+F7).
7. Поглядання робочого екрану програми, що виконується, якщо в ній передбачене
виведення даних на монітор (за допомогою опції меню User Screen або комбінації клавіш Alt+F5).
Головні вікна відладчика TD розташовані на його робочій панелі. Їх розмір може бути зміняний за допомогою миши, якщо це
необхідно. Кількість вікон необмежена. Кожне вікно, в якому завантажена програма, розбито на 5 робочих областей. На рис.4 наведена
структура вікна. Порядок розташування вікон може бути зміняний за допомогою опцій меню Window або функціональних клавіш,
зазначених у таблиці 8.
23. Верхній рядок меню
Панель 2
Робоча Регістри Панель3
панель загального Регістр
Панель 1 призначення стану
Асемблерний код процесор
завантаженої програми Вказівники а
Активне та сегментні
вікно регістри
Панель 5
Панель 4 Комірки пам’яті, що від-
Комірки пам’яті, що відповідають сегменту даних повідають сегменту стека
Нижній рядок меню (призначення клавіш F1-F10)
Рис 4. Загальний вигляд інтерфейсу програми TD.
Таблиця 8. Опції пункту меню Window системи TD
Опція Клавіша Що виконує
Zoom (Z) F5 Збільшує розмір активного вікна до розміру всієї робочої
панелі.
Next (N) F6 Перехід до наступного вікна.
Next pane (X) Tab Перехід до іншої панелі у тому ж робочому вікні.
Size/move (S) Ctrl+F5 Зміна розмірів вікна та його переміщення.
24. Опція Клавіша Що виконує
Close (C) Alt+F3 Закрити активне вікно
Undo close Alt+F6 Знову відкрити вікно, яке щойно було закрите
Для аналізу точок припинень зручно користатись пунктом меню Breakpoints, головні опції якого зазначені у таблиці 9.
Для видалення окремих точок припинень програми треба послідовно виконати такі дії:
1. Звернутися до опції Breakpoints пункту меню View.
2. Коли всі точки припинень будуть висвітлені у окремому вікні, вибрати точку, яку треба видалити, за допомогою клавіш
переміщення курсора ↑ та ↓.
3. Натиснути клавішу Delete.
4. Повернутися до активного вікна через опцію меню Window або за допомогою миши.
Взагалі функції меню View дозволяють проглянути у повноекранному режимі будь-яку з панелей активного вікна (регістри
процесора, сегментні регістри), а також шістнадцятирічні коди інших виконуємих модулей (опція File), таблицю змінних завантаженої
програми (опція Variables), зміст програмного буферу (опція Clipboard) тощо. Програмний буфер може бути завантажений через стандартні
функції меню Edit Copy та Paste.
Таблиця 9. Опції пункту меню Breakpoints для системи TD
Опція Клавіш Що виконує
а
Toggle (T) F2 Зробити точку припинення там, де у даний момент
припинено виконання програми.
At Alt+F2 Задати чисельну адресу точки припинення у
шістнадцятирічній формі у форматі CS:IP.
Delete All - Видалити всі точки переривань.
Iconize/restore - Використання цієї опції меню приводить до звертання вікна.
Повторне її використання знову відкриває вікно.
Пункт головного меню Data призначений для безпосередньої роботи з даними користувача та з комірками пам’яті та іменами
змінних. Він містить функції, зазначені у таблиці 10. Призначення усіх функціональних клавіш у програмі TD наведене у таблиці 11.
25. Таблиця 10. Опції пункту меню Data для системи TD
Опція Клавіша Що виконує
Inspect - Поглядання значення заданої змінної або комірки
пам’яті
Evalute/modify Ctrl+F4 Обчислення значення виразу
Add Watch Ctrl+F7 Поглядання значень змінних у окремому вікні
Function return - Адреси повернення функцій та процедур
Таблиця 11. Призначення функціональних клавіш у програмі TD
Клавіша Призначення
F1 Допомога.
F2 Зробити точку зупинки там, де у даний момент припинено виконання
програми.
F3 Поглядання початкового коду завантаженої програми.
F4 Перехід до рядка, на якому програма була припинена.
F5 Збільшення розміру активного вікна до розміру всієї робочої панелі.
F6 Перехід до наступного вікна.
F7 Покрокове виконання програми. При переході на процедуру буде
покроково виконана кожна команда процедури.
F8 Покрокове виконання програми. Команда виклику процедури виконується
як одна команда.
F9 Запуск програми на розрахування.
F10 Перехід до верхнього рядка меню.
2. Порядок виконання роботи
1. Знайти транслятор і файли afd.exe та td.exe.
26. 2. Проаналізувати текст програми lab1.asm, зрозуміти зміст кожної з асемблерних команд. З’ясувати, як будуть змінюватися дані
всіх регістрів процесору при виконанні кожної з них. Текст програми повинен мати такий вигляд:
27. text SEGMENT
ORG 100h
begin: MOV ax,20
MOV bx,30
ADD ax,bx
MOV cx,ax
ADD ch,16
RET
text ENDS
END begin
2. Сформувати лістинг, об’єктний та виконуваний код для програми lab1.asm; останній записати у файл lab1.com.
3. Запустити програму lab1.com на обробку. Переконайтеся в тому, що вона коректно виконується (комп’ютер не «підвісає»).
4. Завантажити програму lab1.com до відладчика AFD та крок за кроком виконати всі її команди. Після виконання кожної команди
аналізувати стан кожного з регістрів процесора.
5. Завантажити програму lab1.com до відладчика TD та крок за кроком виконати всі її команди. Після виконання кожної команди
аналізувати стан кожного з регістрів процесора.
3. Зміст звіту
1. Послідовність дій, які потрібно виконати для компіляції асемблерної програми. Розглянути два випадка: компіляцію com-програми
та компіляцію exe-програми.
2. Таблиця з трьох колонок. До першої занести початковий код асемблерної програми файлу lab1.asm, до другої - її машинні коди, а
до третьої - стан усіх регістрів процесору після її виконання.
3. Висновки за роботою.
8 4. Контрольні питання:
1. Узагальнена структура мікропроцесора Intel 8086 та персонального комп’ютера IBM PC.
2. Що таке початкова та об’єктна програма?
3. Структурна схема гіпотетичного мікропроцесора, призначення всіх його регістрів.
4. Основні регістри процесору типа Intel 8086, їх призначення.
28. 5. Сегментація програми. Сегменти коду, даних та стеку. Їх розташування в пам’яті ЕОМ. Директиви мови асемблера SEGMENT та
ENDS.
6. Організація стекової пам’яті та її призначення.
7. Регістр стану процесора. Його призначення. Біти регістра стану у процесорі Intel 8086.
8. Режим трасування програми. Як він встановлюється і для чого використовується?
9. Поясніть приклади позначок та приклади асемблерних команд, які наведені у теоретичній частині цієї роботи. Наведіть свої приклади.
10. Чи потрібно аналізувати регістр стану при виконанні команд програми lab1.asm? Чому?
29. Лабораторна р о б о т а №2
Арифметичні та логічні операції мови асемблер
Мета роботи: Навчитися писати на мові асемблер прості програми, які реалізують алгоритми, що містять арифметичні та
логічні операції над чисельними даними.
Необхідні знання та практичні навички: Знання основ програмування на мові асемблера та основ роботи з транслятором TASM і
динамічними відладчиками AFD та TD [1,4,7-9].
1. Теоретичні відомості
1.1. Директиви визначення даних
Для безпосереднього визначення чисельних та рядкових величин, які не змінюються при виконанні програми, у мові асемблер
введені директиви визначення даних. Формат директиви визначення даних такий:
[ім’я] D{n} {вираз}
де D{n} - одна з команд визначення даних, які будуть наведені нижче. Ім’я елемента вказувати не обов’язково. Але, оскільки у програмі
завжди існують посилання на ті чи інші дані, використання імен для роботи з ними є найбільш зручним. Наприклад:
A1 DW 2; Визначити слово (дві комірки пам’яті) та занести до них число 2
A2 DB 5; Визначити байт (одну комірки пам’яті) та занести до неї число5
...................................................................................................................................
...................................................................................................................................
MOV AX,A2; Занести число A2 до акумулятору.
MOV CH,A1; Занести число A1 до старших 8 бітів регістра СX
Існує чотири команди визначення даних, які підтримуються в мові асемблер:
DB - визначити байт (одну комірку пам’яті);
DW - визначити слово (дві комірки пам’яті);
DQ - визначити чотири слова (вісім комірок пам’яті);
DT - визначити десять слів (двадцять комірок пам’яті).
30. Вирази при описуванні даних можуть бути чотирьох типів:
1. Вирази-константи. У директивах з виразами-константами чисельні дані задаються безпосередньо, при цьому визначається також
їх тип. Подальше у програмі вони можуть бути використані тільки як дані визначеного типу. Крім того, після числа вказується система
числення, у якій записано число:
B - двійкова;
Q - вісімкова;
H - шістнадцятирічна;
D - десяткова.
Якщо, як в попередньому прикладі, явних вказівок на систему числення немає, то по замовченню число розглядається як десяткове.
Наприклад:
A1 DW 2 ; Визначити слово (дві комірки пам’яті) та занести до них число 2.
A2 DB 15H ; Визначити байт (одну комірки пам’яті) та занести до неї
; шістнадцятирічне число 15
B1 DQ 17Q ; Визначити чотири слова та занести до них вісімкове число 17.
Завдання для перевірки №1: Переведіть числа, які позначені змінними A2 та B1 у двійкову та у десяткову системи числення.
Слід зазначити, що у мові асемблера процесору Intel 8086 передбачені переміщення та обробку лише даних одного типу. Наприклад,
запис:
A2 DB 15H
MOV AX, A2
є невірним, тому що до акумулятору, якій має 16 розрядів, ми намагаємося завантажити восьмирозрядне число (1 байт). Нижче наведено 2
вірних варіанти:
A2 DB 15H A2 DW 15H
MOV AL, A2 MOV AX, A2
2. Невизначені вирази. Якщо комірка пам’яті мусить бути завантажена не з початку роботи програми, а тільки у процесі її роботи,
то її перед початком роботи програми треба зарезервувати. Це досягається таким чином:
A1 DW ?;
31. Тоді у будь-якому місті програми можна поставити оператор типу:
MOV A1, АX
Результатом виконання такого оператора буде перенесення даних з акумулятору до комірки пам’яті з ім’ям A1. Як вам відомо, у
мовах високого рівню, таких як ПАСКАЛЬ, С або ж Фортран, таке визначення змінних також ефективно використовується, а самі такі
змінні називають невизначеними або динамічними.
Завдання для перевірки №2: Пригадайте, як визначаються динамічні змінні у мові програмування ПАСКАЛЬ? В яких випадках вони
використовуються?
3. Вирази з визначенням кількох констант. Вираз може містити водночас декілька констант, що розділяються комами. Кількість
таких констант обмежується тільки довжиною рядку. Наприклад:
A3 DB 10,12,23H,1001B
асемблер визначає такі константи у вигляді послідовних суміжних байт. Посилання на ім’я А3 вказує на першу константу, А3+1 - на другу,
А3+2 - на третю тощо. Наприклад, команда:
MOV AH,A3+2
заносить до старших восьми розрядів акумулятора шістнадцятирічне число 23.
При роботі з константами такого типу треба мати на увазі, що якщо команда асемблера DB резервує по одному байту для кожного
числа, то команда DW – по одному слову (два байти), незалежно від кількості розрядів у числах, що завантажуються. Тому при
використанні команди типа
A3 DW 10,12,23H,1001B
посилання на другу константу (число 12) буде здійснюватись через вираз А3+2, а не А3+1, як це було у попередньому прикладі (поясніть
чому саме).
У мовах високого рівня таким чином описуються змінні з індексами або масиви.
Завдання для перевірки №3: Скільки констант визначено в наведеному вище операторі DB під назвою А3? Переведіть всі ці числа у
двійкову, десяткову та шістнадцятирічну системи числення. Як би ви визначили відповідний масив з ім’ям А3 у мові програмування
ПАСКАЛЬ?
32. Завдання для перевірки №4: Напишіть на мові асемблера фрагмент програми, у якому:
1. Завантажте п’ять чисел: 12,13H,18,70Q,280 під одним ім’ям.
2. Завантажте друге з визначених чисел до регістру АХ, а п’яте до регістра СХ.
Яку з наведених вище команд ви використали для визначення даних і чому?
4. Вирази з повторенням змінних. Директиви визначення даних допускають заповнення сусідніх комірок пам’яті однаковими
значеннями через дублювання даних. Формат такої директиви має вигляд:
[ім’я] D{n} {число повторень} DUP {вираз}
Наприклад:
DW 10 DUP(?) ; десять невизначених слів
DB 5 DUP(14); п’ять байт, в яких містяться числа 0EH
DB 3 DUP(4DUP(8)); дванадцять байт, в яких містяться числа 8H
Завдання для перевірки №5: Наведіть свої приклади виразів з повторенням змінних та поясніть їх викладачеві. Які ви бачите можливості
практичного використання виразів з повторенням змінних при написані програм?
Вираз може містити чисельну або символьну константу. Символьні константи беруться у подвійні або одинарні ‘лапки’ та
переводяться при обробці програми в коди ASCII (додаток 3). Наприклад:
A1 DB ‘IBM PC AT’
Більш досконало робота з рядковими константами у мові програмування асемблер буде описана у теоретичних відомостях до
лабораторної роботи №4.
1.2. Команда перенесення даних
У чотирирозрядних та вісьмирозрядних процесорах існувало багато асемблерних кодів для команд перенесення даних [1].
Наприклад, існували окремі команди для перенесення даних з одного регістру процесору до іншого, з комірки пам’яті до регістру та з
регістру до комірки пам’яті. Але перехід до шістнадцятирозрядної шини даних дозволив реалізувати один асемблерний код команди MOV
для будь-якої операції перенесення даних [4,7-9].
33. Формат команди:
{позначка} [код команди] [операнд-приймач], [операнд-джерело]
Увага! Розташування в цій команді приймача і джерела даних є стандартним для процесорів фірми Intel.
Використання команди MOV тісно пов’язано з видами адресації, що використовуються в асемблері. Відрізняють п’ять головних
видів адресації.
1. Безпосередня адресація. Дані, що завантажуються, містяться безпосередньо у коді команди. Наприклад:
A4 DB ?; Зарезервувати комірку для змінної А1
...........................................................................................................
MOV AX,15H; Завантажити до акумулятору число 15H
MOV A4,15H; Завантажити до комірки пам’яті A1 число 15H
2. Неявна адресація. Джерело та приймач інформації записуються у самому коді команди. Це може бути назва регістру або
посилання на комірку пам’яті. Наприклад:
A1 DB 100H; Завантажити до комірки пам’яті A1 число 100H
...............................................................................................................
MOV BX,A1; Завантажити до регістру BX вміст комірки A1
MOV AX,BX; Завантажити до регістру AX вміст регістру BX
3. Пряма адресація. Безпосереднє звертання до комірки пам’яті з визначеним номером. Цей вид адресації використовується при
системному програмуванні для занесення даних до комірок пам’яті, вміст яких впливає на виконання системних процедур та загалом на
представлення інформації в комп’ютері. Наприклад:
MOV [B8000], ‘A’; Завантажити символ А до відеопам’яті
При вирішенні несистемних математичних та логічних задач цим видом адресації програмісти майже не користуються. Замість нього в
більшості випадків використовується безпосередня та неявна адресація.
4. Посередня адресація. При цьому виді адресації вміст одного регістру або регістрової пари процесору є вказівником на комірку
пам’яті, що містить потрібну інформацію або в яку вона мусить бути поміщена. Посилання на поточну комірку пам’яті позначається
символом $ (долар). Наприклад:
34. MOV BX, 100H
МOV CX, [BX]; Завантажити до регістру СХ число з сегменту даних зі зміщенням 100Н
;(повна адреса комірки пам’яті DS:100H )
Як можна побачити з наведеного прикладу, посилання на комірку пам’яті позначається в асемблері через квадратні дужки.
5. Адресація зі зміщенням. Як і посередня адресація, місить посилання на комірку пам’яті. Зміщення вказується як безпосередній
операнд. Ефективно використовується разом з директивою визначення кількох констант. Наприклад:
A DB 1,2,3,4,5; Визначення масиву з кількох констант
.................................................................................................
MOV BX, A+2; Завантажити до регістру BX число 3
1.3. Арифметичні операції над двійковими числами
Додавання та віднімання байт або слів, що містять двійкові дані, здійснюється за допомогою команд ADD та SUB відповідно
[1,4,7-9].
Формат команд додавання та віднімання у мові програмування асемблер цілком співпадає з форматом команди MOV:
{позначка} [код команди] [операнд-приймач], [операнд-джерело]
Зрозуміло, що результат операції буде завантажений до операнда-приймача. Таким чином, наприклад, при складанні двох чисел
(виконанні команди ADD), перше з чисел, які складаються, буде втрачене, а замість нього у відповідний регістр або комірку пам’яті
завантажується отриманий результат.
Віднімання у двійковій арифметиці реалізується через додавання від’ємних чисел. Від’ємне число містить одиничний біт у
старшому розряді та формуються за допомогою двійкового доповнення. Таким чином, для представлення від’ємного числа необхідно
інвертувати всі біти додатного числа та до отриманого результату додати одиницю. Наприклад:
Число 65 01000001
Інверсія бітів 10111110
Додати 1 10111111 Число -65
Зміна знака від’ємного числа проводиться таким самим чином: треба інвертувати всі біти додатного числа та до отриманого
результату додати одиницю. Для нашого приклада:
35. Число –65 10111111
Інверсія бітів 01000000
Додати 1 01000001 Число 65
Сума двох рівних за модулем, але різних за знаком чисел, при такому формуванні кодів від’ємних чисел завжди буде дорівнювати 0
(перевірте це для чисел 65 та -65 та спробуйте математично довести цю тотожність).
Таким чином, процесор записує від’ємні числа як великі додатні, і правила мови асемблера не дають можливостей їх
відрізнити. Програміст повинен сам чітко слідкувати за зміною чисел у регістрах і фіксувати їх знак, якщо у цьому є необхідність.
Існують п’ять можливих ситуацій використання команд ADD та SUB, що пов’язані з представленням та розташуванням даних, які
представлені у таблиці 12.
Таблиця 12. Команди додавання та віднімання мови АСЕМБЛЕР
Операція Приклади
Додавання/віднімання регістр-регістр. ADD AX,BX
SUB CL,DL
Додавання/віднімання регістр-пам’ять. A1 DW 50H
A2 DB 10H
……………..........................
ADD AX,A1
SUB CL,A2
Додавання/віднімання пам’ять-регістр. A1 DW 50H
A2 DB 10H
……………..........................
ADD A1,AX
SUB A2,CL
Додавання/віднімання регістр-безпосереднє значення. ADD A1,10H
SUB A2,8
Додавання/віднімання пам’ять-безпосереднє значення. A1 DW 50H
A2 DB 10H
……………..........................
ADD A1,5
36. Операція Приклади
SUB A2,12H
Додавання/віднімання регістр-безпосереднє значення. ADD A1,10H
SUB A2,8
Додавання/віднімання пам’ять-безпосереднє значення. A1 DW 50H
A2 DB 10H
……………….......................
ADD A1,5
SUB A2,12H
Прямої операції «Пам’ять-Пам’ять» мікропроцесори типу Intel 80x86 не підтримують. Тому такі дії потрібно здійснювати через три
елементарних операції процесора:
1. Занесення даних з комірки пам’яті №1 до регістру.
2. Виконання операції додавання або віднімання між регістром та коміркою пам’яті №2.
3. Занесення даних з регістру до комірки пам’яті №2.
Наприклад:
A1 DW 50H
A2 DW 10H
................................................
MOV AX,A1
ADD AX,A2
MOV A2,AX
Множення та ділення чисельних даних в мові асемблер здійснюється за допомогою команд MUL та DIV для беззнакових чисел та
за допомогою команд IMUL та IDIV для знакових чисел. Контроль над форматом чисел, що обробляються, не може здійснюватись
процесором автоматично, тому вибирати для використання ту чи іншу команду повинен сам програміст.
В асемблері мікропроцесора Intel 8086 існують два формати команди множення - множення байта на байт та множення слова на
слово. При множенні байта на байт один з множників знаходиться у регістрі AL, а другий - в байті пам’яті або в однобайтовому регістрі.
Результат виконання операції множення буде розміщений в регістрі AX.
Наприклад, фрагмент програми, що знаходить куб числа 5, можна записати таким чином:
A1 DB 5H