1.3. Подання від’ємних чисел у комп’ютерах
Для виконання операцій обробки інформації у комп’ютерах і системах збереження та передачі даних, її замінюють числами. Позначення різної інформації відповідними числами називають цифровим кодування, а послідовність цифр для позначення певної інформації - її кодом.
Кодуванню числової інформації у комп’ютерах приділяється особлива увага. Це викликано декількома причинами, одна з яких – наявність знаків у числах. Основна проблема полягає у тому, що центральним складовим елементом арифметично-логічного пристрою (АЛП) є суматор, який виконує лише порозрядне додавання двох кодів із врахуванням ваги кожного з розрядів та з організацією міжрозрядних переносів. Знак числа суматор не “розуміє”, його не розрізняє і сприймає знак числа як звичайний двійковий код.
На даний час прийнято, що мінус кодується як одиниця (1), а плюс – як нуль (0).
Для здійснення арифметичних операцій у комп’ютерах були розроблені спеціальні способи кодування і відповідні коди. Найбільш поширеними є прямий, обернений та доповняльний коди. Підкреслимо, що доповняльний та обернений коди використовуються тільки для подання від’ємних двійкових чисел. Додатні числа у цих кодах не міняють свого зображення і подаються як у прямому коді.
Хід виконання роботи
-
Вивчити і записати у звіт призначення логічних операцій AND, OR, NOT і XOR.
Логічна операція AND – кон’юкція або логічне множення. Результат операції буде рівний 1 тільки тоді, коли два біта будуть рівні 1, якщо ж хоча б 1 з бітів дорівнює 0, то і результат буде 0.
Логічна операція OR – диз’юнкція або логічне додавання. Результат операції дорівнює 1, коли хоча б один з бітів дорівнює 1, і 0, коли обидва біта дорівнюють 0.
Логічна операція NOT – заперечення. Результатом операції є інвертування усіх розрядів числа і запис назад до акумулятора, тобто заміна 1 на 0 і 0 на 1. На відміну від інших операцій, ця – безадресна.
Логічна операція XOR – сума за модулем 2. Результат операції дорівнює 1, коли тільки один з бітів дорівнює 1. Якщо бітів більше, ніж 2, то для непарної кількості бітів результат дорівнює 1, а для парної 0. Іншими словами результатом операції є молодший розряд суми.
-
Ввести у симулятор та дослідити у покроковому режимі програму, яка буде виконувати логічні операції І, АБО, Виключне-АБО та НЕ над двома числами. Коди чисел вибрати згідно варіанту, що визначається у 1-й лабораторній роботі, використовуючи всі чотири тетради 16-ти розрядного формату. Наприклад, якщо задане число 1810 = 000100102 , воно записується у вигляді: 00010010 00010010. Виписати результати виконання програми та значення прапорців ознак.
Мій варіант 13. Згідно з умовою 1-ої лабораторної роботи, мої числа: 2010 і 3010.
Спочатку переведемо ці числа у двійкову систему числення:
2010 = 0001 0100 0001 01002;
3010 = 0001 1110 0001 11102.
Заношу перше число у 20-ту комірку, а друге у 21. Пишу програму в інструкціях:
№ комірки пам’яті |
Двійковий код інструкції |
Мнемонічний запис інструкції |
Коментар |
0000 0000 0000 |
0000 0000 0001 0100 |
LOAD 20; |
Завантажити дані 20-ої комірки (число 2010) до Акумулятора |
0000 0000 0001 |
0100 0000 0001 0101 |
AND 21; |
2010 & 3010 |
0000 0000 0010 |
0001 0000 0001 0110 |
STORE 22; |
Записати число в 22 комірку |
0000 0000 0011 |
0000 0000 0001 0100 |
LOAD 20; |
Завантажити дані 20-ої комірки (число 2010) до Акумулятора |
0000 0000 0100 |
0101 0000 0001 0101 |
OR 21; |
2010 | 3010 |
0000 0000 0101 |
0001 0000 0001 0111 |
STORE 23; |
Записати результат операції в 23 комірку |
0000 0000 0110 |
0000 0000 0001 0100 |
LOAD 20; |
завантажити число 2010 до Акумулятора |
0000 0000 0111 |
0110 0000 0001 0101 |
XOR 21; |
2010 3010 |
0000 0000 1000 |
0001 0000 0001 1000 |
STORE 24; |
Записати число в 24 комірку. |
0000 0000 1001 |
0000 0000 0001 0100 |
LOAD 20: |
Завантажити число 2010 до Акумулятора |
0000 0000 1010 |
0111 0000 0000 0000 |
NOT; |
|
0000 0000 1011 |
0001 0000 0001 1001 |
STORE 25; |
Записати число в 25 комірку. |
0000 0000 1100 |
0000 0000 0001 0101 |
LOAD 21; |
Завантажити число 3010 до Акумулятора |
0000 0000 1101 |
0111 0000 0000 0000 |
NOT |
|
0000 0000 1110 |
0001 0000 0001 1010 |
STORE 26; |
Завантажити число в 26 комірку |
0000 0000 1111 |
0111 1100 0000 0000 |
HALT; |
Зупинити програму |
Запускаю програму і досліджую її у покроковому режимі:
|
РА |
РД |
А |
РІ |
ЛАІ |
РО(Z S C) |
1 |
0000 0001 0100 |
0001 0100 0001 0100 |
0001 0100 0001 0100 |
0000 0000 0001 0100 |
0000 0000 0001 |
0 0 0 |
2 |
0000 0001 0101 |
0001 1110 0001 1110 |
0001 0100 0001 0100 |
0100 0000 0001 0101 |
0000 0000 0010 |
0 0 0 |
3 |
0000 0001 0110 |
0001 0100 0001 0100 |
0001 0100 0001 0100 |
0001 0000 0001 0110 |
0000 0000 0011 |
0 0 0 |
4 |
0000 0001 0100 |
0001 0100 0001 0100 |
0001 0100 0001 0100 |
0000 0000 0001 0100 |
0000 0000 0100 |
0 0 0 |
5 |
0000 0001 0101 |
0001 1110 0001 1110 |
0001 1110 0001 1110 |
0101 0000 0001 0101 |
0000 0000 0101 |
0 0 0 |
6 |
0000 0001 0111 |
0001 1110 0001 1110 |
0001 1110 0001 1110 |
0001 0000 0001 0111 |
0000 0000 0110 |
0 0 0 |
7 |
0000 0001 0100 |
0001 0100 0001 0100 |
0000 1101 0000 1101 |
0000 0000 0001 0100 |
0000 0000 0111 |
0 0 0 |
8 |
0000 0001 0101 |
0001 1110 0001 1110 |
0010 1100 0010 1100 |
0110 0000 0001 0101 |
0000 0000 1000 |
0 0 0 |
9 |
0000 0001 1000 |
0000 1010 0000 1010 |
0010 1100 0010 1100 |
0001 0000 0001 1000 |
0000 0000 1001 |
0 0 0 |
10 |
0000 0001 0100 |
0001 0100 0001 0100 |
0001 0100 0001 0100 |
0000 0000 0001 0100 |
0000 0000 1010 |
0 0 0 |
11 |
0000 0000 1010 |
0111 0000 0000 0000 |
1110 1011 1110 1011 |
0111 0000 0000 0000 |
0000 0000 1011 |
0 1 0 |
12 |
0000 0001 1001 |
1110 1011 1110 1011 |
1110 1011 1110 1011 |
0001 0000 0001 1001 |
0000 0000 1100 |
0 1 0 |
13 |
0000 0001 0101 |
0001 1110 0001 1110 |
0001 1110 0001 1110 |
0000 0000 0001 0101 |
0000 0000 1101 |
0 1 0 |
14 |
0000 0000 1101 |
0111 0000 0000 0000 |
1110 0001 1110 0001 |
0111 0000 0000 0000 |
0000 0000 1110 |
0 1 0 |
15 |
0000 0001 1010 |
1110 0001 1110 0001 |
1110 0001 1110 0001 |
0001 0000 0001 1010 |
0000 0000 1111 |
0 1 0 |
16 |
0000 0000 1111 |
1110 0001 1110 0001 |
1110 0001 1110 0001 |
0111 1100 0000 0000 |
0000 0000 1111 |
0 1 0 |
Для кращої наочності узагальнимо результати:
-
Результат операції AND: А: 0001 0100 0001 01002, РО: 0002;
-
Результат операції OR: А: 0001 1110 0001 11102, РО: 0002;
-
Результат операції XOR: А: 0010 1100 0010 11002, РО: 0002;
-
Результат операції NOT для першого числа: А: 1110 1011 1110 10112, РО: 0102;
-
Результат операції NOT для другого числа: А: 1110 0001 1110 00012, РО: 0102.
-
Дослідити у потактовому режимі інструкції AND і XOR - для парних номерів із журналу списку групи, OR та NOT - для непарних номерів із списку групи. Виписати результати виконання програми.
Я варіант 13, тому досліджую інструкції OR та NOT.
1) Дослідження функції OR.
Заношу в Аккумулятор та в комірки пам'яті потрібні мені дані:
А) А Число 0001 0100 0001 01002. (Записую число 2010, використавши всі 4 тетради 16-тирозрядного формату);
Б) Adr.0 0101 0000 0000 00012. (Інструкція OR); записую число 3010, використавши всі 4 тетради 16-ти розрядного формату);
В) Adr.1 Число 0001 1110 0001 11102 (записую число 3010, використавши всі 4 тетради 16-ти розрядного формату);
Г) ЛАІ Adr 0.
Запускаю її у потактовому режимі та досліджую:
№ |
Мнемонічний запис |
Код, що обробляється |
Коментар |
1 |
ЛАІ РА |
0000 0000 0000 |
вибір адреси інструкції і занесення її до Регістра Адреси |
2 |
Пам(РА) РД |
0101 0000 0000 0001 |
вибір коду інструкції з РА і занесення його до Регістра Даних |
3 |
РД РІ |
0101 0000 0000 0001 |
декодування інструкції у Регістрі Інструкцій |
4 |
РІ РА |
0000 0000 0001 |
Передача адреси операнда |
5 |
Пам(РА) РД |
0001 1110 0001 1110 |
вибір коду другого операнда з РА і занесення його до Регістра Даних |
6 |
А | РД А |
0001 1110 0001 1110 |
Виконується інструкція OR і результат записується до А |
7 |
АРО |
000 |
Встановлення прапорців ознак |
8 |
ЛАІ + 1 ЛАІ |
0000 0000 0001 |
підготовка адреси нової інструкції |
2) Дослідження інструкції NOT:
А) А Число 0001 0100 0001 01002. (Записую число 2010, використавши всі 4 тетради 16-ти розрядного формату);
Б) Adr.0 0111 0000 0000 00002. (Інструкція NOT);
В) ЛАІ Adr 0.
№ |
Мнемонічний запис |
Код, що обробляється |
Коментар |
1 |
ЛАІ РА |
0000 0000 0000 |
вибір адреси інструкції і занесення її до Регістра Адреси |
2 |
Пам(РА) РД |
0111 0000 0000 0000 |
вибір коду інструкції з РА і занесення його до Регістра Даних |
3 |
РД РІ |
0111 0000 0000 0000 |
декодування інструкції у Регістрі Інструкцій |
4 |
A |
1110 1011 1110 1011 |
Виконується інструкція NOT і результат записується до Акумулятора |
7 |
АРО |
0 1 0 |
Встановлення прапорців ознак |
8 |
ЛАІ + 1 ЛАІ |
0000 0000 0001 |
підготовка адреси нової інструкції |
-
Розробити алгоритм і написати програму, що для довільного числа "А", яке розміщене у комірці пам"яті з адресою "N", підраховує кількість пар "11" - для непарних номерів із списку групи, і кількість пар "00" - для парних номерів із списку групи.
(Рис.1)Блок-схема алгоритму до завдання 4
Задане число А міститься в 20-тій комірці. Число В – лічильник пар нулів в числі А, міститься в 21-ій комірці. Число k – прапорець для перевірки наявності пар цифр в числі А, міститься в 22-ій комірці, k = 8. В комірці 23 записано число 1.
В комірці 25 записано число 310 (двіковий код цього числа: 00112, тому, використовуючи його, легко дослідити число на пару 00).
Пишу програму:
№і |
Двійковий код інструкції |
Мнемонічний формат інструкції |
Коментар до груп інструкцій, що відповідають блокам алгоритму програми |
1 |
0000 0000 0001 0100 |
LOAD 20 |
Використовую інструкцію AND для того, щоб перевірити, чи дорівнюють два молодші розряди 0 |
2 |
0100 0000 0001 1001 |
AND 25 |
|
3 |
1001 0000 0000 0111 |
JZ 7 |
|
4 |
0011 0000 0000 1110 |
LOAD 21 |
Збільшую змінну лічильника на 1, якщо цифри дорівнюють 0, якщо ні, то цей блок інструкцій не виконується |
5 |
0010 0000 0001 0111 |
ADD 23 |
|
6 |
0001 0000 0001 0101 |
STORE 21 |
|
7 |
0000 0000 0000 1100 |
LOAD 20 |
Подвійний зсув числа вправо для перевірки двох наступних розрядів числа. |
8 |
1111 1110 0000 0000 |
ROR |
|
9 |
1111 1110 0000 0000 |
ROR |
|
10 |
0001 0000 0001 0100 |
STORE 20 |
|
11 |
0000 0000 0001 0110 |
LOAD 22 |
Перевіряю число на наявність неперевірених пар цифр. Якщо ще не всі перевірені, то повертаємось до першого блоку інструкцій. |
12 |
0011 0000 0001 0111 |
SUB 23 |
|
13 |
0001 0000 0001 0110 |
STORE 22 |
|
14 |
1001 0000 0000 0000 |
JZ 1 |
|
15 |
1000 0000 0000 0000 |
LOAD 21 |
Якщо всі пари цифр числа перевірені - завантажити до акумулятора лічильник кількості пар цифр ріних 0. |
16 |
0111 1100 0000 0000 |
HALT |
Зупинка процесора |
-
Розробити алгоритм і написати програму, у якій для числа, яке використовується у пункті 4, виконується інвертування пар "11" - для парних номерів із списку групи і інвертування пар "00" - для непарних номерів із списку групи.
(Рис.2)Загальна блок-схема алгоритму до 5 завдання
Задане число А міститься в 20-тій комірці. Число В – лічильник пар нулів в числі А, міститься в 21-ій комірці. Число k – прапорець для перевірки наявності пар цифр в числі А, міститься в 22-ій комірці, k = 8. В комірці 23 записано число 1.
В комірці 25 записано число 310 (двіковий код цього числа: 00112, тому, використовуючи його, легко дослідити число на пару 00).
Пишу програму:
№і |
Двійковий код інструкції |
Мнемонічний формат інструкції |
Коментар до груп інструкцій, що відповідають блокам алгоритму програми |
1 |
0000 0000 0001 0100 |
LOAD 20 |
Почергово використовую інструкцію AND і SUB для того, щоб перевірити, чи дорівнюють цифри двох молодших розрядів 1. |
2 |
0100 0000 0001 1001 |
AND 25 |
|
3 |
0011 0000 0001 1001 |
SUB 25 |
|
4 |
1001 0000 0000 0111 |
JZ |
|
5 |
0011 0000 0000 1110 |
LOAD 20 |
Якщо цифри дорівнюють одиниці, встановлюю два молодші розряди числа рівними 0. Якщо цифри дорівнюють 0, то цей блок не виконується. |
6 |
0011 0000 0001 1001 |
SUB 25 |
|
7 |
1111 1110 0000 0000 |
ROR |
Встановити старшими розрядами дві наступні цифри числа і записати його в 20 комірку.
|
8 |
1111 1110 0000 0000 |
ROR |
|
9 |
0001 0000 0001 0100 |
STORE 20 |
|
10 |
0000 0000 0001 0110 |
LOAD 22 |
Зменшити лічильник пар цифр в числі на 1 і порівняти його з нулем. Якщо він дорівнює нулю, то в числі всі пари цифр перевірені і наступний блок не виконується. |
11 |
0011 0000 0001 0111 |
SUB 23 |
|
12 |
0001 0000 0001 0110 |
STORE 22 |
|
13 |
1001 0000 0000 0000 |
JZ 1 |
|
14 |
1000 0000 0000 0000 |
LOAD 20 |
Завантаження числа до акумулятора |
15 |
0111 1100 0000 0000 |
HALT |
Зупинка процесора |
-
Розробити алгоритм і написати програму додавання двох від’ємних 16-ти розрядних чисел. Операція виконується у доповняльному коді.
Блок-схема алгоритму:
Пишу програму, занісши дані в 16-ту та 17-ту комірки:
Адр. комірки пам’яті у десятковому коді |
Код інструкції |
Мнемонічний формат інструкції |
Коментарі інструкцій. |
0 |
0000 0000 0001 0000 |
LOAD 16 |
Переведення в доповняльний код 1-го числа |
1 |
0111 0000 0000 0000 |
NOT |
|
2 |
0010 0000 0000 1101 |
ADD 13 |
|
3 |
0001 0000 0001 0000 |
STORE 16 |
|
4 |
0000 0000 0001 0001 |
LOAD 17 |
Переведення в доповняльний код 2-го числа |
5 |
0111 0000 0000 0000 |
NOT |
|
6 |
0010 0000 0000 1101 |
ADD 13 |
|
7 |
0010 0000 0000 1111 |
ADD 16 |
Додавання 2-х чисел |
8 |
0111 0000 0000 0000 |
NOT |
Переведення в прямий код результату. |
9 |
0010 0000 0000 1101 |
ADD 13 |
|
10 |
0001 0000 0000 1111 |
STORE 15 |
|
11 |
0111 1100 0000 0000 |
HALT |
СТОП |
Висновок:
На цій лабораторній роботі я вивчив призначення логічних операцій, навчився створювати і використовувати "фільтри" за допомогою логічних операцій, вивчив правила кодування додатних і від’ємних двійкових чисел для здійснення арифметичних операцій у комп’ютерах. Також я навчився кодувати двійкові числа із знаком у інструкціях навчального
комп’ютера – симулятора DeComp.