Міністерство освіти і науки, молоді та спорту України
Національний університет «Львівська політехніка»
Кафедра СКС
Звіт з лабораторної роботи №6
з дисципліни : «Організація та функціонування комп’ютерів»
на тему : «Дослідження виконання арифметичних операцій у форматі з рухомою комою»
Тема: «Дослідження виконання арифметичних операцій у форматі з рухомою комою.»
Мета:
Ознайомитися з поданням чисел у нормальній формі. Засвоїти порядок нормалізації чисел з рухомою комою. Ознайомитися з поняттям “характеристика” для чисел з рухомою комою.
Вивчити правила додавання (віднімання) двійкових чисел з рухомою комою.
Розробити алгоритми і програми додавання чисел в арифметиці з рухомою комою в інструкціях навчального комп'.ютера - симулятора DeComp.
1. Теоретична частина
1.1. Подання чисел з рухомою комою
У форматі з рухомою комою, який звичайно називають нормальною формою запису, числа записуються наступним чином:
A = ( М * d ( Р ,
де p – ціле число, яке називається порядком числа А;
d – основа системи числення;
М – мантиса числа А (звичайно |M| < 1).
При нормальній формі запис одного числа може приймати різний вигляд у залежності від обмежень, що накладаються на його форму. Фактично місце коми у мантисі М визначається величиною порядку р. Із зміною порядку р у більшу або меншу сторону кома відповідно переміщується ліворуч або праворуч, тобто рухається (“плаває”) у зображені мантиси. Наприклад:
23410 = 234 * 100 = 0,234 * 103 = 0,0234 * 104 = 2,34 * 102 ;
1011012 = 101101 * 100 = 0,101101 * 10110 = 0,00101101 * 101000 .
Можна зауважити, що хоча числа у наведених прикладах однакові за абсолютною величиною, проте мантиса потребує різної кількості розрядів. Для цього, щоб запобігти цьому, звичайно уводять деякі обмеження. Найбільш розповсюдженим і зручним для подання у комп’ютерах обмеженням є наступне:
d-1 ( M ( 1.
Числа, що записані у такій формі називаються нормалізованими. Іншими словами, у нормалізованих числах у мантисі першою цифрою перед комою стоїть 0, а перша цифра після коми – це цифра відмінна від нуля. Для двійкової системи числення вона дорівнює 1.
Таким чином, мантису розглядають як число менше одиниці, а порядок – як ціле число.
Операція нормалізації виконується шляхом зсуву мантиси вліво із зменшенням порядку, або вправо із збільшення порядку на величину, яка дорівнює кількості розрядів, на яку була зсунута мантиса.
Приклад: нормалізувати наступні числа:
0,00237 * 105 = 0,237 * 103 – мантиса зсувається на два розряди вліво, тобто – збільшується, а порядок зменшується на дві одиниці.
10101,0112 * 1010 = 0,10101011 * 10 111 - мантиса зсувається вправо на 5 розрядів, тобто – зменшується, а порядок збільшується на 5 одиниць.
Нормалізоване подання чисел дозволяє зберігати у розрядній сітці комп’ютера більшу кількість цифр, що мають значення, тому точність обчислень підвищується. Зазвичай у комп’ютерах нормалізація здійснюється автоматично як при вводі чисел, так і у процесі обчислень (після виконання чергової операції). При цьому мантиса зсувається ліворуч на необхідну кількість розрядів і виконується відповідне зменшення порядку, тобто виконується “нормалізація вліво”.
При виконанні операції додавання або віднімання нормалізованих чисел з різними порядками одно з них “денормалізується” до вирівнювання порядків, а сума (або різниця) знову нормалізується.
У розрядній сітці комп’ютерів фіксуються знак числа, знак порядку, порядок числа і числовий вираз мантиси.
0
1
2
...
...
...
...
...
...
m+n+1
(0
(0
(1
(2
...
(m
(1
(2
...
(n
Знак
мантиси
Знак
порядку
Порядок
Мантиса
У комп’ютерах із рухомою комою можливе переповнення розрядної сітки, так само, як і у комп’ютерах із фіксованою комою. Наприклад, переповнення може виникнути при додаванні нормалізованих чисел одного знаку з однаковими порядками. У цьому випадку з’являється “1” ліворуч від коми. Такого роду переповнення коригується зсувом мантиси вправо на один розряд і збільшенням порядку на одиницю, тобто виконується “нормалізація вправо”.
2. Порядок роботи:
Розробити алгоритм і написати програму додавання довільних (додатних і від’ємних) двійкових чисел із рухомою комою у модифікованому доповнювальному коді в інструкціях симулятора DeComp. Числа подаються у форматі:
Знак порядку
Знак мантиси
Порядок
Мантиса
2 розряди
2 розряди
4 розряди
8 розрядів
У алгоритмі передбачити аналіз отриманого результату на:
переповнення розрядної сітки (порушення нормалізації вліво);
наявність порушення нормалізації вправо;
від'ємний результат
Передбачити відповідні заходи з корекції результату
/
ні
ні
так
Виконання:
Інформація про вхідні дані:
350
aaaa aaaa aaaa aaaa
Число а
351
aaaa aaaa aaaa aaaa
Число b
352
1100 0000 0000 0000
Маска для знаку порядку
353
0000 1111 0000 0000
Маска для порядку
354
0000 0000 0000 0000
Pa (порядок числа а)
355
0000 0000 0000 0000
Знак порядка числа а
356
0000 0000 0000 0000
Pb (порядок числа b)
357
0000 0000 0000 0000
Знак порядку числа b
358
0000 0000 0000 0000
Порядок зі знаком числа a
359
0000 0000 0000 0000
Порядок зі знаком числа b
360
0000 0000 0000 0001
Одиниця для додавання
361
0000 0000 0000 0010
Нормалізація порядку
362
0011 1100 0000 0000
Маска для нормалізації інвертування порядка
363
0000 0000 0000 0000
ma (мантиса числа a)
364
0000 0000 0000 0000
mb (мантиса числа b)
365
0000 0000 0000 0000
Знак мантиси числа a
366
0000 0000 0000 0000
Знак мантиси числа b
367
0011 0000 0000 0000
Маска для відокремлення знаку мантиси
368
0000 0000 1111 1111
Маска для відокремлення мантиси
369
0000 0000 0000 0000
Мантиса зі знаком числа a
370
0000 0000 0000 0000
Мантиса зі знаком числа b
371
0000 0000 0000 0000
Різниця порядків
372
0011 1110 0000 0000
Маска для взяття різниці порядків
373
1011 1111 1111 1111
Обернена маска для взяття модуля різниці
374
0000 0000 0000 1001
Нормалізація різниці порядків
375
0000 0000 0000 0101
Підготовка мантиси числа а
376
0000 0000 0000 0101
Підготовка мантиси числа b
377
0000 0000 0000 0010
Нормалізація порядку
378
0000 0000 1111 1111
Маска для виділення мантиси
379
1000 0000 0000 0000
Відновлення знаку мантиси
380
0000 0000 0000 0000
Сума двох чисел
381
0000 0000 0000 0000
Мантиса результату
382
0000 0000 0000 0000
Знак мантиси результату
383
0000 0000 0000 0000
Порядок результату
384
0000 0000 0000 0000
Знак порядку результату
385
0011 1111 1110 0000
Маска для вибору мантиси результату
386
0000 0000 0000 0110
Зсув мантиси до молодших розрядів
387
0000 0000 0000 0000
Результат (Зн. П, Зн.М, Порядок, Мантиса)
388
0000 0100 0000 0000
Додавання одиниці для переведення порядку
389
0000 0010 0000 0000
Одиниця для переведення різниці порядків
390
0000 0000 0010 0000
Додавання одиниці для переведення мантиси
Код програми:
2
0000 0001 0101 1110
LOAD 350
Виділення порядку першого числа (А)
3
0100 0001 0110 0001
AND 353
4
0001 0001 0110 0010
STORE 354
Переміщення порядку до старших розрядів, шляхом зсуву вліво та віднімання одиниці з заготовленої маски
5
0000 0001 0110 0010
LOAD 354
6
1111 0010 0000 0000
LSL
7
0011 0001 0110 1000
SUB 360
8
0001 0001 0110 1001
STORE 361
9
1000 0000 0000 0011
JNZ 3
10
0000 0001 0101 1110
LOAD 350
11
0100 0001 0110 0000
AND 352
12
0001 0001 0110 0011
STORE 355
Виділення знаку першого порядку числа (А) логічним «І»
13
1111 1100 0000 0000
LSL
14
1100 0000 0001 0100
JNC 20
15
0000 0001 0110 0010
LOAD 354
Перевірка на від’ємність першого порядку числа (А)
16
0111 0000 0000 0000
NOT
17
0100 0001 0110 1010
AND 362
Якщо А<0, то переводимо порядок в доповняльний код логічним «І» та додавши одиницю до молодшого розряду
18
0010 0001 1000 0100
ADD 388
19
0001 0001 0110 0010
STORE 354
20
0000 0001 0110 0010
LOAD 354
21
0010 0001 0110 0011
ADD 355
22
0001 0001 0110 0110
STORE 358
Об’єднання знаку і порядку в одне число
23
0000 0001 0101 1111
LOAD 351
24
0100 0001 0110 0001
AND 353
25
0001 0001 0110 0100
STORE 356
Виділення порядку другого числа (В)
26
0000 0001 0110 0100
LOAD 356
27
1111 0010 0000 0000
LSL
28
0001 0001 0110 0100
STORE 356
Переміщення порядку до старших розрядів, шляхом зсуву вліво та віднімання одиниці з заготовленої маски
29
0000 0001 0110 1001
LOAD 377
30
0011 0001 0110 1000
SUB 360
31
0001 0001 0110 1001
STORE 377
32
1000 0000 0001 1010
JNZ 26
33
0000 0001 0101 1111
LOAD 351
34
0100 0001 0110 0000
AND 352
35
0001 0001 0110 0101
STORE 357
Виділення знаку другого числа (В) логічним «І»
36
1111 1100 0000 0000
LSL
37
1100 0000 0010 1011
JNC 43
38
0000 0001 0110 0100
LOAD 356
Перевірка на від’ємність (В)
39
0111 0000 0000 0000
NOT
40
0100 0001 0110 1010
AND 362
Якщо порядок другого числа <0, то переводимо порядок в доповняльний код шляхом додавання одиниці з маски
41
0010 0001 1000 0100
ADD 388
42
0001 0001 0110 0100
STORE 356
43
0000 0001 0110 0100
LOAD 356
44
0010 0001 0110 0101
ADD 357
45
0001 0001 0110 0111
STORE 359
Об’єднання знаку і порядку в одне число
46
0000 0001 0101 1110
LOAD 350
47
0100 0001 0111 0000
AND 368
48
0001 0001 0110 1011
STORE 363
Виділення мантиси числа А
49
0000 0001 0101 1110
LOAD 350
50
0100 0001 0110 1111
AND 367
51
1111 1100 0000 0000
LSL
Виділення і нормалізація знаку матиси (А) подвійним зсувом вліво
52
1111 1100 0000 0000
LSL
53
0001 0001 0110 1101
STORE 365
54
0000 0001 0101 1111
LOAD 351
55
0100 0001 0111 0000
AND 368
56
0001 0001 0110 1100
STORE 364
Виділення мантиси числа В
57
0000 0001 0101 1111
LOAD 351
58
0100 0001 0110 1111
AND 367
59
1111 1100 0000 0000
LSL
Виділення і нормалізація знаку матиси (В) подвійним зсувом
60
1111 1100 0000 0000
LSL
61
0001 0001 0110 1110
STORE 366
62
0000 0001 0110 0110
LOAD 358
63
0010 0001 0110 0111
ADD 359
64
0001 0001 0111 0011
STORE 371
Визначення різниці порядків
65
1011 0000 0100 1100
JM 76
66
1111 0010 0000 0000
LSR
67
0100 0001 0111 0100
AND 372
Визначення знаку різниці
68
0001 0001 0111 0011
STORE 371
Корекція результату віднімання порядків
69
0000 0001 0111 0011
LOAD 371
70
0011 0001 0110 1000
SUB 360
71
1001 0000 0101 1010
JZ 90
Зсув мантиси на величину різниці порядків шляхом зсуву вправо двійкогового коду мантиси
72
0001 0001 0111 0011
STORE 371
73
0000 0001 0110 1100
LOAD 364
74
1111 0010 0000 0000
LSR
75
0001 0000 0110 1100
STORE 364
76
1110 0000 0101 0010
JMP 82
77
1111 0010 0000 0000
LSR
78
0100 0001 0111 0101
AND 373
79
0001 0001 0111 0011
STORE 371
Корекція результату
80
0100 0001 0111 0100
AND 372
81
0111 0000 0000 0000
NOT
82
0010 0001 1000 0101
ADD 389
Переведення числа в прямий код додаючи одиницю
83
0000 0001 0110 0110
LOAD 358
84
0010 0001 0111 0011
ADD 371
85
0001 0001 0110 0110
STORE 358
Збільшення меншого порядку на величину різниці
86
0001 0001 0111 0011
STORE 371
87
0000 0001 0111 0011
LOAD 371
88
1111 0010 0000 0000
LSR
Нормалізація різниці порядків шляхом зсуву вправо, та додаванням одиниці з маски до молодшого розряду
89
0001 0001 0111 0011
STORE 371
90
0000 0001 0111 0110
LOAD 374
91
0011 0001 0110 1000
SUB 360
92
0001 0001 0111 0110
STORE 374
93
1000 0000 0110 0011
JNZ 99
94
0000 0001 0111 0011
LOAD 371
95
0011 0001 0110 1000
SUB 360
96
1001 0000 0111 0011
JZ 115
Зсув мантиси на величину різниці порядків, шляхом зсуву двійкового коду мантиси та відніманням одиниці в молодшому розряді
97
0001 0001 0111 0011
STORE 371
98
0001 0001 0110 1011
LOAD 363
99
1111 0010 0000 0000
LSR
100
0000 0001 0110 1011
STORE 363
101
1110 0000 0110 1011
JMP 107
102
0000 0001 0110 1101
LOAD 365
103
1111 1100 0000 0000
LSL
104
1100 0000 0110 1110
JNC 110
Переведення числа a в доповняльний код шляхом інвертування , та додаванням одиниці до молодшого розряду
105
0001 0000 0110 1011
LOAD 363
106
0111 0000 0000 0000
NOT
107
0010 0001 0110 1000
ADD 360
108
0100 0001 0111 1010
AND 378
109
0000 0000 0110 1011
STORE 363
110
0000 0001 0110 1110
LOAD 366
111
1111 1100 0000 0000
LSL
112
1100 0000 0111 0110
JNC 118
Переведення числа b в доповняльний код шляхом інвертування , та додаванням одиниці до молодшого розряду
113
0000 0000 0110 1100
LOAD 364
114
0111 0000 0000 0000
NOT
115
0010 0001 0110 1000
ADD 360
116
0100 0001 0111 1010
AND 378
117
0001 0001 0110 1100
STORE 364
118
0001 0001 0110 1011
LOAD 363
119
1111 1100 0000 0000
LSL
120
0001 0001 0110 1011
STORE 363
Зсув мантиси числа а до старших розрядів, зсувум вліво та відніманням одиниці від молодших розрядів
121
0000 0001 0111 1101
LOAD 375
122
0011 0001 0110 1000
SUB 360
123
0001 0001 0111 1101
STORE 375
124
1000 0000 1000 0011
JNZ 131
125
0000 0001 0110 1100
LOAD 364
126
1111 1100 0000 0000
LSL
127
0001 0001 0110 1100
STORE 364
Зсув мантиси числа b до старших розрядів шляхом зсуву вліво та відніманням одиниці від двійкового коду власне мантиси
128
0000 0001 0111 1110
LOAD 376
129
0011 0001 0110 1000
SUB 360
130
0001 0001 0111 1110
STORE 376
131
1000 0000 1000 1010
JNZ 138
132
0001 0001 0110 1011
LOAD 363
133
0010 0001 0110 1101
ADD 365
134
0001 0001 0111 0001
STORE 369
Об’єднання знаку і мантиси в одне число числа а шляхом додаання
135
0000 0001 0110 1100
LOAD 364
136
0010 0001 0110 1110
ADD 366
137
0001 0001 0111 0010
STORE 370
Об’єднання знаку і мантиси в одне число числа b шляхом додавання
138
0000 0001 0111 0001
LOAD 369
139
0000 0001 0111 0001
ADD 370
140
1011 0000 1001 1100
JM 156
Додавання мантис двох чисел (Власне додавання)
141
1111 1100 0000 0000
LSL
142
0001 0001 0111 1100
STORE 380
Збереження результату при додатньому результаті, зсунувши при цьому вліво для нормалізації результату, тобто прибравши одиницю з старших розрядів(якщо вона є)
143
1111 1100 0000 0000
LSL
144
0010 0001 0111 1011
ADD 379
145
0111 0000 0000 0000
NOT
Збереження результату при від’ємному результаті
146
0100 0001 1000 0001
AND 385
147
0010 0001 1000 0110
ADD 390
Переведення від’ємного результату в прямий код шляхом логічного «І», тобто власне інвертуванням
148
0010 0001 0110 0000
ADD 352
149
0001 0001 0111 1100
STORE 380
150
0000 0001 0110 0010
LOAD 354
151
1111 0010 0000 0000
LSR
152
1111 0010 0000 0000
LSR
Збереження порядку результату
153
0001 0001 0111 1111
STORE 383
154
0000 0001 0110 0011
LOAD 355
155
0001 0001 1000 0000
STORE 384
156
0000 0001 0111 1100
LOAD 380
Збереження знаку порядку результату
157
0100 0001 1000 0001
AND 385
158
1111 1100 0000 0000
LSL
Перевірка денормалізації вправо і корекція результату
159
1111 1100 0000 0000
LSL
160
1111 1100 0000 0000
RCL
161
1101 0000 1011 0110
JC 182
162
1111 1100 0000 0000
RCL
163
1101 0000 1011 0110
JC 182
164
0000 0001 0111 1111
LOAD 383
165
0010 0001 0110 1000
ADD 360
166
0001 0001 0111 1111
STORE 383
167
0000 0001 0111 1101
LOAD 381
168
1110 0000 1010 1001
JMP 169
169
1111 1110 0000 0000
RCR
170
0001 0001 0111 1101
STORE 381
171
0000 0001 0111 1101
LOAD 381
172
1111 0010 0000 0000
LSR
173
0001 0001 0111 1101
STORE 381
Збереження мантиси результату зсувом вправо та відніманням одиниці з молодшого розряду
174
0000 0001 1000 0010
LOAD 386
175
0011 0001 0110 1000
SUB 360
176
0001 0001 1000 0010
STORE 386
177
1000 0000 1011 1000
JNZ 184
178
0000 0001 0111 1100
LOAD 380
179
0100 0001 0110 0000
AND 352
180
1111 0010 0000 0000
LSR
Збереження знаку мантиси результату подвійним зсувом вправо
181
1111 0010 0000 0000
LSR
182
0001 0001 0111 1110
STORE 382
183
0000 0001 0111 1101
LOAD 381
184
0010 0001 0111 1110
ADD 382
185
0010 0001 0111 1111
ADD 383
Формування результату, тобто нормалізація вихідних даних, для зчитування власне користувачем
186
0010 0001 1000 0000
ADD 384
187
0001 0001 1000 0011
STORE 387
188
0111 1100 0000 0000
HALT
Завершення програми
.
Висновок: на цій лабораторні роботі я ознайомився з поданням чисел у нормальній формі, вивчив правила додавання (віднімання) двійкових чисел з рухомою комою.