Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра СКС
/
ЗВІТ
з лабораторної роботи № 2
з дисципліни «Організація та функціонування комп’ютерів»
на тему: «Набір інструкцій навчального комп’ютера. Загальний порядок виконання інструкцій.»
Тема: «Набір інструкцій навчального комп’ютера. Загальний порядок виконання інструкцій»
Мета:
1. Засвоїти порядок виконання програм у комп’ютері. Ознайомитися з форматом та набором інструкцій симулятора навчальної ЕОМ. Засвоїти формати і способи використання інструкцій звертання до пам’яті та інструкцій арифметичних операцій;
2. Засвоїти призначення регістра ознак процесора;
3. Ознайомитися з потактовим режимом роботи навчального комп’ютера.
4. Засвоїти базовий порядок виконання інструкції навчального комп’ютера та навчитися досліджувати хід виконання окремих інструкцій.
Теоретична частина
Усі інструкції навчального комп’ютера за призначенням можна розділити на такі групи:
1) інструкції звертання до пам’яті (LOAD та STORE);
2) арифметичні інструкції (ADD та SUB);
3) логічні інструкції (AND, OR, XOR та NOT);
4) інструкції вводу/виводу (INPUT та OUTPUT);
5) інструкції керування виконанням програми:
а) інструкція зупинки (HALT);
б) інструкції умовних переходів (JNZ, JZ, JP, JM, JNC та JC);
в) інструкція безумовного переходу (JMP);
6) інструкції зсувів (вліво (Left) та вправо (Right)):
а) інструкції логічного зсуву (LSL та LSR);
б) інструкції арифметичного зсуву (ASL та ASR);
в) інструкції циклічного зсуву (ROL та ROR);
г) інструкції циклічного зсуву через тригер ознаки переносу C (RCL та RCR).
1) LOAD ADR - завантажити (від англ. Load - завантажувати);
машинний код цієї інструкції – 0000 aaaa aaaa aaaa;
виконання – (ADDR) ( Акумулятор.
Ця інструкція здійснює читання 16-розрядного числа з комірки пам’яті, на яку вказує поле адреси ADR, і розміщує його у акумуляторі. Перші найстарші 4 розряди (старша тетрада) містять код операції “завантаження” з пам’яті – 0000, а наступні 12 розрядів – адресу комірки, з якої відбуватиметься читання.
2) STORE ADR - зберегти (від англ. Store - зберігати);
машинний код – 0001 aaaa aaaa aaaa;
виконання – Акумулятор ( (ADDR).
Ця інструкція здійснює протилежну до інструкції LOAD дію, тобто 16-розрядне значення вмісту акумулятора записує у комірку пам’яті, на яку вказує поле адреси ADR. Код операції інструкції “збереження” до пам’яті – 0001, а наступні 12 розрядів – адреса комірки пам’яті.
Якщо нам потрібно у пам’яті перенести число з однієї комірки до іншої, однією командою цього зробити не можна. Потрібно скористатись послідовно двома командами - LOAD та STORE, причому акумулятор буде посередницьким пунктом, через який відбудеться передача.
3) ADD ADR – арифметичне додавання (від англ. Addition -додавання);
машинний код – 0010 aaaa aaaa aaaa;
виконання – Акумулятор + (ADDR) ( Акумулятор.
Ця інструкція виконує додавання вмісту акумулятора і числа з комірки пам’яті, на яку вказує адреса ADR, та записує результат назад до акумулятора. Перші 4 розряди машинного коду містять код операції додавання – 0010, а решта 12 розрядів – адресу у пам’яті 2-го операнда, що буде додаватись. Знову звернемо увагу на центральну позицію акумулятора, який постачає одне з двох чисел для додавання та зберігає результат.
Можна не переживати, що результат знищить одне з 2-х чисел, яке перед виконанням дії додавання було записано з пам’яті до акумулятора, бо воно залишилося у пам’яті за своєю адресою. Проте, якщо операнд був записаний в акумулятор як результат виконання попередньої інструкції і не був збережений у пам’яті, то тоді він пропаде – буде “затертий” новим значенням акумулятора.
4) SUB ADR – віднімання (від англ. Subtraction - віднімання);
машинний код – 0011 aaaa aaaa aaaa;
виконання: Акумулятор – (ADDR) ( Акумулятор.
Ця інструкція виконує віднімання від вмісту акумулятора значення вмісту комірки пам’яті з адресою, що вказана у полі ADR, і записує результат назад до акумулятора. Код операції віднімання – 0011, а решту 12 розрядів займає адреса комірки, вміст якої буде відніматися. Інші властивості цієї інструкції співпадають із властивостями інструкції додавання ADD.
Призначення Регістру Ознак
Відповідно до обмежень, які закладені у архітектурі любого комп’ютера, у тому числі і нашого навчального – симулятора DeComp, результат виконання арифметичних і більшості інших інструкцій необхідно аналізувати для визначення його певних особливостей. Що саме:
- потрібно відрізняти додатні і від’ємні числа;
- потрібно визначати стан, коли результат виконання інструкції дорівнює нулю;
- потрібно визначати переповнення розрядної сітки акумулятора.
Для фіксації цих станів існує регістр ознак у процесорі, який має три тригери: Z, S i C. На панелі навчального комп’ютера він розміщений біля акумулятора.
Прапорець Z (Zero - нуль) встановлюється у 1 (світиться), якщо результат операції дорівнює 0. Зрозуміло, що для команди ADD ця ознака встановиться лише у випадку, якщо до 0 додати 0, або якщо додаються два однакових числа з протилежними знаками.
Прапорець S (Sign - знак) встановлюється в 1, якщо результат операції – від’ємне число. Знову ж таки, інструкція ADD не може дати від’ємного результату за винятком чисел у доповняльному коді, яких ми поки-що не розглядаємо. Зрозуміло, якщо віднімати від меншого числа більше інструкцією SUB, отримаємо ознаку від’ємного результату S.
Прапорець C (Carry - перенос) встановлюється в 1, коли у результаті арифметичної операції (додавання чи віднімання) виникає перенос із старшого розряду результату або при виконанні операції зсуву вправо чи вліво крайній розряд числа вийшов за межі розрядної сітки. Так, наприклад, перенос виникне і, відповідно, встановиться тригер C, якщо додати два 16-ти розрядних числа у 16-ти розрядному процесорі:
- результат – 17-ти розрядне число.
Відслідковувати виникнення переносу (ознака – C) або від’ємного результату (ознака – S) повинен сам програміст і це дуже важлива задача, оскільки є головною умовою отримання коректного, правильного результату. Адже, наприклад, у розглянутому прикладі, якщо не врахувати виникнення переносу, отримаємо: 22 375 + 47 733 = 4 572 (замість 70 108). Які дії треба виконувати для корекції помилкових результатів – це питання буде розглядатися при вивченні алгоритмів виконання арифметичних операцій у наступних роботах.
Деколи різні ознаки результату можуть з’являтися одночасно. Які ознаки встановлюються і якою інструкцією подано на рис. 2.3. Наприклад, інструкція віднімання SUB може встановлювати усі три ознаки: Z, S та C. Насправді, операція віднімання здійснюється з використанням доповняльного коду, з яким ми познайомимось трохи пізніше.
Хід роботи
1. Ознайомитись з теоретичними відомостями до лабораторної роботи № 2.
2. Описати призначення прапорців Регістру Ознак;
Прапорець Z (Zero - нуль) встановлюється у 1 (світиться), якщо результат операції дорівнює 0. Код регістру з активним прапорцем Z: 100.
Прапорець S (Sign - знак) встановлюється в 1, якщо результат операції – від’ємне число. Код регістру з активним прапорцем S: 010.
Прапорець C (Carry - перенос) встановлюється в 1, коли у результаті арифметичної операції (додавання чи віднімання) виникає перенос із старшого розряду результату або при виконанні операції зсуву вправо чи вліво крайній розряд числа вийшов за межі розрядної сітки. Код регістру з активним прапорцем C: 001.
3. Ввести у симулятор і виконати дослідження у потактовому режимі програми додавання двох чисел, яка була підготована у роботі № 1. Записати результати – мікропрограму виконання з необхідними поясненнями.
№
Мнемонічний запис
Код, що обробляється
Коментар
1
ЛАІ ( РА
0000 0000 0000
вибір адреси 1-ої інструкції і занесення її до Регістра Адреси
2
РА ( РД
0000 0000 0000 1010
вибір коду інструкції з РА і занесення його до Регістра Даних
3
РД ( РІ
0000 0000 0000 1010
декодування інструкції у Регістрі Інструкцій
4
РІ ( РА
0000 0000 1010
вибір адреси 1-го операнда
5
РА ( РД
0000 0000 0001 1001
вибір коду 1-го операнда з пам’яті і запис його до Регістру Даних
6
РД ( А
0000 0000 0001 1001
запис коду до акумулятора
7
ЛАІ + 1 ( ЛАІ
0000 0000 0001
підготовка адреси нової інструкції
8
ЛАІ ( РА
0000 0000 0001
вибір адреси 2-ої інструкції і занесення її до Регістра Адреси
9
РА ( РД
0010 0000 0000 1011
вибір коду інструкції з РА і занесення його до Регістра Даних
10
РД ( РІ
0010 0000 0000 1011
декодування інструкції у Регістрі Інструкцій
11
РІ ( РА
0000 0000 1011
вибір адреси 2-го операнда
12
РА ( РД
0000 0000 0010 0010
вибір коду 2-го операнда з пам’яті і запис його до Регістру Даних
13
A+РД ( А
0000 0000 0011 1011
виконання операції додавання
14
А ( РО
000
перевірка ознак
15
ЛАІ + 1 ( ЛАІ
0000 0000 0010
підготовка адреси нової інструкції
16
ЛАІ ( РА
0000 0000 0010
вибір адреси 3-ої інструкції і занесення її до Регістра Адреси
17
РА ( РД
0010 0000 0000 1100
вибір коду інструкції з РА і занесення його до Регістра Даних
18
РД ( РІ
0010 0000 0000 1100
декодування інструкції у Регістрі Інструкцій
19
РІ ( РА
0000 0000 1100
вибір адреси 3-го операнда
20
РА ( РД
0000 0000 0000 1001
вибір коду 3-го операнда з пам’яті і запис його до Регістру Даних
21
РД ( А
0000 0000 0100 0100
запис коду до акумулятора
22
А ( РО
000
перевірка ознак
23
ЛАІ + 1 ( ЛАІ
0000 0000 0011
підготовка адреси нової інструкції
24
ЛАІ ( РА
0000 0000 0011
вибір адреси 4-ої інструкції і занесення її до Регістра Адреси
25
РА ( РД
011 11100 0000 0000
вибір коду інструкції з РА і занесення його до Регістра Даних
4. Ввести у симулятор та виконати дослідження у покроковому режимі програми, яка відніматиме два числа А і В для значень, коли А = В, А > В і А < В, вибравши довільні відповідні значення. Виписати результати виконання дослідження і значення прапорців ознак у таблицю, взірець якої поданий у роботі № 1. Поясніть отримані результати.
Мнемонічний
код інструкції
Дія, яку виконує інструкція
LOAD 10
завантажити (прочитати) значення числа з 10-ї комірки пам’яті до
акумулятора;
SUB 11
Відняти від числа в акумуляторі значення числа з 11-ї комірки пам’яті і
результат зберегти в акумуляторі;
STORE 12
зберегти (записати) значення числа з акумулятора до 12-ї комірки пам’яті;
HALT
зупинити роботу процесора.
1. Значення регістрів при А = В (А = В=25).
крок
РА
РД
А
РІ
ЛАІ
РО
1-й
0000 0000 1010
0000 0000 0001 1001
0000 0000 0001 1001
0000 0000 0000 1010
0000 0000 0001
000
2-й
0000 0000 1011
0000 0000 0001 1001
0000 0000 0000 0000
0011 0000 0000 1011
0000 0000 0010
100
3-й
0000 0000 1100
0000 0000 000 0000
0000 0000 0000 0000
0001 0000 0000 1100
0000 0000 0011
100
4-й
0000 0000 0011
0111 1100 0000 0000
0000 0000 0000 0000
0111 1100 0000 0000
0000 0000 0011
100
Програма, виконавши 2 крок, записала до РО 100. Це означає, що встановився прапорець в ознаці Z, тобто значення після виконання арифметичної операції дорівнює нулю.
2. Значення регістрів при А> В (34>25).
крок
РА
РД
А
РІ
ЛАІ
РО
1-й
0000 0000 1010
0000 0000 0010 0010
0000 0000 0010 0010
0000 0000 0000 1010
0000 0000 0001
000
2-й
0000 0000 1011
0000 0000 0001 1001
0000 0000 0000 1001
0011 0000 0000 1011
0000 0000 0010
000
3-й
0000 0000 1100
0000 0000 000 1001
0000 0000 0000 1001
0001 0000 0000 1100
0000 0000 0011
000
4-й
0000 0000 0011
0111 1100 0000 0000
0000 0000 0000 1001
0111 1100 0000 0000
0000 0000 0011
000
Після виконання кожної інструкції в РО був записаний код 000. Тобто, після віднімання не один з прапорців не був активний так, як при відніманні меншого числа від більшого в будь-якому випадку отримаємо число більше нуля.
3. Значення регістрів при А< В (25<34).
крок
РА
РД
А
РІ
ЛАІ
РО
1-й
0000 0000 1010
0000 0000 0001 1001
0000 0000 0001 1001
0000 0000 0000 1010
0000 0000 0001
000
2-й
0000 0000 1011
0000 0000 0010 0010
1111 1111 1111 0111
0011 0000 0000 1011
0000 0000 0010
011
3-й
0000 0000 1100
1111 1111 1111 0111
1111 1111 1111 0111
0001 0000 0000 1100
0000 0000 0011
011
4-й
0000 0000 0011
0111 1100 0000 0000
1111 1111 1111 0111
0111 1100 0000 0000
0000 0000 0011
011
В даному випадку засвітилися жовтим кольором прапорці S і C. S означає, що результатом є від’ємне число. С означає, що результат вийшов за межі розрядної сітки, тобто виник перенос із старшого розряду результату і крайній розряд числа вийшов за межі розрядної сітки. Оскільки число є від’ємним, то його значення у А та РД записане у доповняльному коді 1111 1111 1111 0111.
5. Ввести у симулятор та виконати дослідження у потактовому режимі 3-х окремих інструкції – LOAD, STORE i SUB. Пояснити необхідну підготовку числових даних, виписати порядок виконання інструкцій у вигляді мікропрограм із вказуванням реальних значень регістрів і поясненням дій, що виконуються у кожному такті.
Інструкція LOAD.
Машинний код цієї інструкції – 0000 аааа аааа аааа.
Виконання – (ADDR) ( Акумулятор.
аааа аааа аааа – адреса комірки, з якої відбувається читання.
Заніс значення 1510=11112 до 1-ї комірки. В 0-ву комірку заношу інструкцію LOAD1 (0000 0000 0000 0001). Онулив ЛАІ і запустив програму в потактовому режимі, а результати записав в таблицю.
№
Мнемонічний запис
Код, що обробляється
Коментар
1
ЛАІ ( РА
0000 0000 0000
вибір адреси 1-ої інструкції і занесення її до Регістра Адреси
2
РА ( РД
0000 0000 0000 0001
вибір коду інструкції з РА і занесення його до Регістра Даних
3
РД ( РІ
0000 0000 0000 0001
декодування інструкції у Регістрі Інструкцій
4
РІ ( РА
0000 0000 0001
вибір адреси 1-го операнда
5
РА ( РД
0000 0000 0000 1111
вибір коду 1-го операнда з пам’яті і запис його до Регістру Даних
6
РД ( А
0000 0000 0000 1111
виконання операції запису коду до акумулятора
7
ЛАІ + 1 ( ЛАІ
0000 0000 0001
підготовка адреси нової інструкції
Інструкція STORE.
Машинний код цієї інструкції – 0001 аааа аааа аааа.
Виконання – Акумулятор ((ADDR).
аааа аааа аааа – адреса комірки пам’яті.
В 0-ву комірку заніс інструкцію 0001 0000 0000 0001, записав число 1510=11112 в акумулятор. Онулив ЛАІ і запустив програму в потактовому режимі.
№
Мнемонічний запис
Код, що обробляється
Коментар
1
ЛАІ ( РА
0000 0000 0000
вибір адреси 1-ої інструкції і занесення її до Регістра Адреси
2
РА ( РД
0001 0000 0000 0001
вибір коду інструкції з РА і занесення його до Регістра Даних
3
РД ( РІ
0001 0000 0000 0001
декодування інструкції у Регістрі Інструкцій
4
РІ ( РА
0000 0000 0001
вибір адреси 1-го операнда
5
А ( РД
0000 0000 0000 1111
Запис коду з акумулятора до Регістру Даних
6
РД ( РА
0000 0000 0000 0001
вибір коду інструкції з РД і занесення його до Регістра Адреси
7
ЛАІ + 1 ( ЛАІ
0000 0000 0001
підготовка адреси нової інструкції
Інструкція SUB.
Машинний код цієї інструкції – 0011 аааа аааа аааа.
Виконання – (ADDR) ( Акумулятор.
аааа аааа аааа – адреса комірки, вміст якої буде відніматися від значення в акумуяторі.
Записав в 1-шу комірку число 15 (0000 0000 0000 1111), а в нульову комірку код інструкції
0011 0000 0000 1001. Записавши в акумулятор число 14 (0000 0000 0000 1110), Онулив ЛАІ і запустив програму в потактовому режимі.
№
Мнемонічний запис
Код, що обробляється
Коментар
1
ЛАІ ( РА
0000 0000 0000
вибір адреси 1-ої інструкції і занесення її до Регістра Адреси
2
РА ( РД
0011 0000 0000 0001
вибір коду інструкції з РА і занесення його до Регістра Даних
3
РД ( РІ
0011 0000 0000 0001
декодування інструкції у Регістрі Інструкцій
4
РІ ( РА
0000 0000 0001
вибір адреси 1-го операнда
5
РА ( РД
0000 0000 0000 1111
Запис коду з акумулятора до Регістру Даних
6
РД ( А
1111 1111 1111 1111
вибір коду інструкції з РД і занесення його до Регістра Адреси
7
ZSC(А) ( РО
011
встановлення прапорців регістру ознак
8
ЛАІ + 1 ( ЛАІ
0000 0000 0001
підготовка адреси нової інструкції
Висновок: я ознайомився з набором інструкцій навчального комп’ютера та загальним порядком виконання інструкцій.