- •Тема 2. Архітектура процесора і мова асемблера: Основи програмування на мові асемблера
- •1.1. Додавання двійкових чисел без знака
- •1.2. Додавання двійкових чисел зі знаком
- •1.3. Віднімання двійкових чисел без знака
- •1.4. Віднімання двійкових чисел зі знаком
- •1.5. Віднімання і додавання операндів великої розмірності
- •1.6. Множення чисел без знака
- •1.7. Множення чисел зі знаком
- •1.8. Ділення чисел без знака
- •1.9. Ділення чисел зі знаком
1.2. Додавання двійкових чисел зі знаком
Насправді мікропроцесор не підозрює про різницю між числами зі знаком та без знаку. Замість цього у нього є засоби фіксування виникнення характерних ситуацій, що складаються в процесі обчислень. Деякі з них ми розглянули під час обговорення додавання чисел без знака:
прапор переносу cf, встановлення якого в 1 говорить про те, що стався вихід за межі розрядності операндів;
команду adc, яка враховує можливість такого виходу (перенесення з молодшого розряду).
Інший засіб - це реєстрація стану старшого (знакового) розряду операнда, яка здійснюється за допомогою прапора переповнення of в регістрі flags (біт 11).
Ви, звичайно, пам'ятаєте, як представляються числа в комп'ютері: додатні - у прямому коді, від’ємні - в додатковому коді. Розглянемо різні варіанти додавання чисел. Приклади покликані показати поведінку двох старших бітів операндів і правильність результату операції додавання.
Приклад
1.
Додавання
чисел 1 30566
= 01110111 01100110 +00687
= 00000010 10101111 31253
= 01111010 00010101
Приклад
2. Додавання
чисел 2 30566
= 01110111 01100110 +30566
= 01110111 01100110 61132
= 11101110 11001100
Відбувся перенос з 14-го розряду; з 15-го розряду переносу немає. Результат неправильний, тому що є переповнення - значення числа вийшло більше, ніж те, яке може мати 16-бітне число зі знаком (+32 767).
Приклад
3. Додавання
чисел 3 -30566
= 10001000 10011010 -04875
= 11101100 11110101 -35441
= 01110101 10001111
Відбувся перенос з 15-го розряду, з 14-го розряду немає переносу. Результат неправильний, так як замість від’ємного числа вийшло додатне (у старшому біті знаходиться 0).
Приклад
4. Додавання
чисел 4 –4875
= 11101100 11110101 –4875
= 11101100 11110101 –9750
= 11011001 11101010
Є перенесення з 14 і 15-го розрядів. Результат правильний.
Таким чином, ми досліджували всі випадки і з'ясували, що ситуація переповнення (установка прапора of в 1) відбувається при перенесенні:
з 14-го розряду (для додатних чисел зі знаком);
з 15-го розряду (для від’ємних чисел).
І навпаки, переповнення не відбувається (тобто прапор of скидається в 0), якщо є перенесення з обох розрядів або перенесення відсутнє в обох розрядах.
Отже, переповнення реєструється за допомогою прапора переповнення of. Додатково до прапора of при перенесенні з старшого розряду встановлюється в 1 і прапор переносу cf. Так як мікропроцесор не знає про існування чисел зі знаком і без знака, то вся відповідальність за правильність дій з отриманими числами лягає на програміста. Проаналізувати прапори cf і of можна командами умовного переходу jc\jnc і jo\jno відповідно.
Що ж до команд додавання чисел зі знаком, то вони ті самі, що і для чисел без знака.