Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра СКС
Звіт
з лабораторної роботи №5
з дисципліни: “ Основи організації та функціонування комп’ютерів ”
на тему: “ Дослідження виконання арифметичних операцій з числами у форматі з фіксованою комою у симуляторі DeComp ”
Львів
2016
Мета
1) Вивчити форми подання і застосування додатних та від’ємних чисел у арифметиці з фіксованою комою;
2) Навчитись розробляти алгоритми і здійснити їх реалізацію у інструкціях процесора навчального комп'ютера DeComp виконання арифметичних операцій додавання та віднімання над двійковими числами з фіксованою комою у модифікованих кодах;
3) Навчитись розробляти алгоритми і здійснити їх реалізацію у інструкціях процесора навчального комп'ютера DeComp виконання арифметичної операції множення двійкових чисел без знаку.
Теоретичні відомості
1.1. Додавання і віднімання двійкових чисел з фіксованою комою
Простота виконання арифметичних дій є важливою особливістю двійкової системи числення. Але у дійсності, при виконанні арифметичних операцій у конкретному комп’ютері потрібно додатково враховувати не тільки знаки чисел, що обробляються, але і діапазон та форму подання чисел.
Відомо, що одним з можливих шляхів виконання операції віднімання є заміна знаку числа, яке віднімається, на протилежний і додавання його до зменшуваного.
А - В = А + ( - В)
Таким чином операцію арифметичного віднімання замінюють операцією алгебраїчного додавання, яку можна виконати за допомогою двійкових суматорів. Нагадаємо, що від’ємні числа у комп’ютері подаються у прямому, доповняльному і оберненому кодах.
Числа, що зберігаються у прямому коді, перед виконанням обчислень перетворюються у потрібний – доповняльний або обернений - код і після виконання обчислень знову перетворюються у прямий код.
При реалізації заміни віднімання додаванням, другий доданок у наведенному виразі переводиться у доповняльний код шляхом інвертування та додавання одиниці у молодший розряд. (Треба пам’ятати, що доповняльний код додатного числа співпадає з прямим кодом).
A –B = A ++1
При додаванні двох двійкових чисел, за абсолютною величиною менших одиниці, код суми може за абсолютною величиною перевищити одиницю або стати рівним їй. У такому випадку відбудеться переповнення розрядної сітки, що призведе до неправильного результату. У таких випадках результату не існує. Переповнення може відбутися у тих випадках, коли доданки мають однакові знаки. Ознакою переповнення розрядної сітки слугує протилежність знаку суми, що отримана, знакам доданків. Звідси витікає, що для отримання коректного результату при додаванні двійкових чисел з фіксованою комою обов’язковою є умова, щоб кожний з доданків і їх сума за абсолютною величиною були менше одиниці.
1.2. Додавання двійкових чисел у модифікованому доповняльному коді
Доповняльні коди чисел додаються порозрядно. Причому знакові розряди додаються як звичайні розряди цілих чисел. Одиниця переносу, яка виникає при додаванні знакових розрядів, не враховується, тобто відкидається. Суму отримуємо у доповняльному коді. Для отримання остаточного результату цю суму необхідно обов’язково перевести у прямий код, тобто зробити друге доповнення.
Приклад 1. Додати у модифікованому доповняльному коді двійкові числа А і В при наступних умовах:
А > 0; B > 0; A + B > 0.
A = + 0,1101; B = + 0,0001 +
00,1110; 00,1110;
2. А < 0; B < 0; A + B < 0.
A = - 0,1101; B = - 0,0001; +
111,0010; 11,1110;
Одиниця переносу із старшого знакового (
розряду не враховується
При переведенні у прямий код отриманих від’ємних результатів переводиться саме число і не переводиться знак (див. приклад 2), або число із спотвореним знаком береться за абсолютною величиною.
1.3. Додавання двійкових чисел у модифікованому оберненому коді
Реалізується так само, як і в доповняльному коді. Обернені коди чисел додаються порозрядно, знакові розряди додаються як розряди цілих чисел. Суму отримуємо у оберненому коді.
Відмінність полягає у тому, що одиницю переносу із старшого знакового розряду, якщо вона з’являється, потрібно додати до молодшого розряду суми, тобто виникає циклічний перенос.
Приклад 2. Додати у модифікованому оберненому коді числа А і В при умові:
1) А > 0; B < 0; A + B > 0.
A = + 0,1101; B = - 0,0001; +
100,1011
Циклічний перенос +1
; 00,1100;
2) А < 0; B < 0; A + B < 0.
A = - 0,1101; B = - 0,0001; +
111,0000;
Циклічний перенос +1
11,1110;
1.4. Переповнення розрядної сітки при додаванні у модифікованих машинних кодах
Переповнення розрядної сітки при додаванні модифікованих кодів, так само як і при додаванні у звичайних кодах із фіксованою комою, може бути лише у випадках, коли доданки мають однакові знаки. Таке переповнення виявляється способом порівняння знакових розрядів отриманої суми, наприклад, застосовуючи операцію додавання за модулем 2 (XOR). Ознакою переповнення є неспівпадання цифр, які створюються у двох знакових розрядах суми, тобто код знаку числа має вигляд 01 або 10. Відповідно, результат неможливо віднести до додатних, ні до від’ємних модифікованих кодів. Пояснимо це на наступних прикладах.
Приклад 3:
1. А = + 0,1101; 2. А = - 0,1101;
В = + 0,0111; В = - 0,0111;
А + В > 0;А + В < 0;
+ +
Відкидається (
Як видно з прикладів, у знакових розрядах отриманої суми додатних доданків маємо комбінацію „01”, а від’ємних – „10”, що свідчить про переповнення розрядної сітки.
1.5. Множення двійкових чисел без знаку
Множення двійкових чисел виконують за правилами, аналогічними для десяткових чисел, тобто визначають проміжні добутки, а потім їх додають. Але, важливо зазначити, що у цьому процесі значно полегшується процес визначення проміжних добутків. Насправді виконуються тільки два правила множення двійкового числа на двійкову цифру:
1). Якщо ця двійкова цифра (розряд множника) дорівнює 1, то двійкове множене просто копіюється без змін у якості проміжного добутку;
2). Якщо цей розряд множника дорівнює 0, то проміжний добуток дорівнює 0.
Ці правила ілюструє приклад 4. Дії виконуються наступним шляхом: у першому розряді множника стоїть 1, тому у якості першого проміжного добутку копіюється значення множеного. У наступному зліва розряді множника стоїть 0, і, відповідно, другий проміжний добуток дорівнює 0000. Далі, дії повторюються.
При визначенні кожного наступного проміжного добутку він зсувається вліво на один розряд відносно попереднього. Всі отримані проміжні добутки, враховуючи зсуви, додаються між собою. Таблиця ХХ – таблиця множення одного розряду двійкових чисел.
Табл. ХХ Приклад 4.
0 * 0
0
1 * 0
0
0 * 1
0
1 * 1
1
1 0 0 1 - множене
* 1 1 0 1 - множник
1 0 0 1
+ 0 0 0 0 проміжні
1 0 0 1 добутки
1 0 0 1 .
1 1 1 0 1 0 1 = добуток
Отже, операція множення двійкових чисел зводиться до операцій зсуву та додавання. Крім того зауважимо, що множення двох n – розрядних чисел дає результат, який містить 2n бітів.
Відомі два наступні основні способи виконання операції множення:
а) Множення, починаючи з молодших розрядів множника, із зсувом вліво, процес починається з молодшого розряду множника;
б) Множення, починаючи із старших розрядів множника, із зсувом вправо, процес починаючи із старших розрядів множника:
1101 - множене 1101 - множене
* 1101 - множник * 1101 - множник
1101 1101
+ 0000 + 1101
1101 0000
1101 1101
10101001 - добуток 10101001 - добуток
а) б)
Схема множення із зсувом СДП вправо подана на наступному малюнку.
На цьому малюнку позначено:
A(a3, a2, a1, a0) i B(b3, b2, b1, b0) – двійкові 4-рирозряднічисла – сомножники;
Р – добуток;
ДПі – проміжні добутки.
Зауважимо, що операція множення числа на 10 ± n - основу системи числення в степені ± n, рівноцінна зсуву даного числа вправо на nрозрядів, якщостепінь додатна, і вліво, якщо степінь від’ємна.
Хоча процес аналізу розрядів множника і додавання множенного із самим собою стільки разів, *
Хід виконання роботи
Завдання 1. Вивчити теоретичні відомості методичних вказівок.
Завдання 2. Розробити алгоритм і написати програму додавання довільних 16-розрядних двійкових чисел із знаком, поданих у форматі з фіксованою комою у модифікованому доповняльному коді у інструкціях навчального комп’ютера DeComp.
Порядок виконання
Формулювання задачі:
Розробити алгоритм і написати програму додавання довільних 16-розрядних двійкових чисел із знаком, поданих у форматі з фіксованою комою у модифікованому доповняльному коді у інструкціях навчального комп’ютера DeComp.
Блок-схема алгоритму:
Інформація про вхідні дані і їх попереднє розташування у комірках пам’яті:
Вхідними даними будуть числа A і B, які розташовуватимуться у 27-ій і 28-ій комірках памяті відповідно. Змінна А дорівнює десятковому числу 10, яке у модифікованому доповняльному коді дорівнює 0000 0000 0000 10102 Змінна B дорівнює десятковому числу 9 яке у модифікованому доповняльному коді дорівнює 1100 0000 0000 10012.
Призначення комірок що використовуються:
Для роботи програми використовується 29-а, 30-а, 31-а, 32-а комірка памяті. У 29-ій комірці записано двійковий код десяткового числа 1. Цією одиницею програма зменшує лічильник циклу, а також збільшує число кількості одиниць у вхідному числі. У 30-ій комірці записано 1100 0000 0000 00002. Це маска, що призначена для визначення знаку числа. У 31-ій комірці записано двійковий код десяткового числа 0. Це змінна для збереження результату додавання. У 32-ій комірці записано 1111 1111 1111 11112. Це ознака неправильного результату.
Текст програми:
Адреса комірки пам’яті
Код інструкції
(двійковий)
Мнемонічний формат
інструкції
Коментар інструкцій, що відповідають блокам алгоритму програми
0
0000 0000 0001 1011
LOAD 27;
Додаємо вміст 3110 комірки в якій записано 010 ,для того щоб побачити чи від’ємне це число.
1
0010 0000 0001 1111
ADD 31;
2
1010 0000 0000 0111
JP 7;
Перевірка знаку першого доданка “А”, якщо S=0,то операція доповнення пропускається.
3
0110 0000 0001 1110
XOR 30;
Переведення першого доданка “А” з прямого модифікованого коду в доповняльний модифікований.
4
0111 0000 0000 0000
NOT;
5
0010 0000 0001 1101
ADD 29;
6
0001 0000 0001 1011
STORE 27;
7
0000 0000 0001 1100
LOAD 28;
Додаємо вміст 3110 комірки в якій записано 010 ,для того щоб побачити чи від’ємне це число.
8
0010 0000 0001 1111
ADD 31;
9
1010 0000 0000 1110
JP 14;
Перевірка знаку другого доданка “В”, якщо S=0,то операція доповнення пропускається.
10
0110 0000 0001 1110
XOR 30;
Переведення другого доданка “В” з прямого модифікованого коду в доповняльний модифікований.
11
0111 0000 0000 0000
NOT;
12
0010 0000 0001 1101
ADD 29;
13
0001 0000 0001 1100
STORE 28;
14
0000 0000 0001 1011
LOAD 27;
Додати до вмісту 2710 комірки нього вміст 2810.
15
0010 0000 0001 1100
ADD 28;
16
0001 0000 0001 1100
STORE 28;
17
1100 0000 0001 0100
JNC 20;
Перевірка результату на переповнення розрядної сітки.
18
0000 0000 0010 0000
LOAD 32;
Перехід на кінець виконання програми. Результат не коректний.
19
0000 0000 0001 1111
STORE 31;
20
0000 0000 0001 1010
JMP 26;
21
0101 0000 0001 1010
JP 26;
Перевірка чи результат додавання невід’ємне число тобто S=0. Якщо так то перетворення суми у прямий код пропускається.
22
0111 0000 0000 0000
NOT;
Перетворення результату суми у прямий код.
23
0010 0000 0001 1101
ADD 29;
24
0110 0000 0001 1110
XOR 30;
25
0001 1100 0001 1111
STORE 31;
26
0111 1100 0000 0000
HALT;
Зупинка процесора.
Завдання 3. Виконати дослідження програми, розробленої у пункті 2, у покроковому режимі.
Результат дослідження
№
РА
РД
А
РІ
ЛАІ
РО
1
0000 0001 0111
0000 0000 0000 1010
0000 0000 0000 1010
0000 0000 0001 0111
0000 0000 0001
000
2
0000 0001 1011
0000 0000 0000 0000
0000 0000 0000 1010
0010 0000 0001 1011
0000 0000 0010
000
3
0000 0000 0010
1010 0000 0000 0111
0000 0000 0000 1010
1010 0000 0000 0111
0000 0000 0111
000
4
0000 0001 1000
1100 0000 0000 1001
1100 0000 0000 1001
0000 0000 0001 1000
0000 0000 0001
000
5
0000 0001 1011
0000 0000 0000 0000
11000 0000 0000 1001
00010 0000 0001 1011
0000 0000 1001
010
6
0000 0000 1001
1010 0000 0000 1110
1100 0000 0000 1001
1010 0000 0000 1110
0000 0000 1010
010
7
0000 0001 1010
1100 0000 0000 0000
0000 0000 0000 1001
0110 0000 0001 1010
0000 0000 1011
000
8
0000 0000 1011
0111 0000 0000 0000
1111 1111 1111 0110
0111 0000 0000 000
0000 0000 1100
010
9
0000 0001 1001
0000 0000 0000 0001
1111 1111 1111 0111
0010 0000 0001 1001
0000 0000 1101
010
10
0000 0001 1000
1111 1111 1111 0111
1111 1111 1111 0111
0001 0000 0001 1000
0000 0000 1110
010
11
0000 0001 0111
0000 0000 0000 1010
0000 0000 0000 1010
0000 0000 0001 0111
0000 0000 1111
010
12
0000 0001 1000
1111 1111 1111 0111
0000 0000 0000 0001
0010 0000 0001 1000
0000 0001 0000
001
13
0000 0001 1100
0000 0000 0000 0001
0000 0000 0000 0001
0001 0000 0001 1100
0000 0001 0001
001
14
0000 0001 0110
0111 1100 0000 0000
0111 1100 0000 0001
0101 0000 0001 0110
0000 0001 0010
001
15
0000 0001 0010
0111 0000 0000 0000
1000 0011 1111 1110
0111 0000 0000 0000
0000 0001 0011
010
Після виконання програми в 28 комірці значення змінилось на 1111 1111 1111 01112,тобто число В у доповняльному модифікованому коді, в комірці 31 встановилось значення
0000 0000 0000 00012, тобто двійковий результат додавання десяткових чисел 10 і -9.
Завдання 4.
Розробити алгоритм і написати програму множення довільних двійкових чисел без знаку.
Порядок виконання
Формулювання задачі:
Розробити алгоритм і написати програму множення довільних двійкових чисел без знаку.
Блок-схема алгоритму:
Інформація про вхідні дані і їх попереднє розташування у комірках пам’яті:
Вхідними даними будуть числа A і B, які розташовуватимуться у 20-ій і 21-ій комірках памяті відповідно. Змінна А є множене і дорівнює десятковому числу 122, яке у двійковому поданні дорівнює 0000 0000 0111 10102. Змінна B є множником і дорівнює десятковому числу 43 яке у двійковому поданні дорівнює 0000 0000 0010 10112.
Призначення комірок що використовуються:
Для роботи програми використовується 22-а, 23-а, 24-а комірка памяті. У 24-ій комірці записано двійковий код десяткового числа 1. Цією одиницею програма зменшує лічильник циклу, а також збільшує число кількості одиниць у вхідному числі. У 23-ій комірці записано 0000 0000 0001 00002. Це лічильник циклів. У 22-ій комірці записано двійковий код десяткового числа 0. Це змінна для збереження результату множення.
Текст програми:
Адреса
Код інструкції
(двійковий)
Мнемонічний
код
Коментар
0
0000 0000 0001 0100
LOAD A
Зсув множеного вправо і збереження.
1
1111 1010 0000 0000
ROR
2
0001 0000 0001 0100
STORE A
3
0000 0000 0001 0101
LOAD B
Зсув множника вліво через ознаку С і збереження.
4
1111 1100 0000 0000
RCL
5
0001 0000 0001 0101
STORE B
6
1100 0000 0000 1010
JNC 10
Якщо С=0, додавання множеного до результату пропускається.
7
0000 0000 0001 0110
LOAD S
Додавання проміжного доданку до результату.
8
0010 0000 0001 0100
ADD A
9
0001 0000 0001 0110
STORE S
10
0000 0000 0001 0111
LOAD K
Зменшення лічильника циклів на 1.
11
0011 0000 0001 1000
SUB 1
12
0001 0000 0001 0111
STORE K
13
1000 0000 0000 0000
JNZ 0
Якщо K не 0, то виконується цикл з 0 комірки.
14
0111 1100 0000 0000
HALT
Зупинка програми
Завдання 5.
Виконати дослідження програми, розробленої у пункті 4, у покроковому режимі.
Порядок виконання
Програма на протязі своєї роботи повертається в початок , таким чином у неї умовні блоки будуть майже аналогічні, відмінність буде лише тоді, коли при зсуві множника 1 потрапляє в ознаку С, тоді крім операцій зсуву множника і множеного буде присутня операція додавання проміжного доданку.
Результат дослідження
Коли 1 не потрапляє в ознаку С (проміжний доданок 0), фрагмент виконання буде таким:
№
РА
РД
А
РІ
ЛАІ
РО
1
0000 0001 0100
0000 0000 0111 1010
0000 0000 0111 1010
0000 0000 0001 0100
0000 0000 0001
000
2
0000 0000 0001
1111 1010 0000 0000
0000 0000 0011 1101
1111 1010 0000 0000
0000 0000 0010
000
3
0000 0001 0100
0000 0000 0011 1101
0000 0000 0011 1101
0001 0000 0001 0100
0000 0000 0011
000
4
0000 0001 0101
0000 0000 0010 1011
0000 0000 0010 1011
0000 0000 0001 0101
0000 0000 0100
000
5
0000 0000 0100
1111 1100 0000 0000
0000 0000 0101 0110
1111 1100 0000 0000
0000 0000 0101
000
6
0000 0001 0101
0000 0000 0101 0110
0000 0000 0101 0110
0001 0000 0001 0101
0000 0000 0110
000
7
0000 0000 0110
1100 0000 0000 1010
0000 0000 0101 0110
1100 0000 0000 1010
0000 0000 1010
000
8
0000 0001 0111
0000 0000 0001 0000
0000 0000 0001 0000
0000 0000 0001 0111
0000 0000 1011
000
9
0000 0001 1000
0000 0000 0000 0001
0000 0000 0000 1111
0011 0000 0001 1000
0000 0000 1100
000
10
0000 0001 0111
0000 0000 0000 1111
0000 0000 0000 1111
0001 0000 0001 0111
0000 0000 1101
000
11
0000 0000 1101
1000 0000 0000 0000
0000 0000 0000 1111
1000 0000 0000 0000
0000 0000 0000
000
Коли 1 потрапляє в ознаку С (проміжний доданок 0), фрагмент виконання буде таким:
№
РА
РД
А
РІ
ЛАІ
РО
1
0000 0001 0100
0001 1110 1000 0000
0001 1110 1000 0000
0000 0000 0001 0100
0000 0000 0001
000
2
0000 0000 0001
1111 1010 0000 0000
0000 1111 0100 0000
1111 1010 0000 0000
0000 0000 0010
000
3
0000 0001 0100
0000 0000 0011 1101
0000 1111 0100 0000
0001 0000 0001 0100
0000 0000 0011
000
4
0000 0001 0101
1010 1100 0000 0000
1010 1100 0000 0000
0000 0000 0001 0101
0000 0000 0100
000
5
0000 0000 0100
1111 1100 0000 0000
0101 1000 0000 0000
1111 1100 0000 0000
0000 0000 0101
000
6
0000 0001 0101
0101 1000 0000 0000
0101 1000 0000 0000
0001 0000 0001 0101
0000 0000 0110
000
7
0000 0000 0110
1100 0000 0000 1010
0000 0000 0101 0110
1100 0000 0000 1010
0000 0000 0111
000
8
0000 0000 0111
0000 0000 0001 0110
0000 0000 0000 0000
0000 0000 0001 0110
0000 0000 1000
000
9
0000 0001 0100
0000 1111 0100 0000
0000 1111 0100 0000
0010 0000 0001 0100
0000 0000 1001
000
10
0000 0001 0110
0000 1111 0100 0000
0000 1111 0100 0000
0001 0000 0001 0110
0000 0000 1010
000
11
0000 0001 0111
0000 0000 0001 0000
0000 0000 0001 0000
0000 0000 0001 0111
0000 0000 1011
000
12
0000 0001 1000
0000 0000 0000 0001
0000 0000 0000 1111
0011 0000 0001 1000
0000 0000 1100
000
13
0000 0001 0111
0000 0000 0000 1111
0000 0000 0000 1111
0001 0000 0001 0111
0000 0000 1101
000
14
0000 0000 1101
1000 0000 0000 0000
0000 0000 0000 1111
1000 0000 0000 0000
0000 0000 0000
000
Після виконання програми у 21 комірці було значення 0, оскільки при зсуві 1, що входила в ознаку С, не поверталась в молодший розряд, у комірці встановилось значення 0001 0100 0111 110, яке є результатом множення числа А на число B, у 23 комірці стало значення 0, оскільки після кожного циклу від числа віднімалась 1, аж поки воно не обнулилося.
Висновок
На даній лабораторній роботі я вивчив форми подання і застосування додатних та від’ємних чисел у арифметиці з фіксованою комою, навчився розробляти алгоритми і здійснити їх реалізацію у інструкціях процесора навчального комп'ютера DeComp. Також виконав арифметичні операції додавання та віднімання над двійковими числами з фіксованою комою у модифікованих кодах і навчився розробляти алгоритми та здійснив їх реалізацію у інструкціях процесора навчального комп'ютера DeComp. А ще виконав дослідження арифметичної операції множення двійкових чисел без знаку.