Скачать презентацию Лекція 8 Основи машинної арифметики 1 2 3 Скачать презентацию Лекція 8 Основи машинної арифметики 1 2 3

APMK_L8_AVR_Matem_l3(2).ppt

  • Количество слайдов: 33

Лекція 8: Основи машинної арифметики 1. 2. 3. 4. 5. Форми чисел у пам’яті Лекція 8: Основи машинної арифметики 1. 2. 3. 4. 5. Форми чисел у пам’яті ОМК. Способи кодування цілих чисел і правила їх використання для додавання. Команди додавання і віднімання в AVR Виявлення переповнення розрядної сітки при додаванні чисел. Особливості використання двійково-десяткових кодів. Способи множення і ділення чисел. Література. За підручником: с. 330 -342. За навчальним посібником: c. 158 -170. 1

2 2

1. 1. Форми чисел у пам’яті мікроконтролера. Числа зберігаються у вигляді певних кодів, залежно 1. 1. Форми чисел у пам’яті мікроконтролера. Числа зберігаються у вигляді певних кодів, залежно від їх типу, причому за основу використовується двійковий код, як найбільш економний щодо використання біт. Розрізняють числа цілі і дробові, зі знаком і без нього, а дробові можуть бути у формах з фіксованою комою та з комою, що змінює своє місце - плаває. Цілі числа та дробові з фіксованою комою відрізняються лише місцем розташування останньої. При цьому вага розрядів ліворуч визначеного місця коми і праворуч від неї монотонно змінюється у два рази. Приклад: 0101, 10112 =22 + 20 + 2– 1 + 2– 3 + 2– 4 = 5, 6875. Тому принципової різниці між цілими числами та дробовими з фіксованою комою немає і останні можна обробляти як цілі, а положення коми врахувати при виводі на індикатори. Це форма Integer. Недолік такої форми – вузький діапазон значень 2 n, що обмежу3 ється виділеною розрядністю комірок (розрядною сіткою) n.

 Щоб розширити діапазон чисел при малій їх розрядності, вони представляються у так званій Щоб розширити діапазон чисел при малій їх розрядності, вони представляються у так званій нормалізованій формі з плаваючою точкою. Суть цього полягає у зберіганні тільки певної кількості старших розрядів числа незалежно від його значення і порядку числа. Тобто число Х представляється з двох частин: мантиса (М) – двійковий дріб (1, хх. . х); порядок (Р) – степінь двійки для множника (покажчик коми). Число становить Х = М. 2 Р (це форма Real). Формати чисел з плаваючою точкою Знак Порядок Р+127 Мантиса М – 1 (тільки дріб) 1 біт 8 бітів 23 біти Знак Порядок Р+1023 Мантиса М – 1 (тільки дріб) 1 біт 11 бітів 52 біти 4

 1. 2. Способи кодування цілих чисел і правила їх використання для додавання У 1. 2. Способи кодування цілих чисел і правила їх використання для додавання У 8 -розрядному процесорі можуть оброблятися дані з розрядністю, кратною 8 (8, 16, 24 … біт). Однак, система команд орієнтована на числа з 8 біт, а для більших потрібно застосувати певний алгоритм. Правда, у системі Ал. Б такі дії уже передбачені. При додаванні 8 -розрядних чисел, може утворюватися 9 біт результату. Цей 9 -ий біт не може бути розміщений у регістрі - приймачі оскільки він 8 розрядний. Тому 9 -ий біт результату фіксується спеціальним тригером – “прапорецем переносу” – “ознакою переносу” - С. 1. 2. 1. Двійкові числа без знаку Найекономнішим способом кодування цілих чисел без знаку є звичайний двійковий код. Він дозволяє визначати суму чисел за законами двійкової арифметики, а також використовується в операціях порівняння, множення і ділення. Приклад: (5) = 00000101 + дв (7)дв = 00000111 (Cума)дв =(0) 00001100 5

