Міністерство освіти та науки України
Національний університет «Львівська політехніка»
ЗВІТ
З лабораторної роботи №5
З дисципліни «Організація та функціонування комп’ютерів»
На тему: «Дослідження виконання арифметичних операцій з числами у форматі з
фіксованою комою у навчальному комп’ютері - симуляторі DeComp»
Львів-2008
Теоретичні відомості
Відомо, що одним з можливих шляхів виконання операції віднімання є заміна знаку числа, яке віднімається, на протилежний і додавання його до зменшуваного.
А - В = А + ( - В)
Таким чином операцію арифметичного віднімання замінюють операцією алгебраїчного додавання, яку можна виконати за допомогою двійкових суматорів. Нагадаємо, що від’ємні числа у комп’ютері подаються у прямому, доповняльному і оберненому кодах. Числа зберігаються у прямому коді, перед виконанням обчислень перетворюються у потрібний – доповняльний або обернений - код і після виконання обчислень знову перетворюються у прямий код.
При додаванні двох двійкових чисел, за абсолютною величиною менших одиниці, код суми може за абсолютною величиною перевищити одиницю або стати рівним їй. У такому випадку відбудеться переповнення розрядної сітки, що призведе до неправильного результату.
Переповнення розрядної сітки при додавання модифікованих кодів може бути лише у випадках, коли доданки мають однакові знаки. Таке переповнення виявляється способом порівняння знакових розрядів отриманої суми. Признаком переповнення є неспівпадіння цифр, які створюються у двох знакових розрядах суми, тобто результат неможливо віднести до жодного з модифікованих кодів.
Операція множення двох чисел зводиться до послідовного виконання сукупності операцій множення множеного на розряди множника і зсуву проміжних добутків та множника. Нагадаємо, що у цьому процесі у дійсності застосовуються тільки два правила множення одного двійкового числа на двійкову цифру:
якщо ця цифра множника дорівнює 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),
то множення починається із старшого розряду і у кожному такті зсувається вліво сума проміжних добутків.
Крім згаданих вище існують і інші методи та алгоритми. Взагалі множення двійкових чисел може здійснюватися:
- послідовним способом – при цьому одночасно аналізується тільки один розряд множника і формуються часткові добутки множеного на один розряд множника. Ці добутки послідовно сумуються;
паралельним способом – при цьому одночасно аналізуються всі розряди множника і одразу формується кінцевий результат – добуток множеного на усі розряди множника;
проміжним способом – при цьому одночасно аналізуються декілька розрядів множника і формуються часткові добутки множеного на декілька розрядів множника, ці добутки послідовно сумуються.
Виконання роботи
Розробити алгоритм і написати програму додавання довільних 16-розрядних двійкових чисел із знаком, поданих у форматі з фіксованою комою у модифікованому доповняльному коді у інструкціях навчального комп’ютера DeComp
Щоб виконати додавання двох 16-розрядних двійкових чисел зі знаком у форматі з фіксованою комою у модифікованому доповняльному коді, в 45-ту комірку занесемо число 0000 0000 0001 0000, а у 46-ту – 1100 0000 0000 1000. В 47-му – 1100 0000 0000 0000, 48-му – 1, 49-ту і 50-ту – 0000 0000 0000 0000, 51-шу – результат, а 52-га – проміжна. Для цього використаємо таку програму:
Адреса комірки
Код інструкції
Мнемонічний запис
Коментар
0
0000 0000 0010 1101
LOAD 45
Перевірка чи число від’ємне, циклічним зсувом Якщо число не від’ємне то перейти на 8-у комірку
1
1111 1100 0000 0000
RCL
2
1100 0000 0000 1000
JNC 8
3
0000 0000 0010 1101
LOAD 45
Інвертування числа і додавання одиниці до числа тобто представлення у доповнняльному коді запис у 45 комірку
4
0111 0000 0000 0000
NOT
5
0101 0000 0010 1111
OR 47
6
0010 0000 0011 0000
ADD 48
7
0001 0000 0010 1101
STORE 45
8
0000 0000 0010 1110
LOAD 46
Перевірка другого числа на від’ємність, циклічним зсувом. Якщо друге число не від’ємне, то перейти на 16-у комірку
9
1111 1100 0000 0000
RCL
10
1100 0000 0001 0000
JNC 16
11
0000 0000 0010 1110
LOAD 46
Інвертування числа і додавання одиниці до числа тобто представлення у доповняльному коді, запис у 46-шу комірку.
12
0111 0000 0000 0000
NOT
13
0101 0000 0010 1111
OR 47
14
0010 0000 0011 0000
ADD 48
15
0001 0000 0010 1110
STORE 46
16
0000 0000 0010 1101
LOAD 45
Додавання чисел.
17
0010 0000 0010 1110
ADD 46
18
0001 0000 0011 0011
STORE 51
19
1111 1100 0000 0000
RCL
Перевірка старшого розряду
Якщо С = 0 перейти на 25-у комірку
20
0001 0000 0011 0100
STORE 52
21
1100 0000 0001 1001
JNC 25
22
0000 0000 0011 0001
LOAD 49
Запис до 49-ї комірки 1
23
0010 0000 0011 0000
ADD 48
24
0001 0000 0011 0001
STORE 49
25
0000 0000 0011 0100
LOAD 52
Перевірка передостаннього розряду
26
1111 1100 0000 0000
RCL
27
1100 0000 0001 1110
JNC 30
28
0000 0000 0011 0010
LOAD 50
Перевірка на переповнення розрядної сітки
29
0010 0000 0011 0000
ADD 48
30
0110 0000 0011 0001
XOR 49
31
1000 0000 0010 0101
JNZ 37
32
0000 0000 0011 0011
LOAD 51
Перевірка знаку результату
33
1111 1100 0000 0000
RCL
34
1000 0000 0010 0101
JNC 37
35
0111 0000 0000 0000
NOT
Переведення в прямий код
36
0010 0000 0011 0000
ADD 48
37
0111 1100 0000 0000
HALT
Зупинка виконання програми
a – 45 комірка, заноситься перше число
b – 46 комірка, заноситься друге число
d – 51 комірка, сума чисел а i b
e – 49 комірка, останій розряд
f – 52 комірка, передостанній розряд
j – 50 комірка, перевірка на переповнення розрядної сітки
2) Виконати дослідження програми, розробленої у пункті 2, у покроковому режимі.
РА
РД
А
1-й крок
0000 0010 1101
0000 0000 0001 0000
0000 0000 0001 0000
2-й крок
0000 0000 0001
1111 1100 0000 0000
0000 0000 0010 0000
3–й крок
0000 0000 0010
1100 0000 0000 1000
0000 0000 0010 0000
4-й крок
0000 0010 1110
1100 0000 0000 1000
1100 0000 0000 1000
5-й крок
0000 0000 1001
1111 1100 0000 0000
1000 0000 0001 0000
6-й крок
0000 0000 1010
1100 0000 0001 0000
1000 0000 0001 0000
7-й крок
0000 0000 1011
1100 0000 0001 0000
1000 0000 0001 0000
8-й крок
0000 0000 1100
0111 0000 0000 0000
0111 1111 1110 1111
9-й крок
0000 0000 1101
0111 0000 0000 0000
1000 0000 0001 0000
10-й крок
0000 0011 0000
0000 0000 0000 0001
1000 0000 0001 0001
11-й крок
0000 0010 1110
1000 0000 0001 0001
1000 0000 0001 0001
12-й крок
0000 0010 1101
0000 0000 0001 0000
0000 0000 0001 0000
13-й крок
0000 0010 1110
1000 0000 0001 0001
1000 0000 0001 0001
14-й крок
0000 0011 0011
1000 0000 0001 0001
1000 0000 0001 0001
15-й крок
0000 0001 0011
1111 1100 0000 0000
0000 0000 0100 0010
16–й крок
0000 0011 0100
0000 0000 0100 0010
0000 0000 0100 0010
17-й крок
0000 0001 0101
1100 0000 0001 1001
0000 0000 0100 0010
18-й крок
0000 0011 0001
0000 0000 0000 0000
0000 0000 0000 0000
19-й крок
0000 0011 0000
0000 0000 0000 0001
0000 0000 0000 0001
20-й крок
0000 0011 0100
0000 0000 0100 0010
0000 0000 0100 0010
21-й крок
0000 0001 1001
1111 1100 0000 0000
0000 0000 1000 0100
22-й крок
0000 0001 1010
1100 0000 0001 1110
0000 0000 1000 0100
23-й крок
0000 0001 1110
1000 0000 0010 0101
0000 0000 1000 0100
24-й крок
0000 0010 0101
0111 1100 0000 0000
0111 1100 0000 0000
РІ
ЛАІ
РО
0000 0000 0010 1101
0000 0000 0001
0
1111 1100 0000 0000
0000 0000 0010
0
1100 0000 0000 1000
0000 0000 1000
0
0000 0000 0010 1110
0000 0000 1001
0
1111 1100 0000 0000
0000 0000 1010
SC
1100 0000 0001 0000
0000 0000 1011
SC
1100 0000 0001 0000
0000 0000 1100
SC
0111 0000 0000 0000
0000 0000 1101
0
0111 0000 0000 0000
0000 0000 1110
0
0010 0000 0011 0000
0000 0000 1111
S
0001 0000 0010 1110
0000 0001 0000
S
0000 0000 0010 1101
0000 0001 0001
S
0001 0000 0010 1110
0000 0001 0010
S
0001 0000 0011 0011
0000 0001 0011
S
1111 1100 0000 0000
0000 0001 0100
C
0001 0000 0011 0010
0000 0001 0101
C
1100 0000 0001 1001
0000 0001 0110
C
0000 0000 0011 0001
0000 0001 0111
C
0010 0000 0011 0000
0000 0001 1000
0
0000 0000 0011 0100
0000 0001 1001
0
1111 1100 0000 0000
0000 0001 1010
0
1100 0000 0001 1110
0000 0001 1110
0
1000 0000 0010 0101
0000 0010 0101
0
1111 1100 0000 0000
0000 0010 0101
0
3) Розробити алгоритм і написати програму множення довільних двійкових чисел без знаку. Варіант виконання вибрати з таблиці:
Для виконання множення над двома довільними числами у модифікованому коді виконаємо таку програму:
Для виконання порграми попередньо в наступні комірки заносимо числа:
Номер комірки
Номер комірки в двійковому коді
Призначення комірки, або число, що в ній міститься
100
0000 0110 0100
Перше число (множене)
101
0000 0110 0101
Друге число (множник)
102
0000 0110 0110
Нуль
103
0000 0110 0111
Знак першого числа
104
0000 0110 1000
Знак другого числа
105
0000 0110 1001
1100 0000 0000 0000
106
0000 0110 1010
Знак результату
107
0000 0110 1011
0011 1111 1111 1111
108
0000 0110 1100
Перший проміжний добуток, такий самий як перше число
109
0000 0110 1101
Результат старших розрядів
110
0000 0110 1110
14
111
0000 0110 1111
1
112
0000 0111 0000
13
113
0000 0111 0001
Результат молодших розрядів
114
0000 0111 0010
1000 0000 0000 0000 – маска
115
0000 0111 0011
1000 0000 0000 0000 – параметр для зміни маски
116
0000 0111 0100
Проміжна комірка
117
0000 0111 0101
Другий проміжний добуток
Далі виконуємо таку програму:
Адреса комірки
Код інструкції
Мнемонічний запис
Коментар
0
0000 0000 0110 0100
LOAD 100
Підготовка чисел до множення
1
0100 0000 0110 1011
AND 107
2
0001 0000 0110 0100
STORE 100
3
0000 0000 0110 0101
LOAD 101
4
0100 0000 0110 1011
AND 107
5
0001 0000 0110 0101
STORE 101
6
0000 0000 0110 0101
LOAD 101
Підготовка множника
7
1111 0000 0000 0000
LSL
8
1111 0000 0000 0000
LSL
9
0001 0000 0111 0100
STORE 116
10
0000 0000 0111 0100
LOAD 116
Перевірка поточного розряду множника
11
1111 1100 0000 0000
RCL
12
0001 0000 0111 0100
STORE 116
13
1100 0000 0001 1110
JNC 31
14
0000 0000 0110 1101
LOAD 109
Формування результату старших розрядів
15
0010 0000 0110 1100
ADD 108
16
0001 0000 0110 1101
STORE 109
17
0000 0000 0110 1100
LOAD 108
Підготовка порміжного добутку
18
1111 0010 0000 0000
LSR
19
0001 0000 0110 1100
STORE 108
20
0000 0000 0110 1110
LOAD 110
Зміна параметрів і керування циклом
21
0011 0000 0110 1111
SUB 111
22
0001 0000 0110 1110
STORE 110
23
1000 0000 0001 0111
JNZ 0
24
0000 0000 0110 0100
LOAD 100
Підготовка проміжного добутку
25
0001 0000 0111 0101
STORE 117
26
0000 0000 0110 0101
LOAD 101
Підготовка множника
27
1111 0000 0000 0000
LSL
28
1111 0000 0000 0000
LSL
29
0001 0000 0111 0100
STORE 116
30
0000 0000 0111 0101
LOAD 117
Зсув проміжного добутку
31
1111 1010 0000 0000
ROR
32
0001 0000 0111 0101
STORE 117
33
0000 0000 0111 0100
LOAD 116
Перевірка поточного розряду множника на наявність одиниці
34
1111 1100 0000 0000
RCL
35
0001 0000 0111 0100
STORE 116
36
1100 0000 0011 1001
JNC 42
37
0000 0000 0111 0101
LOAD 117
Формування проміжного добутку з накладанням маски
38
0100 0000 0111 0010
AND 114
39
0001 0000 0110 1100
STORE 108
40
0010 0000 0111 0001
ADD 113
Формування результату молодших розрядів
41
0001 0000 0110 0001
STORE 113
42
0000 0000 0111 0011
LOAD 115
Зміна параметрів маски
43
1111 1010 0000 0000
ROR
44
0001 0000 0111 0011
STORE 115
45
0010 0000 0111 0010
ADD 114
46
0001 0000 0111 0010
STORE 114
47
0000 0000 0111 0000
LOAD 112
Зміна параметрів та керування циклом
48
0011 0000 0110 1111
SUB 111
49
0001 0000 0111 0000
STORE 112
50
1000 0000 0010 1011
JNZ 43
51
0111 1100 0000 0000
HALT
Завершення виконання програми
k – 110 комірка
N – 112 коміркаВисновки: Під час виконання цієї лабораторної роботи я вивчив подання і застосування додатних та від’ємних чисел у арифметиці з фіксованою комою.
Навчився розробляти алгоритми виконання операції віднімання з використанням обернених, доповнювальних і модифікованих кодів.
Навчився розробляти алгоритми виконання операції множення додатних і від’ємних двійкових чисел.