- •Основи програмування на мові асемблер та знайомство з програмним забезпеченням для виконання лабораторних робіт
- •Теоретичні відомості
- •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. Теоретичні відомості
1.1. Представлення арифметичних та рядкових даних. Формати ascii та bcd. Команди корекції
Як вам вже відомо, оброблюючи чисельну інформацію, для підвищення ефективності та надійності роботи процесор здійснює всі арифметичні, логічні дії та порівняння даних, представляючи їх у двійковому коді. І це не викликає ніяких труднощів, якщо дані оброблюються безпосередньо у програмі і не здійснюється їх введення або виведення на зовнішні пристрої. Але що зручно для машини - на жаль, є незручним для людини. Навіть важко собі уявити, щоб результати обчислень людина читала з екрану у двійковій формі! Тому всі дані при введені та виведенні, а також при обробці текстової інформації, представляються у форматі ASCII (American Standard Code for Information Inchenging - Американський Стандарт Коду для Обміну Інформацією). ASCII-коди всіх символів від 0 до 128 ви можете знайти у додатку 3. Суть ASCII-представлення інформації вам вже відома з основ інформатики. Вона полягає в тому, що кожному символу, який вводиться з клавіатури або виводиться на екран, відповідає свій чисельний код. Таким чином, введення даних у ASCII-форматі є так званим буфером між формою, зручною для комп’ютера і формою, зручною для людини, оскільки всі букви та цифри ми представляємо у вигляді чисельних кодів. Якщо програмою передбачена тільки обробка рядкових даних, наприклад, їх сортування, пошук символів чи рядка символів, заміна окремого символу або кількох символів, ніяких проблем з ASCII-представленням даних у нас не виникне.
Проте при виконанні арифметичних та логічних операцій над даними у форматі ASCII виникають певні труднощі, які потребують спеціальної обробки даних. Як можна побачити з таблиці у додатку 3, символу «0» відповідає ASCII-код 30H, символу «1» - 31H, символ «9» - 39H тощо. Тобто, якщо в комірку пам’яті з клавіатури завантажений ASCII-код будь-якої цифри, для її двійкового представлення достатньо відняти від завантаженого числа число 30H. Навпаки, якщо отриманий чисельний результат і його значення лежить у межах від нуля до дев’яти, для переведення такого результату до формату ASCII та подальшого виведення на зовнішній пристрій достатньо додати до отриманого числа число 30H.
Але як бути з введенням та виведенням дворозрядних, трьохрозрядних та більших чисел? Як проводити арифметичні та логічні операціями над числами, що представлені в кодах ASCII? Перш за все, існують команди мови асемблера, які здійснюють ASCII-корекцію чисельних даних для всіх математичних операцій. Формат команд ASCII-корекції досить простий:
{позначка} [код команди]
Операндів у команд ASCII-корекції немає, тому що вони обробляють дані безпосередньо в акумуляторі. Існують такі команди ASCII-корекції:
AAA - ASCII-корекція для додавання;
AAS - ASCII-корекція для віднімання;
AAM - ASCII-корекція для множення;
AAD - ASCII-корекція для ділення;
Приклад асемблерної програми з використанням команди ASCII-корекції:
A1 DW ‘8’
A2 DW ‘4’
A3 DW ?
............................
MOV AX,A1
ADD AX,A2
AAA
OR AX,3030H
MOV A3,AX
Зрозуміло, що після команди ADD у регістрі AX буде міститись число 34H+38H=6CH. Це напевно невірний результат. Після команди AAA у регістрі AX буде міститись число 0102Н, тобто шістнадцятирічний запис вірного десяткового результату. Для отримання коректного ASCII-коду цифр «1» та «2» залишається тільки додати до кожного з отриманих чисел 30H. У наведеному прикладі це зроблено за допомогою команди OR.
Завдання для перевірки №1 (ускладнене): Побудуйте алгоритм виконання ASCII-корекції результату через арифметичні, логічні команди та команди умовного та безумовного переходів. Напишіть на мові асемблера свою програму, яка виконує ASCII-корекцію. Не забувайте, що для отримання вірного результату треба проаналізувати прапор AF - перенесення з третього до четвертого розряду.
Завдання для перевірки №2 (ускладнене): Напишіть аналогічні асемблерні програми ASCII-корекції для віднімання, множення та ділення. При написані програм для множення та ділення майте на увазі, що множити та ділити треба не ASCII-коди чисел, а безпосередньо самі числа. Наприклад, для того, щоб помножити 9 на 5 з ASCII-корекцією, треба виконати такі дії:
A1 DW ‘9’
A2 DW ‘5’
A3 DW ?
............................
MOV AX,A1
MOV СX,A2
AND AL,0FH; В регістрі AL число 09H (чому?)
AND CL,0FH; В регістрі CL число 05H (чому?)
MUL CL; В регістрі AL число 2DH
AAM; В регістрі AL число 0405H
OR AX,3030H
MOV A3,AX
Представлення типу 0102H для числа 12 в літературі називають «розпакованим десятковим форматом» [4].
Єдиною перевагою команд ASCII-корекції є можливість безпосереднього здійснення чисельних операцій над ASCII-кодами чисел. Але ці команди мають і суттєві недоліки:
При великій кількості чисельних операцій виконання кожного разу ASCII-корекції призводить до значних ускладнень логіки програми, і як результат до збільшення обсягу програми та машинного часу, який є необхідним для її виконання.
Операції корекції можна здійснювати лише над даними, що знаходяться в акумуляторі.
Для реалізацій арифметичних операцій над багаторозрядними числами, що представлені у кодах ASCII, треба реалізовувати ще більш складні програми з використанням команд обробки рядків, які будуть розглянути нижче.
Над даними у форматі ASCII не можна проводити логічних операцій.
При великій кількості команд ASCII-корекції ускладнюється робота з програмою при її редагуванні.
Тому ASCII-корекція ефективна лише у невеликих програмах, в яких передбачене постійне введення та виведення даних при обмеженій кількості арифметичних і при відсутності логічних операцій над ними. Якщо ж програма містить складні чисельні розрахунки, для підвищення ефективності її роботи треба використовувати переведення чисел з формату ASCII до двійкового формату та навпаки.
Крім «розгорнутого десяткового формату» на практиці ефективно використовується формат BCD (Binary Coded Decimal - десяткове, переведене у двійкове). Представлення даних у форматі BCD потребує вдвічі менших ресурсів пам’яті, ніж використання «розгорнутого десяткового формату». Тому формат BCD також називають «запакованим». Так, отримане нами в попередньому прикладі число 0102H являло собою «розгорнутий десятковий формат» для числа 12. У форматі BCD це число запишеться як 12H, зайві нулі будуть пропущені. Існують команди корекції для формату BCD [4]:
DAA - десяткова корекція для додавання;
DAS - десяткова корекція для віднімання
Тобто, ми розглянули можливості проведення арифметичних операцій над однорозрядними числами у форматах ASCII та BCD. Здійснення будь-яких операцій над багаторозрядними числами в ASCII-форматі можливе тільки з використанням команд обробки рядкових даних.
