Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсова робота 11 варіант.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
852 Кб
Скачать
☆

2 Виконання арифметичних операцій

2.1 Арифметичні операції над двійковими числами

Додавання двійкових чисел без знаку

Мікропроцесор виконує додавання операндів за правилами складання двійкових чисел. Проблем не виникає до тих пір, поки значення результату не перевищує розмірності поля операнда. Наприклад, при додаванні операндів розміром в байт результат не повинен перевищувати число 255. Якщо це відбувається, то результат виявляється невірним. До прикладу, виконаємо додавання: 254 + 5 = 259 в двійковому вигляді. 11111110 + 0000101 = 1 00000011. Результат вийшов за межі восьми біт і правильне його значення вкладається в 9 біт, а в 8-бітовому полі операнда залишилося значення 3, що, звичайно, невірно. Для фіксування ситуації виходу за розрядну сітку результату, призначений прапор переносу cf. Він розташовується в біті 0 регістра прапорів eflags / flags. Саме установкою цього прапора фіксується факт перенесення одиниці зі старшого розряду операнда. В системі команд мікропроцесора є три команди двійкового складання:

  • inc операнд - операція інкремента, тобто збільшення значення операнда на 1;

  • add операнд_1, операнд_2 - команда додавання з принципом дії: операнд_1 = операнд_1 + операнд_2

  • adc операнд_1, операнд_2 - команда складання з урахуванням прапора перенесення cf. Принцип дії команди: операнд_1 = операнд_1 + операнд_2 + значеніе_cf

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

Мікропроцесор не підозрює про розходження між числами із знаком і без знака. Замість цього у нього є фіксування виникнення характерних ситуацій, що складаються в процесі обчислень:

  • прапор переносу cf, установка якого в 1 говорить про те, що відбувся вихід за межі розрядності операндів;

  • команду adc, яка враховує можливість такого виходу (перенесення з молодшого розряду).

Інший засіб - це реєстрація стану старшого (знакового) розряду операнда, яке здійснюється за допомогою прапора переповнення of в регістрі eflags (біт 11).

Приклад 2.1.1.

30566 = 01110111 01100110

+

00687 = 00000010 10101111

=

31253 = 01111010 00010101

Стежимо за переносами з 14-го і 15-го розрядів і правильністю результату: переносів немає, результат правильний.

Приклад 2.1.2.

30566 = 01110111 01100110

+

30566 = 01110111 01100110

=

61132 = 11101110 11001100

Стався перенесення з 14-го розряду; із 15-го розряду переносу немає. Результат неправильний, тому що є переповнення - значення числа вийшло більше, ніж те, яке може мати 16-бітне число зі знаком (+32 767).

Приклад 2.1.3.

-30566 = 10001000 10011010

+

-04875 = 11101100 11110101

=

-35441 = 01110101 10001111

Стався перенесення з 15-го розряду, з 14-го розряду немає переносу. Результат неправильний, тому що замість негативного числа вийшло позитивне (в старшому біті знаходиться 0).

Переповнення (установка прапора of в 1) відбувається при перенесенні:

  • з 14-го розряду (для позитивних чисел зі знаком);

  • з 15-го розряду (для негативних чисел).

І навпаки, переповнення не відбувається (тобто прапор of скидається в 0), якщо є перенос з обох розрядів або перенесення відсутня в обох розрядах.

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

Якщо зменшуване більше від'ємника, то проблем немає, - різниця позитивна, результат вірний. Якщо зменшуване менше від'ємника, виникає проблема: результат менше 0, а це вже число зі знаком. У цьому випадку результат необхідно звернути. При звичайному відніманні (в стовпчик) роблять позику 1 з старшого розряду. Мікропроцесор надходить аналогічно, тобто займає 1 з розряду, наступного за старшим, в розрядній сітці операнда. Пояснимо на прикладі.

Приклад 2.1.4.

05 = 00000000 00000101

-10 = 00000000 00001010

Для того щоб справити віднімання, зробимо

уявний позику із старшого розряду:

100000000 00000101

-

00000000 00001010

=

11111111 11111011

Тим самим по суті виконується дія

(65 536 + 5) - 10 = 65 531,

Результат -5 в додатковому коді!

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

До команд віднімання відносяться наступні:

  • dec операнд - операція декремента, тобто зменшення значення операнда на 1;

  • sub операнд_1, операнд_2 - команда віднімання; її принцип дії: операнд_1 = операнд_1 - операнд_2

  • sbb операнд_1, операнд_2 - команда віднімання з урахуванням позички (прапора cf): операнд_1 = операнд_1 - операнд_2 - значеніе_cf

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

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

Приклад 2.1.5.

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

45 = 0010 1101

-

-127 = 1000 0001

=

-44 = 1010 1100

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

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

Приклад 2.1.6.

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

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

-45 = 1101 0011

+

-45 = 1101 0011

=

-90 = 1010 0110

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

Множення чисел без знаку

Для множення чисел без знака призначена команда

mul сомножітель_1

Існують  прапори переносу cf і переповнення of:

  • якщо старша частина результату нульова, то після операції прапори cf = 0 і of = 0;

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

Множення чисел зі знаком

Для множення чисел зі знаком призначена команда