Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lekz._9.doc
Скачиваний:
3
Добавлен:
05.05.2019
Размер:
168.96 Кб
Скачать

1.4. Віднімання двійкових чисел зі знаком

Тут все трохи складніше. Останній приклад (лістинг 2) показав те, що мікропроцесору нема чого мати два пристрої - додавання і віднімання. Досить наявності тільки одного - пристрою додавання. Але для віднімання способом додавання чисел зі знаком у додатковому коді необхідно представляти обидва операнди - і зменшуване, і від’ємник. Результат також потрібно розглядати як значення в додатковому коді. Але тут виникають складнощі. Перш за все вони пов'язані з тим, що старший біт операнду розглядається як знаковий. Розглянемо приклад віднімання 45 - (-127).

Приклад 7. Віднімання чисел со знаком 1

45 = 0010 1101

(-127) = 1000 0001

-44 = 1010 1100

Судячи зі знакового розряду, результат вийшов від’ємний, що, у свою чергу, говорить про те, що число потрібно розглядати як доповнення, що дорівнює -44. Правильний результат має бути 172. Тут ми, як і у випадку знакового додавання, зустрілися з переповненням мантиси, коли значущий розряд числа змінив знаковий розряд операнда. Відстежити таку ситуацію можна за вмістом прапора переповнення of. Його установка в 1 говорить про те, що результат вийшов за діапазон представлення знакових чисел (тобто змінився старший біт) для операнда даного розміру, і програміст повинен передбачити дії щодо коректування результату.

Інший приклад різниці розглядається в прикладі 8, але ми винайдемо її способом додавання.

-

Приклад 8. Віднімання чисел зі знаком 2

(-45) = 1101 0011

(-

45) = 1101 0011

–90 = 1010 0110

45 – 45 = -45 + (-45)= -90.

Тут все нормально, прапор переповнення of скинутий в 0, а 1 у знаковому розряді говорить про те, що значення результату - число в додатковому коді.

1.5. Віднімання і додавання операндів великої розмірності

Я кщо ви помітили, команди додавання і віднімання працюють з операндами фіксованої розмірності: 8, 16, 32 біт. А що робити, якщо потрібно додавати числа більшої розмірності, наприклад 48 біт, використовуючи 16-розрядні операнди? Наприклад, додамо два 48-розрядних числа:

Рис. 9.1 Додавання операндів великої розмірності

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

Принцип віднімання чисел з діапазоном представлення, більшим за стандартні розрядні сітки операндів, той же, що і при додаванні, тобто використовується прапор переносу cf. Потрібно лише уявляти собі процес віднімання в стовпчик і правильно комбінувати команди мікропроцесора з командою sbb.

На завершення обговорення команд додавання і віднімання відзначимо, що крім прапорів cf і of в регістрі eflags є ще кілька прапорів, які можна використовувати з двійковими арифметичними командами. Мова йде про наступні прапори:

  • zf - прапор нуля, що встановлюється в 1, якщо результат операції дорівнює 0, і в 0, якщо результат не дорівнює 0;

  • sf - прапор знаку, значення якого після арифметичних операцій (і не тільки) таке саме, як і старшого біта результату, тобто збігається з бітом 7, 15 або 31. Таким чином, цей прапор можна використовувати для операцій над числами зі знаком.

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