Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_1-3.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
998 Кб
Скачать
☆

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-кодами чисел. Але ці команди мають і суттєві недоліки:

  1. При великій кількості чисельних операцій виконання кожного разу ASCII-корекції призводить до значних ускладнень логіки програми, і як результат до збільшення обсягу програми та машинного часу, який є необхідним для її виконання.

  2. Операції корекції можна здійснювати лише над даними, що знаходяться в акумуляторі.

  3. Для реалізацій арифметичних операцій над багаторозрядними числами, що представлені у кодах ASCII, треба реалізовувати ще більш складні програми з використанням команд обробки рядків, які будуть розглянути нижче.

  4. Над даними у форматі ASCII не можна проводити логічних операцій.

  5. При великій кількості команд ASCII-корекції ускладнюється робота з програмою при її редагуванні.

Тому ASCII-корекція ефективна лише у невеликих програмах, в яких передбачене постійне введення та виведення даних при обмеженій кількості арифметичних і при відсутності логічних операцій над ними. Якщо ж програма містить складні чисельні розрахунки, для підвищення ефективності її роботи треба використовувати переведення чисел з формату ASCII до двійкового формату та навпаки.

Крім «розгорнутого десяткового формату» на практиці ефективно використовується формат BCD (Binary Coded Decimal - десяткове, переведене у двійкове). Представлення даних у форматі BCD потребує вдвічі менших ресурсів пам’яті, ніж використання «розгорнутого десяткового формату». Тому формат BCD також називають «запакованим». Так, отримане нами в попередньому прикладі число 0102H являло собою «розгорнутий десятковий формат» для числа 12. У форматі BCD це число запишеться як 12H, зайві нулі будуть пропущені. Існують команди корекції для формату BCD [4]:

DAA - десяткова корекція для додавання;

DAS - десяткова корекція для віднімання

Тобто, ми розглянули можливості проведення арифметичних операцій над однорозрядними числами у форматах ASCII та BCD. Здійснення будь-яких операцій над багаторозрядними числами в ASCII-форматі можливе тільки з використанням команд обробки рядкових даних.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]