- •Основи програмування на мові асемблер та знайомство з програмним забезпеченням для виконання лабораторних робіт
- •Теоретичні відомості
- •1.1 Особливості архітектури мікропроцесора типу Intel 80х86
- •Головні регістри мп Intel 8086 та їх призначення
- •1.2 Організація обчислень та узагальнена архітектура комп’ютера ibm pc
- •1.3 Основи програмування на мові асемблер та її синтаксис. Позначки, коди команд, операнди та директиви
- •1.4. Перетворення програми з тексту на мові асемблера у виконуваний модуль
- •1.5. Основи роботи з програмою afd
- •1.6. Основи роботи з програмою td
- •2. Порядок виконання роботи
- •4. Контрольні питання:
- •Сегментація програми. Сегменти коду, даних та стеку. Їх розташування в пам’яті еом. Директиви мови асемблера segment та ends.
- •Арифметичні та логічні операції мови асемблер
- •1. Теоретичні відомості
- •Директиви визначення даних
- •1.2. Команда перенесення даних
- •1.3. Арифметичні операції над двійковими числами
- •1.4. Команди логічних операцій
- •1.5. Команди зсуву бітів числа
- •1.6. Команди циклічного зсуву бітів числа
- •1.7. Структура асемблерних програм для com- та exe-модулів. Виклик процедур та стек
- •Таким чином, структура com-програми повинна бути такою:
- •2. Варіанти індивідуальні завдання для лабораторної роботи
- •3. Порядок виконання роботи
- •5. Контрольні питання
- •Структура програми на мові асемблер. Команди вітвлення та циклу
- •1. Теоретичні відомості
- •1.1 Механізми передачі керування та зміна послідовності виконання команд. Їх реалізація у мові асемблера. Типи адресації
- •1.2 Команда безумовного переходу jmp
- •1.3 Команда циклу loop
- •1.4 Команда порівняння cmp
- •1.5. Команди умовного переходу в мові асемблер
- •2. Варіанти індивідуальних завдань
- •3. Порядок виконання роботи
- •Виведення даних на монітор персонального комп’ютера
- •1. Теоретичні відомості
- •1.1. Представлення арифметичних та рядкових даних. Формати ascii та bcd. Команди корекції
- •1.2. Команди обробки рядкових даних мови асемблера
- •1.3. Переведення ascii-формату у двійковий формат та навпаки
- •Починаючи з молодшого байту обробляти число у лівому напрямку.
- •Вилучати трійки з шістнадцятирічних цифр кожного ascii-байту.
- •Множити отримані цифри на ваговий коефіцієнт кожного з розрядів та складати результати.
- •1.4. Введення та виведення даних в мові асемблера
- •1.5. Реалізація екранних операцій у мові програмування асемблер
- •2. Індивідуальні завдання для виконання лабораторної роботи №4
- •3. Порядок виконання роботи
- •5. Контрольні питання
- •Перелік рекомендованої літератури
- •Додаток 1 загальні вимоги до оформлення протоколів лабораторних робіт
- •Додаток 2 головні функції перериваннь bios та операційної системи ms-dos д2.1 переривання bios
- •Int 05h. Друк екрану.
- •Int 10h. Керування монітором (більш досконало функції переривання 10н описані у теоретичних відомостях до лабораторної роботи №4).
- •Int 11h. Запит списку приєднаного обладнання.
- •Д2.2 переривання ms-dos
- •Д2.3 головні функції перивання ms-dos int 21н
- •Додаток 3
1.3. Арифметичні операції над двійковими числами
Додавання та віднімання байт або слів, що містять двійкові дані, здійснюється за допомогою команд ADD та SUB відповідно [1,4,7-9].
Формат команд додавання та віднімання у мові програмування асемблер цілком співпадає з форматом команди MOV:
{позначка} [код команди] [операнд-приймач], [операнд-джерело]
Зрозуміло, що результат операції буде завантажений до операнда-приймача. Таким чином, наприклад, при складанні двох чисел (виконанні команди ADD), перше з чисел, які складаються, буде втрачене, а замість нього у відповідний регістр або комірку пам’яті завантажується отриманий результат.
Віднімання у двійковій арифметиці реалізується через додавання від’ємних чисел. Від’ємне число містить одиничний біт у старшому розряді та формуються за допомогою двійкового доповнення. Таким чином, для представлення від’ємного числа необхідно інвертувати всі біти додатного числа та до отриманого результату додати одиницю. Наприклад:
Число 65 |
01000001 |
|
Інверсія бітів |
10111110 |
|
Додати 1 |
10111111 |
Число -65 |
Зміна знака від’ємного числа проводиться таким самим чином: треба інвертувати всі біти додатного числа та до отриманого результату додати одиницю. Для нашого приклада:
Число –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 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
.........................
MOV AL,A1
MUL A1
MUL A1
При множенні слова на слово один з множників знаходиться у регістрі AX, а другий - в двох байтах пам’яті або в одному з регістрів процесора. Результатом множення в цьому випадку буде подвійне слово. Його молодші розряди будуть розташовані в регістрі AX, а старші - в регістрі DX. Треба мати на увазі, що ця команда ігнорує (затирає) будь-які дані, що містяться в регістрі DX. Наприклад, фрагмент програми, яка підносить число 100H до кубу можна записати так:
A1 DW 100H
......................
MOV AX,A1
MUL A1
MUL A1
Таким чином, формат команд множення у мові програмування асемблер такий:
{позначка} [код команди] [операнд]
Операнд команди множення визначає розташування першого множника та його формат (байт або слово). Другий множник, відповідно до логіки роботи команди, мусить бути розташований в акумуляторі.
Завдання для перевірки №6: За якими ознаками процесор визначає, що в першому випадку треба множити байти, а в другому - слова?
Команда множення IMUL працює цілком аналогічним чином, з урахуванням знаку числа. Наприклад:
A1 DB 10110111B
...........................................................
MOV AL,5
MUL A1
...........................................................
MOV AL,5
IMUL A1
Оскільки останній біт числа A1 дорівнює одиниці, то в першому випадку воно буде розглядатися як велике додатне, а в другому - як від’ємне число.
Завдання для перевірки №7: Підрахуйте без використання калькулятору, який результат буде отриманий в першому та другому випадках.
Команда ділення в асеблері також має два формати: ділення слова на байт та ділення подвійного слова на слово. При діленні слова на байт ділене міститься в регістрі AX, а дільник - у байті пам’яті або в однобайтовому регістрі. При діленні слова на байт результат ділення буде розміщений таким чином: частка - у регістрі AH, а остача - у регістрі AL. При діленні подвійного слова на слово ділене знаходиться в у парі регістрів DX:AX, а дільник - а дільник - в регістрі або в слові пам’яті. Після операції ділення остача завантажується в регістр DX, а частка в регістр AX. Команда DIV використовується для беззнакових, а IDIV - для знакових даних.
Таким чином, формат команд множення мові програмування асемблер повністю відповідає формату команди множення:
{позначка} [код команди] [операнд]
