logo
МПТ_L_к

5.3. Двійкова арифметика в мікропроцесорі.

При додаванні позитивних двійкових чисел, тобто, чисел із знаком +, додавання виконується в прямому коді числа. При цьому, як і при складанні десяткових чисел, при додаванні двох цифр які знаходяться в одній позиції і кожна з яких дорівнює 1, повинно бути виконано перенесення в 1 в старший розряд (вліво), так як сума дорівнює основі двійкової системи числення, а в цій позиції числа результату повенен бути записаний нуль. Наприклад,: 1001 Другий приклад: 1011

+ 1001 + 1011

= 1 0010 =1 0110 .

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

Двійкові числа можуть бути і від”ємні. Як ми уже розглянули раніше,

для того, щоб їх відрізняти (як і в інших ситемамах числення) використовують

або знак (таке надання чисел називають їх прямим кодом), або величину числа

в формі доповнення (таке надання називають їх доповнюючим кодом).

Розглянемо виконання алгебраїчного додавання, тобто, коли треба враховувати знаки чисел. Його можна виконати за допомогою операції віднімання двійкових чисел, по аналогії розглянутим нами додаванням, при цьому використовують не перенесення 1 в старший розряд, а в разі потреби - її запозичення із нього. Але використання чисел у прямому коді (із знаком) значно ускладнює структуру МП, так як в цьому випадку операція віднімання повинна складатись із трьох мікрооперацій: 1) спочатку необхідно визначити, яке із двох чисел, що віднімаються, більше; 2) провести безпосереднє віднімання (із більшого відняти менше) і 3) – присвоїти отриманому результату знак більшого із віднімаємих чисел.

Тому в більшості мікропроцесорів в таких випадках використовується не просте (звичайне) віднімання, а віднімання як окремий тип додавання. Для цього число, яке віднімається, спочатку перетворюється в своє доповнення (доповнюючий код числа), а потім це доповнення додається до зменшуваного числа. Цей підхід використовується у всіх мікропроцесорах при потребі помножити на від’ємне число, яке теж переводять в код доповнення.

Розглянемо приклад, в якому виконаємо спочатку звичайне десяткове віднімання: 987-362=625. Тепер виконаємо операцію віднімання, як особивий тип додавання. Від’ємник (362) потрібно перетворити у своє доповнення і додати його до зменшуваного (987). Для числа 362 таким доповненням є 638, так як сума обох чисел дає число 1000. Тепер виконуємо додавання і отримуємо: 987+638= 625 і одиницю (тисяча) як стан перенесення. Наявність перенесення із крайнього лівого розряду показує на те, що результат – число позитивне і отримано не в виді доповнення, а в істиній формі.

Розглянемо випадок, коли результат число від’ємне: 362-987=-625.

Шукаємо доповнення до числа 987, яке дорівнює 013, і виконуємо додавання: 362+013=375. Але це ще не результат. Ми повинні проаналізувати стан перенесення із крайнього лівого розряду. Воно відсутнє, тобто, дорівнює нулю. Це показує, що результат – число від”ємне і крім цього знаходиться в формі доповнення (доповнюючому коді). Для того, щоб дістати істиний результат, треба знайти його доповнення, а воно дорівнює 625.

По аналогії з розглянутим нами доповненням в десятковій системі числення, ми повинні вирахувати доповнення від’ємника до 2.

Тепер скористуємось в двійковій арифметиці принципом доповнення до 2 і перевіримо достовірність результатів. Приклад віднімання:

1010(10 ) - 0110(6 ) = 0100 (4).

Для цього знаходимо до від’ємника 0110 доповнення, тобто, 1001+1=1010.

Тепер віднімання замінюємо на окремий вид додавання і отримуємо результат:

1010

+ 1010

= 1 0100 ( і 1 переносу). Результат – число 4 .

Поява переносу із крайнього лівого розряду в неіснуючий розряд свідчить, що результат – число позитивне і представлено в прямому коді (модулем).

Приклад, коли результат – число від’ємне: 0101 (5 ) - 1100 (12 ) =- 0111(7 ).

Доповнення до числа 1100 дорівнює: 0011 + 1 = 0100. Виконуємо додавання:

0101

+ 0100

= 1001. Як бачимо переносу не має. Останнє свідчить, що результат є від’ємне число і представлено в формі доповнення. Для отримання числа в пря-мому коді(або модулю), знову перетворюємо 1001 і дістаємо кінцевий результат: – ( 0110+1) = - 0111(7).

Ще два приклади: а) б)

011 0110 (54 ) - 1110101 (117 ) 1110101 (117 ) – 011 0110 (54 )

Доповнення: 0001010 +1 = 0001011 1001001 + 1 = 1001010

011 0110 (54 ) 1110101 (117 )

+ 000 1011 ( доповнення) + 1001010 (довнення)

= 100 0001 результат: = 1 0111111

Перенесення немає, число від’ємне Є перенесення, число в прямому коді

перетворюємо 0111110 +1= 0111111 перетворювати не потрібно

(2ст) 5 4 3 2 1 0

0 1 1 1 1 1 1 0111111 = +63

0+32+16+8+4+2+1= -63