МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра СКС
Звіт
з лабораторної роботи № 5
з дисципліни: «Організація та функціонування комп’ютерів»
на тему: «Дослідження виконання арифметичних операцій з числами у форматі з фіксованою комою у симуляторі DeComp.»
Варіант - 23
Мета роботи:
Вивчити форми подання і застосування додатних та від’ємних чисел у арифметиці з фіксованою комою;
Навчитись розробляти алгоритми і здійснити їх реалізацію у інструкціях процесора навчального комп'ютера DeComp виконання арифметичних операцій додавання та віднімання над двійковими числами з фіксованою комою у модифікованих кодах;
Навчитись розробляти алгоритми і здійснити їх реалізацію у інструкціях процесора навчального комп'ютера DeComp виконання арифметичної операції множення двійкових чисел без знаку.
Хід виконання роботи:
Теоретичні відомості.
1.1. Додавання двійкових чисел у модифікованому доповняльному коді
Доповняльні коди чисел додаються порозрядно. Причому знакові розряди додаються як звичайні розряди цілих чисел. Одиниця переносу, яка виникає при додаванні знакових розрядів, не враховується, тобто відкидається. Суму отримуємо у доповняльному коді. Для отримання остаточного результату цю суму необхідно обов’язково перевести у прямий код, тобто зробити друге доповнення.
Приклад 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;
Одиниця переносу із старшого знакового (
розряду не враховується
При переведенні у прямий код отриманих від’ємних результатів переводиться саме число і не переводиться знак або число із спотвореним знаком береться за абсолютною величиною.
1.2. Переповнення розрядної сітки при додаванні у модифікованих машинних кодах
Переповнення розрядної сітки при додаванні модифікованих кодів, так само як і при додаванні у звичайних кодах із фіксованою комою, може бути лише у випадках, коли доданки мають однакові знаки. Таке переповнення виявляється способом порівняння знакових розрядів отриманої суми, наприклад, застосовуючи операцію додавання за модулем 2 (XOR). Ознакою переповнення є неспівпадання цифр, які створюються у двох знакових розрядах суми, тобто код знаку числа має вигляд 01 або 10. Відповідно, результат неможливо віднести до додатних, ні до від’ємних модифікованих кодів. Пояснимо це на наступних прикладах.
Приклад 3:
1. А = + 0,1101; 2. А = - 0,1101;
В = + 0,0111; В = - 0,0111;
А + В > 0; А + В < 0;
+ +
Відкидається (
Як видно з прикладів, у знакових розрядах отриманої суми додатних доданків маємо комбінацію „01”, а від’ємних – „10”, що свідчить про переповнення розрядної сітки.
1.3. Множення двійкових чисел без знаку
Множення двійкових чисел виконують за правилами, аналогічними для десяткових чисел, тобто визначають проміжні добутки, а потім їх додають. Але, важливо зазначити, що у цьому процесі значно полегшується процес визначення проміжних добутків. Насправді виконуються тільки два правила множення двійкового числа на двійкову цифру:
1). Якщо ця двійкова цифра (розряд множника) дорівнює 1, то двійкове множене просто копіюється без змін у якості проміжного добутку;
2). Якщо цей розряд множника дорівнює 0, то проміжний добуток дорівнює 0.
При визначенні кожного наступного проміжного добутку він зсувається вліво на один розряд відносно попереднього. Всі отримані проміжні добутки, враховуючи зсуви, додаються між собою.
Табл. Приклад 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 повторюються для усіх цифрових розрядів множника.
Розробити алгоритм і написати програму додавання довільних 16-розрядних двійкових чисел із знаком, поданих у форматі з фіксованою комою у модифікованому доповняльному коді у інструкціях навчального комп’ютера DeComp.
Блок-схема:
Вхідні дані:
№
№ комірки пам’яті
Дані в двійковому коді
Позначення змінної в алгоритмі
Інформація про вхідні дані та призначення комірок, що використовуються.
40
0000 0000 0010 1000
0000 0000 0000 0100
A
А=4
41
0000 0000 0010 1001
0000 0000 0000 0101
B
В=5
42
0000 0000 0010 1010
1100 0000 0000 0000
М
Число М – маска. Слугує для визначення знаку.
43
0000 0000 0010 1011
0000 0000 0000 0001
К
Число К=1 допомагає переводити у доповняльний код.
44
0000 0000 0010 1100
0000 0000 0000 0000
S
S- сума чисел А і В. Початкове значення 0.
45
0000 0000 0010 1101
0000 0000 0000 0000
0
Маска для визначення знаку через оновлення ознаки
Програма:
№
№ комірки пам’яті
Двійковий код інструкції
Мнемонічний запис інструкції
Коментар
0
0000 0000 0000
0000 0000 0010 1000
LOAD 40
завантажити до акумулятора A
1
0000 0000 0001
0011 0000 0010 1101
SUB 45
Перевести в доповняльний код і зберегти
2
0000 0000 0010
1010 0000 0000 0111
JP 7
3
0000 0000 0011
0111 0000 0000 0000
NOT
4
0000 0000 0100
0101 0000 0010 1010
OR 42
5
0000 0000 0101
0010 0000 0010 1011
ADD 43
6
0000 0000 0110
0001 0000 0010 1000
STORE 40
7
0000 0000 0111
0000 0000 0010 1001
LOAD 41
Перевести в доповняльний код і зберегти
8
0000 0000 1000
0011 0000 0010 1101
SUB 45
9
0000 0000 1001
1010 0000 0000 1110
JP 14
10
0000 0000 1010
0111 0000 0000 0000
NOT
11
0000 0000 1011
0101 0000 0010 1010
OR 42
12
0000 0000 1100
0010 0000 0010 1011
ADD 43
13
0000 0000 1101
0001 0000 0010 1001
STORE 41
14
0000 0000 1110
0010 0000 0010 1000
ADD 40
Скласти два числа
Зберігти
15
0000 0000 1111
0001 0000 0010 1100
STORE 44
16
0000 0001 0000
0100 0000 0010 1010
AND 42
! Після цієї команди ознака S = 1
17
0000 0001 0001
0110 0000 0010 1010
XOR 42
ПЕРЕВІРКА НА 10, 01
18
0000 0001 0010
1000 0000 0001 1010
JNZ 26
Якщо (Z = 0), це означає що число не число. Програма виконана
19
0000 0001 0011
0000 0000 0010 1100
LOAD 44
Перевести в доповняльний код і зберегти
20
0000 0001 0100
0011 0000 0010 1101
SUB 45
21
0000 0001 0101
1010 0000 0001 1010
JP 26
22
0000 0001 0110
0111 0000 0000 0000
NOT
23
0000 0001 0111
0101 0000 0010 1010
OR 42
24
0000 0001 1000
0010 0000 0010 1011
ADD 43
25
0000 0001 1001
0001 0000 0010 1100
STORE 44
26
0000 0001 1010
0000 0000 0010 1100
LOAD 44
27
0000 0001 1011
0111 1100 0000 0000
HALT
Кінець програми
Результат виконання:
/
Виконати дослідження програми, розробленої у пункті 2, у покроковому режимі.
Блок-схема:
Виконання:
№
РА
РД
А
РІ
ЛАІ
РО
0
0000 0010 1000
0000 0000 0000 0100
0000 0000 0000 0100
0000 0000 0010 1000
0000 0000 0001
000
1
0000 0010 1101
0000 0000 0000 0000
0000 0000 0000 0100
0011 0000 0010 1101
0000 0000 0010
000
2
0000 0000 0010
1010 0000 0000 0111
0000 0000 0000 0100
1010 0000 0000 0111
0000 0000 0111
000
3
0000 0010 1001
0000 0000 0000 0101
0000 0000 0000 0101
0000 0000 0010 1001
0000 0000 1000
000
4
0000 0010 1101
0000 0000 0000 0000
0000 0000 000 0101
0011 0000 0010 1101
0000 0001 1001
000
5
0000 0000 1001
1010 0000 0000 1110
0000 0000 0000 0101
1010 0000 0000 1110
0000 0000 1110
000
6
0000 0010 1000
0000 0000 0000 0100
0000 0000 0000 1001
0010 0000 0010 1000
0000 0000 1111
000
7
0000 0010 1100
0000 0000 0000 1001
0000 0000 0000 1001
0001 0000 0010 1100
0000 0001 0000
000
8
0000 0010 1010
1100 0000 0000 0000
0000 0000 0000 0000
0100 0000 0010 1010
0000 0001 0001
100
9
0000 0010 1010
1100 0000 0000 0000
1100 0000 0000 0000
0110 0000 0010 1010
0000 0001 0010
010
10
0000 0001 0010
1000 0000 0001 1010
1100 0000 0000 0000
1000 0000 0001 1010
0000 0001 1010
010
11
0000 0010 1100
0000 0000 0000 1001
0000 0000 0000 1001
0000 0000 0010 1100
0000 0001 1011
010
12
0000 0001 1011
0111 1100 0000 0000
0000 0000 0000 1001
0111 1100 0000 0000
0000 0001 1011
010
Розробити алгоритм і написати програму множення довільних двійкових чисел без знаку. Метод множення 3: Множення, починаючи з молодших розрядів множника, із зсувом множеного вліво і СДП, що є нерухоме;
Мій варіант 23
Вхідні дані:
№
№ комірки пам’яті
Дані в двійковому коді
Позначення змінної в алгоритмі
Інформація про вхідні дані та призначення комірок, що використовуються.
20
0000 0000 0001 0100
0000 0000 0001 1111
A
А = 31, множеного
21
0000 0000 0001 0101
000 0000 0011 0110
B
B = 54, множник
22
0000 0000 0001 0110
0000 0000 0000 0001
М
М – маска. Слугує для визначення знаку
23
0000 0000 0001 0111
0000 0000 0000 0000
DP
Збереження проміжного значення початкове значення 0
24
0000 0000 0001 1000
0000 0000 0000 0000
S
Добуток. Початкове значення 0
Програма:
№
№ комірки пам’яті
Двійковий код інструкції
Мнемонічний запис інструкції
Коментар
0
0000 0000 0000
0000 0000 0001 0101
LOAD 21
LOAD B
1
0000 0000 0001
0100 0000 0001 0110
AND 22
Отримати знак= 0 = 1
2
0000 0000 0010
1001 0000 0000 1000
JZ 8
= 0
3
0000 0000 0011
0000 0000 0001 0100
LOAD 20
LOAD A
STORE DP
4
0000 0000 0100
0001 0000 0001 0111
STORE 23
5
0000 0000 0101
0000 0000 0001 1000
LOAD 24
LOAD S
ADD DP
STORE 24
6
0000 0000 0110
0010 0000 0001 0111
ADD 23
7
0000 0000 0111
0001 0000 0001 1000
STORE 24
8
0000 0000 1000
0000 0000 0001 0110
LOAD 22
Зсув маски вліво
9
0000 0000 1001
1111 0000 0000 0000
LSL
10
0000 0000 1010
0001 0000 0001 0110
STORE 22
11
0000 0000 1011
0000 0000 0001 0100
LOAD 20
Зсув A вліво
12
0000 0000 1100
1111 1100 0000 0000
RCL
13
0000 0000 1101
0001 0000 0001 0100
STORE 20
14
0000 0000 1110
1100 0000 0000 0000
JNC 0
Як тільки дійшов до кінця вихід
15
0000 0000 1111
0000 0000 0001 1000
LOAD 24
Завантажити результат множення
16
0000 0001 0000
0111 1100 0000 0000
HALT
Кінець програми
Результат виконання:
/
Висновок:
На цій лаболаторні роботі я вивчив форми подання і застосування додатних та від’ємних чисел у арифметиці з фіксованою комою; навчився розробляти алгоритми і здійснювати їх реалізацію у інструкціях процесора навчального комп'ютера DeComp виконання арифметичних операцій додавання та віднімання над двійковими числами з фіксованою комою у модифікованих кодах; навчився розробляти алгоритми і здійснювати їх реалізацію у інструкціях процесора навчального комп'ютера DeComp виконання арифметичної операції множення двійкових чисел без знаку.