Міністерство освіти та науки України
Національний університет «Львівська політехніка»
ЗВІТ
З лабораторної роботи №5
З дисципліни «Організація та функціонування комп’ютерів»
На тему: «Дослідження виконання арифметичних операцій з числами у форматі з
фіксованою комою у навчальному комп’ютері - симуляторі DeComp»
Тема: Дослідження виконання арифметичних операцій з числами у форматі з фіксованою комою у симуляторі DeComp.
Мета: Вивчити подання і застосування додатних та від’ємних чисел у арифметиці з фіксованою комою;
Навчитись розробляти алгоритми виконання операції віднімання з використанням обернених, доповнювальних і модифікованих кодів;
Навчитись розробляти алгоритми виконання операції множення додатних і від’ємних двійкових чисел.
Теоретичні відомості
Відомо, що одним з можливих шляхів виконання операції віднімання є заміна знаку числа, яке віднімається, на протилежний і додавання його до зменшуваного.
А - В = А + ( - В)
Таким чином операцію арифметичного віднімання замінюють операцією алгебраїчного додавання, яку можна виконати за допомогою двійкових суматорів. Нагадаємо, що від’ємні числа у комп’ютері подаються у прямому, доповняльному і оберненому кодах. Числа зберігаються у прямому коді, перед виконанням обчислень перетворюються у потрібний – доповняльний або обернений - код і після виконання обчислень знову перетворюються у прямий код.
При додаванні двох двійкових чисел, за абсолютною величиною менших одиниці, код суми може за абсолютною величиною перевищити одиницю або стати рівним їй. У такому випадку відбудеться переповнення розрядної сітки, що призведе до неправильного результату.
Переповнення розрядної сітки при додавання модифікованих кодів може бути лише у випадках, коли доданки мають однакові знаки. Таке переповнення виявляється способом порівняння знакових розрядів отриманої суми. Признаком переповнення є неспівпадіння цифр, які створюються у двох знакових розрядах суми, тобто результат неможливо віднести до жодного з модифікованих кодів.
Операція множення двох чисел зводиться до послідовного виконання сукупності операцій множення множеного на розряди множника і зсуву проміжних добутків та множника. Нагадаємо, що у цьому процесі у дійсності застосовуються тільки два правила множення одного двійкового числа на двійкову цифру:
якщо ця цифра множника дорівнює 1, то двійкове число (множник) просто копіюється;
якщо цей розряд множника дорівнює 0, то проміжний добуток дорівнює 0.
При створенні кожного нового проміжного добутку він зсувається вліво на один розряд по відношенню до попереднього проміжного добутку. Наступний проміжний добуток зсувається вліво на один розряд від попереднього і у тому випадку, коли він дорівнює 0. Цей процесс продовжується до тих пір, поки не будуть використані всі розряди множника. Отримані проміжні добутки додаються і їх сума дає остаточний результат.
Алгоритми виконання операції множення для різних форм подання чисел відрізняються незначно. Головні відмінності полягають у визначенні величини порядку добутку при множенні чисел з рухомою комою і місця коми при множенні чисел з фіксованою комою.
Крім необхідності враховувати знаки співмножників для визначення знаку добутку, потрібно враховувати вплив їх знаків на достовірність результату. Від’ємними можуть бути як множене, так і множник. Якщо від’ємний знак подається одиницею перед старшим розрядом модуля двійкового числа, це сприймається комп’ютером як старший розряд числа. Тоді результат операції множення, коли множене або множник від’ємний, буде хибний і величина похибки залежить від того, яке з двох чисел (або обидва) є від'ємним.
Таким чином, крім операції додавання для отримання добутку необхідна операція зсуву. При цьому з'являється можливість зсувати множене або суму проміжних добутків, що дає підставу для різних методів реалізації операції множення.
М е т о д 1. Нехай А – множене (А > 0), В – множник (В > 0), С – добуток. Тоді у випадку подання чисел у формі з фіксованою комою отримаємо:
А = 0, а1 а2 а3 . . . аn;
В = 0, b1 b2 . . .bn = b12-1 + b22-2 + . . . + bn2-n.
Звідси
С = А * В = 0, а1 а2 а3 . . . аn(b12-1 + . . . + bn2-n) =
= (2-1 * 0, a1 a2 . . . an )b1 + (2-2 * 0, a1 a2 . . .an )bn + . . . + (2-n * 0, a1 a2 . . . an )bn .
Множник 2-n означає зсув на n розрядів вправо числа, яке знаходиться у дужках, тобто у даному випадку зсувається вправо множене і множення починається із старших розрядів.
М е т о д 2. Нехай А = 0, а1 а2 а3 . . . аn – множене і В = 0, b1 b2 . . .bn – множник.
Множник легко перетворити, використовуючи метод Горнера:
В = (. . .((bn * 2-1 + bn-1)2-1 + bn-2) * 2-1 + . . . b2) * 2-1 + b1) * 2-1 .
Тоді
С = А * В = (. . .((b * 0, a1 a2 . . . an) * 2-1 + bn-1 0, a1 a2 . . .an )2-1 + b1 0, a1 a2 . . .an )2-1 .
У цьому випадку множення починається з молодшиз розрядів і зсувається вправо сума проміжних добутків.
М е т о д 3. Нехай А = 0, а1 а2 а3 . . . аn – множене і В = 0, b1 b2 . . .bn – множник.
Множник, використовуючи метод Горнера, можна записати таким чином:
В = 2-n (b1 * 2n-1 + b2* 2n-2 + bn-1* 21 + bn * 20) = 2n-1 (. . . ((b1 * 21 * b2) 21 + . . . + b n-1) 21 + bn).
У цьому випадку
С = А * В = 2-n (bn * 0, a1 a2 . . . an + (21 * 0, a1 a2 . . . an) bn-1 + . . . + (2n-1 * 0, a1 a2 . . . an)b1),
що означає: множення починається з молодших розрядів, і множене зсувається вліво на один розряд у кожному такті.
М е т о д 4. Нехай А = 0, а1 а2 а3 . . . аn – множене і В = 0, b1 b2 . . .bn – множник.
Якщо множник В записати за методом Горнера:
С = А * В = 2-n (. . .(21 (b1 * 0, a1 a2 . . . an) + b2* 0, a1 a2 . . . an) 21 + . . .
. . . + bn-1* 0, a1 a2 . . . an) 21 + bn* 0, a1 a2 . . . an),
то множення починається із старшого розряду і у кожному такті зсувається вліво сума проміжних добутків.
Крім згаданих вище існують і інші методи та алгоритми. Взагалі множення двійкових чисел може здійснюватися:
- послідовним способом – при цьому одночасно аналізується тільки один розряд множника і формуються часткові добутки множеного на один розряд множника. Ці добутки послідовно сумуються;
паралельним способом – при цьому одночасно аналізуються всі розряди множника і одразу формується кінцевий результат – добуток множеного на усі розряди множника;
проміжним способом – при цьому одночасно аналізуються декілька розрядів множника і формуються часткові добутки множеного на декілька розрядів множника, ці добутки послідовно сумуються.
Виконання роботи
1) Щоб виконати додавання двох чисел в 40-у комірку заношу число 0000 0000 0001 0000, а у 41-у – 1100 0000 0000 1000. В 42-у – 1100 0000 0000 0000, 43-у – 1, 44-у і 45 – нулі, 46 – результат, 47 – проміжна. Від’ємне число буде подаватись у модифікованому коді, для цього використаю таку програму:
Код програми:
№п/п
Адреса комірки
Код інструкції
Мнемонічний запис
Коментар
1
0000 0000 0000
0000 0000 0010 1000
Load 40
Перевірка чи число від’ємне
2
0000 0000 0001
1111 1100 0000 0000
RCL
3
0000 0000 0010
1100 0000 0000 1000
JNC 8
Якщо число не від’ємне то перейти на 8-у комірку
4
0000 0000 0011
0000 0000 0010 1000
Load 40
Подання числа у доповняльному коді
5
0000 0000 0100
0111 0000 0000 0000
NOT
6
0000 0000 0101
0101 0000 0010 1010
OR 42
7
0000 0000 0110
0010 0000 0010 1011
Add 43
8
0000 0000 0111
0001 0000 0000 0000
Store 40
9
0000 0000 1000
0000 0000 0010 1001
Load 41
Перевірка другого числа на від’ємність
10
0000 0000 1001
1111 1100 0000 0000
RCL
11
0000 0000 1010
1100 0000 0001 0000
JNC 16
Якщо друге число не від’ємне, то перейти на 16-у комірку
12
0000 0000 1011
0000 0000 0010 1001
Load 41
Подання другого числа у доповняльному коді
13
0000 0000 1100
0111 0000 0000 0000
NOT
14
0000 0000 1101
0101 0000 0010 1010
OR 42
15
0000 0000 1110
0010 0000 0010 1011
Add 43
16
0000 0000 1111
0001 0000 0010 1001
Store 41
17
0000 0001 0000
0000 0000 0010 1000
Load 40
Обчислення результату
18
0000 0001 0001
0010 0000 0010 1001
Add 41
19
0000 0001 0010
0001 0000 0010 1110
Store 46
20
0000 0001 0011
1111 1100 0000 0000
RCL
Перевірка старшого розряду
21
0000 0001 0100
0001 0000 0010 1111
Store 47
22
0000 0001 0101
1100 0000 0001 1001
JNC 25
Якщо С = 0 перейти на 25-у комірку
23
0000 0001 0110
0000 0000 0010 1100
Load 44
Запис до 44-ї комірки 1
24
0000 0001 0111
0010 0000 0010 1011
Add 43
25
0000 0001 1000
0001 0000 0010 1100
Store 44
26
0000 0001 1001
0000 0000 0010 1111
Load 47
Перевірка передостаннього розряду
27
0000 0001 1010
1111 1100 0000 0000
RCL
28
0000 0001 1011
1100 0000 0001 1110
JNC 30
29
0000 0001 1100
0000 0000 0010 1101
Load 45
Перевірка на переповнення розрядної сітки
30
0000 0001 1101
0010 0000 0010 1011
Add 43
31
0000 0001 1110
0110 0000 0010 1100
XOR 44
32
0000 0001 1111
1000 0000 0010 0101
JNZ 37
33
0000 0010 0000
0000 0000 0010 1110
Load 46
Перевірка знаку результату
34
0000 0010 0001
1111 1100 0000 0000
RCL
35
0000 0010 0010
1000 0000 0010 0101
JNC 37
36
0000 0010 0011
0111 0000 0000 0000
NOT
Переведення в прямий код
37
0000 0010 0100
0010 0000 0010 1011
Add 43
38
0000 0010 0101
0111 1100 0000 0000
Halt
Зупинка виконання програми
2) Для виконання множення над двома довільними числами у модифікованому коді виконаю таку програму:
Для виконання порграми попередньо в комірки заношу числа:
Номер комірки
Номер комірки в двійковому коді
Призначення комірки, або число, що в ній міститься
80
0000 0101 0000
Перше число (множиме)
81
0000 0101 0001
Друге число (множник)
82
0000 0101 0010
Нуль
83
0000 0101 0011
Знак першого числа
84
0000 0101 0100
Знак другого числа
85
0000 0101 0101
1100 0000 0000 0000
86
0000 0101 0110
Знак результату
87
0000 0101 0111
0011 1111 1111 1111
88
0000 0101 1000
Перший проміжний добуток, такий самий як перше число
89
0000 0101 1001
Результат старших розрядів
90
0000 0101 1010
14
91
0000 0101 1011
1
92
0000 0101 1100
13
93
0000 0101 1101
Результат молодших розрядів
94
0000 0101 1110
1000 0000 0000 0000 – маска
95
0000 0101 1111
1000 0000 0000 0000 – параметр для зміни маски
96
0000 0110 0000
Проміжна комірка
97
0000 0110 0001
Другий проміжний добуток
Далі виконую таку програму:
№п/п
Адреса комірки
Код інструкції
Мнемонічний запис
Коментар
1
0
0000 0000 0101 0000
Load 80
Визначення знаку першого числа
2
1
0010 0000 0101 0010
Add 82
3
2
1010 0000 0000 0101
JP 5
4
3
0000 0000 0101 0101
Load 85
5
4
0001 0000 0101 0011
Store 83
6
5
0000 0000 0101 0001
Load 81
Визначення знаку другого числа
7
6
0010 0000 0101 0010
Add 82
8
7
1010 0000 0000 1010
JP 10
9
8
0000 0000 0101 0101
Load 85
10
9
0001 0000 0101 0100
Store 84
11
10
0000 0000 0101 0100
Load 84
Визначення знаку результату
12
11
0110 0000 0101 0011
XOR 83
13
12
0001 0000 0101 0110
Store 86
14
13
0000 0000 0101 0000
Load 80
Підготовка чисел до множення
15
14
0100 0000 0101 0111
AND 87
16
15
0001 0000 0101 0000
Store 80
17
16
0000 0000 0101 0001
Load 81
18
17
0100 0000 0101 0111
And 87
19
18
0001 0000 0101 0001
Store 81
20
19
0000 0000 0101 0001
Load 81
Підготовка множника
21
20
1111 0000 0000 0000
LSL
22
21
1111 0000 0000 0000
LSL
23
22
0001 0000 0110 0000
Store 96
24
23
0000 0000 0110 0000
Load 96
Перевірка поточного розряду множника
25
24
1111 1100 0000 0000
RCL
26
25
0001 0000 0110 0000
Store 96
27
26
1100 0000 0001 1110
JNC 30
28
27
0000 0000 0101 1001
Load 89
Формування результату старших розрядів
29
28
0010 0000 0101 1000
Add 88
30
29
0001 0000 0101 1001
Store 89
31
30
0000 0000 0101 1000
Load 88
Підготовка порміжного добутку
32
31
1111 0010 0000 0000
LSR
33
32
0001 0000 0101 1000
Store 88
34
33
0000 0000 0101 1010
Load 90
Зміна параметрів і керування циклом
35
34
0011 0000 0101 1011
SUB 91
36
35
0001 0000 0101 1010
Store 90
37
36
1000 0000 0001 0111
JNZ 23
38
37
0000 0000 0101 0000
Load 80
Підготовка проміжного добутку
39
38
0001 0000 0110 0001
Store 97
40
39
0000 0000 0101 0001
Load 81
Підготовка множника
41
40
1111 0000 0000 0000
LSL
42
41
1111 0000 0000 0000
LSL
43
42
0001 0000 0110 0000
Store 96
44
43
0000 0000 0110 0001
Load 97
Зсув проміжного добутку
45
44
1111 1010 0000 0000
ROR
46
45
0001 0000 0110 0001
Store 97
47
46
0000 0000 0110 0000
Load 96
Перевірка поточного розряду множника на наявність одиниці
48
47
1111 1100 0000 0000
RCL
49
48
0001 0000 0110 0000
Store 96
50
49
1100 0000 0011 1001
JNC 59
51
50
0000 0000 0110 0001
Load 97
Формування проміжного добутку з накладанням маски
52
51
0100 0000 0101 1110
AND 94
53
52
0001 0000 0101 1000
Store 88
54
53
0010 0000 0101 1101
Add 93
Формування результату молодших розрядів
55
54
0001 0000 0101 1101
Store 93
56
55
1100 0000 0011 1001
JNC 59
Перевірка на перенесення одиниці до старших розрядів
57
56
0000 0000 0101 1001
Load 89
58
57
0010 0000 0101 1011
Add 91
59
58
0001 0000 0101 1001
Store 89
60
59
0000 0000 0101 1111
Load 95
Зміна параметрів маски
61
60
1111 1010 0000 0000
ROR
62
61
0001 0000 0101 1111
Store 95
63
62
0010 0000 0101 1110
Add 94
64
63
0001 0000 0101 1110
Store 94
65
64
0000 0000 0101 1100
Load 92
Зміна параметрів та керування циклом
66
65
0011 0000 0101 1011
Sub 91
67
66
0001 0000 0101 1100
Store 92
68
67
1000 0000 0010 1011
JNZ 43
69
68
0111 1100 0000 0000
Halt
Завершення виконання програми
Висновки: Під час виконання цієї лабораторної роботи я вивчив подання і застосування додатних та від’ємних чисел у арифметиці з фіксованою комою.
Навчився розробляти алгоритми виконання операції віднімання з використанням обернених, доповнювальних і модифікованих кодів.
Навчився розробляти алгоритми виконання операції множення додатних і від’ємних двійкових чисел.