Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра CКС
Звіт
з лабораторної роботи № 5
з дисципліни: “Організація та функціонування комп’ютерів”
на тему:
“ Дослідження виконання арифметичних операцій з числами у форматі з фіксованою комою у симуляторі DeComp.”
Лабораторна робота № 5
Тема: Дослідження виконання арифметичних операцій з числами у форматі з фіксованою
комою у симуляторі DeComp.
Мета роботи:
Вивчити форми подання і застосування додатних та від’ємних чисел у арифметиці з фіксованою комою;
Навчитись розробляти алгоритми і здійснити їх реалізацію у інструкціях процесора навчального комп'ютера DeComp виконання арифметичних операцій додавання та віднімання над двійковими числами з фіксованою комою у модифікованих кодах;
Навчитись розробляти алгоритми і здійснити їх реалізацію у інструкціях процесора навчального комп'ютера DeComp виконання арифметичної операції множення двійкових чисел без знаку.
1. Теоретична частина.
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. Множення, починаючи із старших розрядів множника, при зсуві СДП вліво і при множеному, що є нерухоме;
3. Множення, починаючи з молодших розрядів множника, із зсувом множеного вліво і СДП, що є нерухоме;
4. Множення, починаючи із старших розрядів множника, при зсуві множеного вправо і при СДП, що є нерухоме.
Варіанти із зсувом множеного (вар. 3, 4) на практиці використовуються менше, тому що для їх реалізації регістри множеного, СДП і суматор повинні мати розрядність 2n .
Виконання алгоритму множення без знаку із зсувом вправо для двох чисел: А = 1010 і В = 1110 показане на наступному прикладі:
Коментар
A
B
1010
* 1011
Множене
Множник
СДП
0000
початкове значення сумарного проміжного добутку
ДП0 = Ab0
P 0 = СДП + ДП0
P 0 2-1
+ 1010
01010
01010
Множення множенного на 20 розряд множника (= 1);
Перший проміжний добуток
Зсув вправо першого добутку /
ДП1 = Ab1
P 1 = P 0 2-1+ ДП1
P 1 2-1
+ 1010
011110
011110
Множення множенного на 21 розряд множника (= 1);
Другий проміжний добуток
Зсув вправо другого добутку /
ДП2 = Ab2
P 2 = P 1 2-1 + ДП2
P 2 2-1
+ 0000
0011110
0011110
Множення множенного на 22 розряд множника (= 0);
Третій проміжний добуток
Зсув вправо третього добутку /
ДП3 = Ab3
P 3 = P 2 2-1 + ДП3
P 3 2-1
+ 1010
01101110
01101110
Множення множенного на 23 розряд множника (= 1);
Четвертий проміжний добуток
Зсув вправо четвертого добутку, /
отриманий кінцевий результат.
Даний алгоритм множення без знаку із зсувом вправо можна описати таким чином:
1. Первинне значення СДП приймається таким, що дорівнює 0;
2. Аналізується наступна цифра множника (аналіз починається з молодшого розряду). Якщо він дорівнює 1, то до СДП додається множене, інакше додавання не виконується;
3. Виконується зсув СДП вправо на один розряд;
4. Пункти 2 і 3 повторюються для усіх цифрових розрядів множника.
Аналогічним шляхом реалізуються і інші варіанти алгоритмів множення двійкових чисел без знаку.
2. Порядок роботи:
Вивчити теоретичні відомості методичних вказівок.
Розробити алгоритм і написати програму додавання довільних 16-розрядних двійкових чисел із знаком, поданих у форматі з фіксованою комою у модифікованому доповняльному коді у інструкціях навчального комп’ютера DeComp.
Алгоритм програми додавання довільних 16-розрядних двійкових чисел із знаком, поданих у форматі з фіксованою комою у модифікованому доповняльному коді подано на наступній сторінці.
Примітка: якщо після додавання двох числе виникне переповнення розрядної сітки, то програма запише наш кінцевий результат 16-тьма одиничками.
Комірка пам’яті
Значення
200
Число А
201
Число В
202
Число А1
203
Число B1
204
Тимчасова змінна S
205
Число 1
206
змінна Minus (1100 0000 0000 0000)
207
Результат R
208
змінна R1
209
Повідомлення переповнення розрядної сітки (1111 1111 1111 1111)
210
змінна R2
211
змінна (1100 0000 0000 0000)
№ комірки пам’яті
Двійковий код інструкції
Мнемонічний запис
інструкції
Коментар
0.
0000 0000 1100 1000
LOAD 200
Визначаємо знак числа А.
Якщо А – від’ємне, то переводимо його у доповняльний код. Додавання буде проводитися з перетворенням результату у прямий код. Якщо А – додатне, то доповняльний код числа А і результату додавання будуть співпадати.
1111 0010 0000 0000
LSR
0001 0000 1100 1001
STORE 202
0000 0000 1100 1000
LOAD 200
0100 0000 1100 1001
AND 202
0001 0000 1100 1100
STORE 204
1111 0000 0000 0000
LSL
1111 0000 0000 0000
LSL
1100 0000 0100 0101
JNC 69
0000 0000 1100 1000
LOAD 200
1111 0000 0000 0000
LSL
1111 0000 0000 0000
LSL
0111 0000 0000 0000
NOT
1111 0010 0000 0000
LSR
1111 0010 0000 0000
LSR
0001 0000 1100 1000
STORE 200
0010 0000 1100 1101
ADD 205
0010 0000 1100 1110
ADD 206
0001 0000 1100 1000
STORE 200
0000 0000 1100 1001
LOAD 201
Визначаємо знак числа В при умові, коли А < 0
Якщо В – від’ємне, то переводимо його у доповняльний код. Додавання буде проводитися з перетворенням результату у прямий код.
Якщо В – додатне,то його прямий код співпаде з доповняльним.
1111 0010 0000 0000
LSR
0001 0000 1100 1011
STORE 203
0000 0000 1100 1001
LOAD 201
0100 0000 1100 1011
AND 203
0001 0000 1100 1100
STORE 204
1111 0000 0000 0000
LSL
1111 0000 0000 0000
LSL
1100 0000 0010 0110
JNC 38
0000 0000 1100 1001
LOAD 201
1111 0000 0000 0000
LSL
1111 0000 0000 0000
LSL
0111 0000 0000 0000
NOT
1111 0010 0000 0000
LSR
1111 0010 0000 0000
LSR
0001 0000 1100 1001
STORE 201
0010 0000 1100 1101
ADD 205
0010 0000 1100 1110
ADD 206
0001 0000 1100 1001
STORE 201
0000 0000 1100 1000
LOAD 200
Додавання чисел А і В
0100 0000 1100 1001
ADD 201
0001 0000 1100 1111
STORE 207
1111 0010 0000 0000
LSR
Перевірка на переповнення розрядної сітки. Якщо переповнення відбулось,у комірку з результатом буде записане спеціальне повідомлення
0001 0000 1101 0000
STORE 208
0000 0000 1100 1111
LOAD 207
0110 0000 1101 0000
XOR 208
1111 0000 0000 0000
LSL
1111 0000 0000 0000
LSL
1101 0000 0011 0011
JC 51
0000 0000 1101 0001
LOAD 209
0001 0000 1100 1111
STORE 207
0111 1100 0000 0000
HALT
0000 0000 1100 1111
LOAD 207
Переведення результату з доповняльного у прямий код. Віднімаємо 1 від молодшого розряду і інвертуємо число.
Окремо обробляємо знак
0001 0000 1101 0010
STORE 210
0011 0000 1100 1101
SUB 205
1111 0000 0000 0000
LSL
1111 0000 0000 0000
LSL
0111 0000 0000 0000
NOT
1111 0010 0000 0000
LSR
1111 0010 0000 0000
LSR
0001 0000 1100 1111
STORE 207
0000 0000 1101 0000
LOAD 208
0100 0000 1101 0010
AND 210
1111 0000 0000 0000
LSL
1111 0000 0000 0000
LSL
1101 0000 0100 0100
JC 68
0000 0000 1100 1111
LOAD 207
0101 0000 1100 1110
OR 206
0001 0000 1100 1111
STORE 207
0111 1100 0000 0000
HALT
0000 0000 1100 1001
LOAD 201
Визначаємо знак числа В при умові, коли А > 0
Якщо В – від’ємне, то переводимо його у доповняльний код. Додавання буде проводитися без перетворення результату у прямий код.
1111 0010 0000 0000
LSR
0001 0000 1100 1011
STORE 203
0000 0000 1100 1001
LOAD 201
0100 0000 1100 1011
AND 203
1111 0000 0000 0000
LSL
1111 0000 0000 0000
LSL
0000 0000 1100 1100
STORE 204
1100 0000 0100 1111
JNC 79
1110 0000 0001 1100
JMP 28
0000 0000 1100 1000
LOAD 200
Додавання чисел А і В
0010 0000 1100 1001
ADD 201
0001 0000 1100 1111
STORE 207
1111 0010 0000 0000
LSR
Обробка результату. Перевірка на переповнення розрядної сітки. Кінцевий запис результату.
0001 0000 1101 0000
STORE 208
0000 0000 1100 1111
LOAD 207
0110 0000 1101 0000
XOR 208
1111 0000 0000 0000
LSL
1111 0000 0000 0000
LSL
1100 0000 0101 1011
JNC 91
0000 0000 1101 0010
LOAD 209
0001 0000 1100 1111
STORE 207
0111 1100 0000 0000
HALT
Виконати дослідження програми, розробленої у пункті 2, у покроковому режимі.
Дослідження програми у покроковому режимі для додавання чисел 1 і -5 подано у таблиці нижче. Розробити алгоритм і написати програму множення довільних двійкових чисел без знаку. Варіант виконання вибрати з таблиці:
Комірка пам’яті
Значення
50
Множене А
51
Множник В
52
Результат
53
Лічильник циклу. Число 15
54
Число 1
№ комірки пам’яті
Двійковий код інструкції
Мнемонічний запис
інструкції
Коментар
0
0000 0000 0011 0011
LOAD 51
Визначаємо, на яке число ми будем множити 1 чи 0
1
1111 0010 0000 0000
LSR
2
0001 0000 0011 0011
STORE 51
3
1100 0000 0001 0011
JNC 7
4
0000 0000 0011 0010
LOAD 50
Запис 1 проміжного добутку при множенні на 1
5
0010 0000 0011 0100
ADD 52
6
0001 0000 0011 0100
STORE 52
7
0000 0000 0011 0011
LOAD 51
Визначаємо, на яке число ми будемо множити 1 чи 0
8
1111 0010 0000 0000
LSR
9
0001 0000 0011 0011
STORE 51
10
1100 0000 0001 1101
JNC 17
11
0000 0000 0011 0010
LOAD 50
Зсуваємо множене на 1 розряд вліво для знаходження проміжного добутку
12
1111 0000 0000 0000
LSL
13
0001 0000 0011 0010
STORE 50
14
0010 0000 0011 0100
ADD 52
Додаємо проміжні добутки і переходимо до наступної інструкції
15
0001 0000 0011 0100
STORE 52
16
1110 0000 0010 0000
JMP 32
17
0000 0000 0011 0010
LOAD 50
У випадку множення на 0 ПД=0.Тому просто зсуваємо множене на 1 розряд
18
1111 0000 0000 0000
LSL
19
0001 0000 0011 0010
STORE 50
20
0000 0000 0011 0101
LOAD 53
Зменшуємо лічильник циклу на 1
21
0011 0000 0011 0110
SUB 54
22
0001 0000 0011 0101
STORE 53
23
1000 0000 00001 0011
JNZ 19
Перевірка умови циклу
24
0111 1100 0000 0000
HALT
Завершуємо виконання програми
Виконати дослідження програми, розробленої у пункті 4, у покроковому режимі.
Оформити і захистити звіт.
Висновок: на лабораторній роботі я вивчив форми подання і застосування додатних та від’ємних чисел у арифметиці з фіксованою комою; навчився розробляти алгоритми і здійснити їх реалізацію у інструкціях процесора навчального комп'ютера DeComp; виконав арифметичні операції додавання та віднімання над двійковими числами з фіксованою комою у модифікованих кодах; навчився розробляти алгоритми і здійснив їх реалізацію у інструкціях процесора навчального комп'ютера DeComp; виконав дослідження арифметичної операції множення двійкових чисел без знаку.