Додавання багаторозрядних двійкових кодів без знаку Таке додавання виконується поетапно, починаючи з молодших байтів. Додавання багаторозрядних двійкових кодів без знаку Таке додавання виконується поетапно, починаючи з молодших байтів. При додаванні старших байтів враховується перенос від попереднього додавання молодших. Тому при виконанні такої операції потрібні дві різні команди: додавання просто байтів, а для старших – додавання байтів разом з бітом переносу С від попереднього додавання. Ст. байт числа № 1 + + Ст. байт числа № 2 + С Мол. байт числа № 1 С Мол. байт числа № 2 Мол. байт результату Ст. байт результату 6

1. 2. 2. Прямий код цілого числа зі знаком Для того, щоб позначити знак 1. 2. 2. Прямий код цілого числа зі знаком Для того, щоб позначити знак числа, прийнято виділяти один старший біт його коду, а діапазон чисел, відповідно, звужувати. Деякі датчики вимірювання, а також органи ручного керування утворюють т. зв. прямий код чисел. Прямим називається таке кодування цілих чисел зі знаком, при якому їх значення представляється звичайним двійковим кодом, при цьому знак “мінус“ – одиницею у старшому розряді, а плюс - нулем. Приклад: Прямий код (х)пр числа – 5 буде: (– 5)пр = 10000101. Недолік: цей код не можна застосувати для додавання чисел у звичайних суматорах – дасть невірний результат. Тому прямий код не може використовуватися у самих мікроконтролерах. 7

1. 2. 3. Обернений (інверсний) код цілого числа зі знаком Обернений код від’ємного числа 1. 2. 3. Обернений (інверсний) код цілого числа зі знаком Обернений код від’ємного числа утворюється інвертуванням всіх розрядів звичайного двійкового коду додатного числа. А код додатних чисел не змінюється. Приклад: Обернений код (х)об (+5)об = 0 0000101 (– 5)об = 1 1111010 Додавання цілих чисел зі знаком в обернених кодах можливо виконати у звичаних двійкових суматорах. Однак, якщо виникне перенос зі знакового розряду, то до результату необхідно додати "1“ – тобто прапорець (ознака) С повинен завжди додаватися до результату. 8

Якщо внаслідок додавання знаковий розряд результату виявиться “ 1”, то це вказує на від’ємне Якщо внаслідок додавання знаковий розряд результату виявиться “ 1”, то це вказує на від’ємне число. Щоб визначити модуль від’ємного числа, представленого в оберненому коді , його достатньо проінвертувати. Приклад: (– 5)об = 1 1111010 (– 7)об = 1 1111000 (Cума)дв= (1) 1 1110010 +1 (Сума)об = 1 1110011 Значення (модуль) = 0 0001100 ( -12) 9

Недоліком оберненого коду є те, що додавання чисел потребує двох етапів – затягує час Недоліком оберненого коду є те, що додавання чисел потребує двох етапів – затягує час розрахунків, особливо багаторозрядних чисел. Ст. байт числа № 1 Мол. байт числа № 1 + + Знакові розряди “S” Ст. байт числа № 2 Мол. байт числа № 2 + С С Ст. байт пром. рез. + Мол. байт пром. рез. + С С Мол. байт результату Ст. байт результату. 10

Для додавання від’ємних чисел найдоцільнішим є таке їх кодування, яке забезпечує отримання одразу кінцевого Для додавання від’ємних чисел найдоцільнішим є таке їх кодування, яке забезпечує отримання одразу кінцевого результату. Це можливо у тому випадку, коли додавання кодів виконується з обмеженою розрядністю – тобто без урахування переносу зі старшого розряду. Для розуміння способу утворення відповідного коду cпочатку визначимо код числа – 1, – тобто код, який при додаванні до довільного двійкового коду додатного числа зменшує його на "1", допускаючи перенос зі старшого розряду, який не враховується. Такий код у всіх розрядах містить одиниці {11. . . 1}. Приклад: (+ 35)дв = 00100011 + 1111 Вказано значення (1) 0010 = 34 переносу з старшого розряду (біт С). За аналогією, від’ємне число – 2 дає код {11. . . 10} і так далі. Подібний код від’ємних чисел отримав назву “доповнювальний”, що пов’язано з алгоритмом його утворення. 11

