- •Тема 2. Архітектура процесора і мова асемблера: Основи програмування на мові асемблера
- •1.1. Додавання двійкових чисел без знака
- •1.2. Додавання двійкових чисел зі знаком
- •1.3. Віднімання двійкових чисел без знака
- •1.4. Віднімання двійкових чисел зі знаком
- •1.5. Віднімання і додавання операндів великої розмірності
- •1.6. Множення чисел без знака
- •1.7. Множення чисел зі знаком
- •1.8. Ділення чисел без знака
- •1.9. Ділення чисел зі знаком
1.4. Віднімання двійкових чисел зі знаком
Тут все трохи складніше. Останній приклад (лістинг 2) показав те, що мікропроцесору нема чого мати два пристрої - додавання і віднімання. Досить наявності тільки одного - пристрою додавання. Але для віднімання способом додавання чисел зі знаком у додатковому коді необхідно представляти обидва операнди - і зменшуване, і від’ємник. Результат також потрібно розглядати як значення в додатковому коді. Але тут виникають складнощі. Перш за все вони пов'язані з тим, що старший біт операнду розглядається як знаковий. Розглянемо приклад віднімання 45 - (-127).
Приклад
7.
Віднімання
чисел со знаком 1 45
= 0010 1101 (-127)
= 1000 0001 -44
= 1010 1100
Інший приклад різниці розглядається в прикладі 8, але ми винайдемо її способом додавання.
-
Приклад
8. Віднімання
чисел зі
знаком 2 (-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. Таким чином, цей прапор можна використовувати для операцій над числами зі знаком.