1. 2. 4. Доповнювальний код цілого числа зі знаком Доповнювальний код від’ємного числа утворюється 1. 2. 4. Доповнювальний код цілого числа зі знаком Доповнювальний код від’ємного числа утворюється шляхом інвертування всіх розрядів двійкового коду додатного числа і наступного додавання одиниці. Доповнювальний код додатного числа не змінюється. Приклад: (+5)дв = 0 0000101 (– 5)об = 1 1111010 + 1 (– 5)доп = 1 1111011 12

Додавання цілих чисел зі знаком у доповнювальних кодах виконується за звичайними правилами, а перенос Додавання цілих чисел зі знаком у доповнювальних кодах виконується за звичайними правилами, а перенос зі знакового розряду ігнорується. Приклад: (– 5)доп = 1 1111011 (– 7)доп = 1 1111001 (Cума) доп = (1) 1 1110100 Для визначення модуля від`ємного числа у доповнювальному коді необхідно від нього відняти одиницю та проінвертувати. 1 1110100 -1 1 1110011 – обернений код числа; 0 0001100 – модуль числа -12. 13

Приклад побайтного додавання багаторозрядних чисел у доповнювальних кодах Ст. байт числа № 1 + Приклад побайтного додавання багаторозрядних чисел у доповнювальних кодах Ст. байт числа № 1 + + Ст. байт числа № 2 Знакові розряди Мол. байт числа № 1 Мол. байт числа № 2 + С С Мол. байт результату Ст. байт результату. Перенос зі знакового розряду ігнорується. Висновок: за основу кодування цілих чисел зі знаком вибраний 14 доповнювальний код і всі процесори орієнтовані на його

2. Команди додавання і віднімання в AVR Позначення Суть команди ^rm Обнулення r 0. 2. Команди додавання і віднімання в AVR Позначення Суть команди ^rm Обнулення r 0. . . r 31 rm++ Збільшення r 0. . . r 31 r m + r n Додавання r 0. . . r 31 rm+ rn+ Те ж з переносом С rm+ число Додавання через віднімання r 16. . 31 – (256 -число) -rm Зміна знака r 0. . . r 31 rm-- Зменшення r 0. . . r 31 r m - r n Віднімання r 0. . . r 31 rm- rn- Віднімання з переносом С rm- число Стосується r 16. . . r 31 15

 Збільшення (інкремент) та зменшення (декремент) виконується у самому регістрі, а не в операційному Збільшення (інкремент) та зменшення (декремент) виконується у самому регістрі, а не в операційному блоці. Тому на стан прапорців це не впливає! Якщо далі виконується перехід за станом прапорців, то він буде невірний! Результат двомісної операції завжди отримується у першому операнді – який стоїть ліворуч. Додавання безпосередніх даних rm+число саме по собі виконується вірно, але прапорці спрацьовують, аналогічно як при відніманні. Це потрібно враховувати у наступному умовному переході або попередньо засилати число у будь-який робочий регістр, а потім скористатися командою rm+rn, яка виконується за схемою: + С rm rn rm + rm rn С rm С Команда додавання з переносом має три складових, а її 16 необхідність пояснюється при додаванні чисел з декількох байт:

3. Виявлення переповнення розрядної сітки Проблема: при додаванні великих чисел значущих розрядів може стати 3. Виявлення переповнення розрядної сітки Проблема: при додаванні великих чисел значущих розрядів може стати більше дозволеної кількості (наприклад – вісім). Внаслідок цього спотворюється знаковий розряд і модуль результату. Подібні випадки називають переповненням розрядної сітки. Приклад: (+64) доп = 0 1000000 (Сума)доп = (0) 1 0000000 – переповнення. 17

Один із засобів виявлення переповнення – застосування модифікованих доповнювальних кодів. Вони відрізняються від звичайних Один із засобів виявлення переповнення – застосування модифікованих доповнювальних кодів. Вони відрізняються від звичайних застосуванням не одного, а двох знакових розрядів. При переповненні розрядної сітки знакові розряди результату додавання за значенням стають різними. Приклад: (– 35)доп. мод = 11 011101 (– 47)доп. мод = 11 010001 (Cума)дв = (1) 10 101110 - переповнення При даній операції виявлено переповнення розрядної сітки – знакові розряди різні. Це означає, що модуль числа не вмістився у виділені для нього шість розрядів. Але, оскільки при додаванні 6 -розрядних чисел результат має не більше семи значущих бітів, то ще можна скористатися звичайним додатковим кодом, розглядаючи його як: (Сума)доп = 1. 10101110 або (Сума) пр = 1. 01010010 =18– 82.

Якщо переповнення відбулося при черговому додаванні, то ще можна визначити правильний результат, розглядаючи його Якщо переповнення відбулося при черговому додаванні, то ще можна визначити правильний результат, розглядаючи його з одним знаковим розрядом – тобто як відповідний звичайний код. Проте використовувати отримане число для подальших операцій у модифікованих кодах уже неможливо, а потрібно змінити розподіл пам'яті під числа – відвести на них більше комірок. Недолік модифікованих кодів полягає в істотному зменшенні діапазону чисел – у два рази. Тому вони практично не застосовуються. 19

З’ясуємо умови за яких може виникнути переповнення: 1. При додаванні чисел з різними знаками З’ясуємо умови за яких може виникнути переповнення: 1. При додаванні чисел з різними знаками переповнення виникнути не може. 2. Якщо додаються додатні числа, то переповнення виникає тільки тоді, якщо був перенос у знаковий розряд. Адже при додатних числах у знакових розрядах додавалися нулі, але внаслідок переносу сюди з попереднього розряду отримується “ 1”, і переносу не виникне. Приклад: (+64) доп = 0. 1000000 (Сума)доп = (0) 1. 0000000 – переповнення. 3. Якщо додаються від’ємні числа, але невеликі за модулем – такі, що переповнення не виникає, то перенос у знаковий розряд обов’язково є, оскільки попередні розряди чисел – одиниці. Однак спотворення знакового розряду не відбувається, адже при від’ємних числах у знакових розрядах додаються одиниці і тому звідси обов’язково буде перенос. Внаслідок знаковий біт результату залишається “ 1” – результат вірний. Коли ж додаються надто великі за модулем від’ємні числа, то переносу в знаковий розряд не відбувається через те, що в попередніх розрядах 20 нулі. Однак буде перенос зі знакового розряду внаслідок додавання тут двох одиниць. Тому в знаковому розряді з’являється нуль – він спотворюється.

У сучасних процесорах переповнення контролюється під час самого додавання. При цьому ознаками переповнення розрядної У сучасних процесорах переповнення контролюється під час самого додавання. При цьому ознаками переповнення розрядної сітки є: a) виникнення переносу у знаковий розряд при відсутності переносу з нього; б) відсутність переносу в знаковий розряд, але наявність переносу з нього. Приклад: (– 127)доп = 1 0000001 (Сума)доп = (1) 0 0000010 – переповнення Приклад: (+64) доп = 0 1000000 (Сума)доп = (0) 1 0000000 – переповнення. 21

Операційний блок процесора має вузол, який при додаванні кодів аналізує переноси у старший розряд Операційний блок процесора має вузол, який при додаванні кодів аналізує переноси у старший розряд та з нього і завжди утворює сигнал (0 чи 1) прапорця переповнення (позначається OF або OV чи V). У випадках переповнення старший розряд коду S спотворений і фактично є значущим для модуля числа. Однак можна визначити і реальний знаковий біт, якщо, при переповненні за знаковий використовувати інверсне значення старшого розряду результату. Саме ж значення числа – результату додавання буде розташовано у всіх розрядах (наприклад у восьми). У деяких ОМК, зокрема, ряду AVR, передбачено додатковий прапорець знаку N, що визначається за вказаною логікою N = S + OF. 22

4. Особливості використання двійководесяткових кодів цілих чисел без знаку Двійково-десяткові коди чисел необхідні при 4. Особливості використання двійководесяткових кодів цілих чисел без знаку Двійково-десяткові коди чисел необхідні при їх виводі на індикатори з дешифраторами. Вони представляють собою четвірки розрядів, що в свою чергу представляють окремі цифри десяткового числа. В пам’яті ОМК ці значення можуть розташовуватися в окремих комірках (неупакована форма) або по дві тетради на байтову комірку. Зазвичай, тетрада може приймати значення лише у межах 0. . . 9. Приклад: (+ 35)дв. дес = 0011 0101 З такими кодами теж можуть виконуватися операції додавання у звичайних суматорах, але при відповідній корекції результату. 23

Загалом при виконанні арифметичних та логічних операцій в AVR спрацьовують такі прапорці статусу результату, Загалом при виконанні арифметичних та логічних операцій в AVR спрацьовують такі прапорці статусу результату, які утворюють біти регістра SREG: Z – Ознака нуля C – Перенос основний H – Перенос міжтетрадний S – Старший (знаковий) розряд V – Переповнення N – Знак S + V Крім того є ще вільний біт – прапорець Т, що використовується довільно. Всі ці прапорці можуть служити для організації умовних переходів між командами програми. 24

5. 1. Способи перемноження чисел в AVR Як зазначалося, між цілими числами і дробовими 5. 1. Способи перемноження чисел в AVR Як зазначалося, між цілими числами і дробовими у формі “з фіксованою комою” немає різниці для застосування у командах арифметичних операцій. Це стосується і команд множення, що передбачаються лише у мікроконтролерів ряду MEGA -AVR. Команд перемноження цілих чисел є чотири: коли їх коди є беззнаковими числами (діапазон 0. . 255), та коли число має знаковий розряд (діапазон -128…+127). Тому відпадає необхідність попередньо визначати модуль чисел зі знаками. Операнди можуть знаходитися тільки у регістрах r 16…r 23, а результат буде розташований у регістрах r 0 та r 1: {00011000} * {00010000} = {01010001 10000000}. r 1 r 0 Перемноження у MEGA-AVR виконується табличним способом на основі спеціального ПЗП, коли коди двох чисел і код різновиду операції (це 8+8+3=19 біт) використовуються у якості адреси для зчитування 25 результату – 16 розрядів.

Апаратний помножувач в ОМК ряду ATMEGA Код числа з rm Код числа з rn Апаратний помножувач в ОМК ряду ATMEGA Код числа з rm Код числа з rn Addr ROM Dat Мол. байт результату (r 0) Старш. байт результату (r 1) Код операції 26

 Для розглянутого помножувача чисел на основі ПЗП не важливо, у якій формі вони Для розглянутого помножувача чисел на основі ПЗП не важливо, у якій формі вони поступають: цілі чи дробові, зі знаком чи без нього – це можна врахувати у коді операції, який теж використовується як складова адреси для результату. Позначення Суть команди rm * rn Множення без знака r 16. . . r 23 ±rm* ± rn Множення зі знаками r 16. . . r 23 ±rm* rn та rm* ± rn Множення зі знаком і без знака r 16. . . r 31 <<(rm * rn ) Множення дробових без знака r 16. . . r 23 <<(±rm * ± rn) Множення дробових зі знаками r 16. . . r 23 <<(±rm * rn) <<(rm * ±rn) Теж зі знаком і без знака r 16. . . r 23 27

Для дробових чисел у MEGA- AVR передбачені спеціальні команди перемноження, що пов’язано з застосуванням Для дробових чисел у MEGA- AVR передбачені спеціальні команди перемноження, що пов’язано з застосуванням певних форм запису цих чисел у відповідних командах. Так у команді перемноження дробових чисел без знаку використовується один розряд під цілу частину, а у команд, що стосуються чисел зі знаком, на цьому місці розташовується знаковий розряд. Наприклад, перемножуються дробові числа 1, 25 та 0, 5 {1. 0100000} * {0. 1000000} = {0. 1010000}. r 1 r 0 Зазвичай, точки насправді у записі немає. Таким чином, запис чисел для їх перемноження у формі цілих не тотожний їх запису для перемноження у формі дробових. Команду перемноження чисел без знаку можна використати і для перемноження багаторозрядних кодів, наприклад 16 -бітних. При цьому такі числа представляються з двох складових: 256*ст. байт + мол. байт. 28

Якщо у системі команд ОМК немає команд множення (TINYAVR), то добуток доведеться обраховувати програмно. Якщо у системі команд ОМК немає команд множення (TINYAVR), то добуток доведеться обраховувати програмно. Перший варіант (для цілих чисел) полягає у додаванні множеного (А) до визначуваного результату стільки разів, яке значення має множник (В). Однак це може виковуватися досить довго. Результат <- 0 Так В=0 ? Ні Результат + А В-1 29

Другий варіант. Прискорено добуток обраховується аналолгічно, як і при ручних розрахунках “у стовпчик” – Другий варіант. Прискорено добуток обраховується аналолгічно, як і при ручних розрахунках “у стовпчик” – шляхом поетапного додавання до визначуваного результату добутку множеного на черговий розряд множника (це 1 або 0) зі зсувом на відповідну кількість розрядів. Числа в цьому випадку можуть бути і дробові. Приклад: 00001011 х 00001101 00001011 (множене не зсунуто) + 00101100 (зсунуто на 2 розряди) + 01011000 (зсунуто на 3 розряди) 10001111 – результат. 30

Третій варіант. Найшвидше отримати результат добутку чисел можна табличним способом на основі відповідного комбінаційного Третій варіант. Найшвидше отримати результат добутку чисел можна табличним способом на основі відповідного комбінаційного вузла чи ПЗП. В останньому випадку коди обох операндів разом використовуються за адресу комірки ПЗП, що містить результат. При 8 -розрядних операндах такий ПЗП повинен мати значний обсяг пам’яті: 216 х 16 біт = 128 Кбайт. Тому доцільно використовувати спеціалізований комбінаційний вузол. Важливо, що при перемноженні операндів розрядність результату є сумою їх розрядностей, а тому для його утримання потрібні комірки загалом подвійної розрядності. 31

5. 2. Способи ділення операндів Нажаль, команд ділення у мікроконтролерах AVR не передбачено. Тому 5. 2. Способи ділення операндів Нажаль, команд ділення у мікроконтролерах AVR не передбачено. Тому доводиться орієнтуватися на програмну організацію цієї операції. Розглянемо цілочисельне ділення додатних цілих чисел, коли отримується ціла частка і залишок ділення. Найпростіший варіант ділення полягає у здійсненні перевірок умови: чи ділене не менше дільника та віднімання останнього від діленого з додаванням до результату (частки) одиниці. Однак така процедура може виковуватися досить довго. 0 -> результат Ділиме < дільника Так Ні Ділине - дільник Фікс. залишку Результат + 1 32

Прискорено ділення може полягати у поетапному відніманні дільника від діленого, починаючи з його старших Прискорено ділення може полягати у поетапному відніманні дільника від діленого, починаючи з його старших розрядів, подібно ручній операції. Попередньо перевіряється перевищення діленого над дільником. Далі виконується зсув дільника ліворуч до вирівнювання кількості значущих розрядів з діленим. Потім дії циклічно повторюються. Загалом при організації обчислень необхідно: 1) вибрати форму кодування відповідних чисел в пам'яті МПП; 2) вибрати алгоритм виконання обчислювальних операцій; 3) спираючись на існуючі команди процесора МПП, скласти програму виконання необхідних дій алгоритму. Стосовно арифметичних операцій AVR то необхідно враховувати пректуванні програмного забезпечення, що ОМК мають суттєві обмеження, особливо TINY-AVR. 33