Міністерство освіти та науки України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Методичні вказівки
до лабораторної роботи № 2
з дисципліни “Організація та функціонування комп’ютерів”
на тему: “Набір інструкцій навчального комп’ютера.
Загальний порядок виконання інструкцій.”
Укладач:
ст.викл. Кудрявцев О.Т.
Львів
2006
Лабораторна робота №2
Тема: Набір інструкцій навчального комп’ютера. Загальний порядок виконання інструкцій.
Мета: 1. Засвоїти порядок виконання програм у комп’ютері. Ознайомитися з форматом та набором інструкцій симулятора навчальної ЕОМ;
2. Засвоїти призначення регістру ознак процесора;
3. Ознайомитися з режимами роботи навчального комп’ютера. Засвоїти базовий порядок виконання інструкції навчального комп’ютера та навчитися досліджувати хід виконання окремих інструкцій.
1. Теоретичні відомості
У попередній лабораторній роботі №1 ми ознайомились із набором і форматом інструкцій симулятора навчального комп’ютера. (Рис.1.1.)
Рис.1.1. Набір інструкцій навчального комп’ютера – симулятора DeComp.
Як відомо, комп’ютер складається з п’яти головних, функціонально незалежних частин, що зображені на рисунку 1.2.
Пристрій Арифметико-
вводу логічний
пристрій
Пристрій Пам’ять Пристрій
виводу керування
Пристрій Процесор
вводу-виводу
Рис. 1.2. Основні функціональні пристрої комп’ютера
Це такі пристрої: пристрій вводу, пристрій виводу, пристрій пам’яті, арифметико-логічний пристрій і пристрій керування. У цілому, функціонування любого комп’ютера можна описати наступним шляхом:
Комп’ютер за допомогою блоку вводу приймає інформацію у вигляді програм і даних і записує її до пам’яті;
Інформація, яка зберігається у пам’яті, під керуванням програми пересилається до арифметтико-логічного пристрою для подальшої обробки;
Дані, які отримані у результаті обробки інформації, направляються у пристрій виводу;
За усі дії, що виконуються всередині машини, відповідає блок керування.
Отже, діями комп’ютера керують інструкції (команди), з яких складається програма обчислення даної задачі.
Перш ніж ми почнемо більш детально розглядати інструкції навчального комп’ютера симулятора DeComp, нагадаємо собі з 1-ї лабораторної роботи принципи його роботи:
Усі операції та обчислення здійснює процесор;
Яку саме дію буде виконувати процесор, визначає інструкція, що розташована у Регістрі Інструкцій;
Послідовність дій процесора визначають інструкції, які розташовані у пам’яті;
Процесору достатньо знати лише адресу першої інструкції (решту він сам знайде);
Усі адреси інструкцій повинні розташовуватись строго одна після одної, крім інструкцій переходів, у яких адресу визначає програміст згідно алгоритму виконання програми. Саме це дозволяє процесору знаходити решту інструкцій автоматично.
Окрім інструкцій у пам’яті повинні знаходитись данні (числа, інакше - операнди), які і будуть оброблятись процесором.
Адресу даних, які повинні оброблятись, вказує поле адреси у інструкції;
Для виконання конкретної задачі у пам’ять записується відповідна програма, яка складається із множини інструкцій. Інструкції по черзі пересилаються з пам’яті у процесор, який їх виконує. У відповідності до розглянутих принципів процесор працює наступним чином:
за вказаною адресою зчитує першу інструкцію;
виконує дії, вказані у цій інструкції;
збільшує вказану адресу на 1 і переходить до виконання нової, наступної інструкції і т.п.
Усі інструкції у навчальному комп’ютері можна розділяти за такими напрямками:
За форматом коду інструкції;
За призначенням.
Перший поділ ми розглянули у роботі № 1. Нагадаємо: інструкції є адресні та безадресні. Безадресні інструкції або взагалі не використовують будь-які операнди (це числа, що використовуються у якості даних), як, наприклад, інструкції HALT або інструкції зсувів. Або у таких інструкціях однозначно відомо, звідки брати операнди для операції: наприклад, інструкція NOT однозначно працює з акумулятором (інвертує його); так само роблять усі інструкції зсувів (LSL, ASR, ROR та інші); а от інструкції INPUT та OUTPUT працюють не лише з акумулятором, але й з портами вводу (INPUT) та виводу (OUTPUT).
Відповідно адресні інструкції для виконання своєї операції потребують операнда, в якості якого може бути вміст будь-якої з 4096 комірок пам’яті. Отже, окрім коду операції, який займає найстарші 4 розряду машинного коду інструкції (від 15-го до 12-го ), решту розрядів займає 12-розрядна адреса комірки пам’яті, значення вмісту якої стане операндом і буде оброблятись у даній інструкції.
Усі інструкції навчального комп’ютера за призначенням можна розділити на наступні групи:
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.1. Інструкції звертання до пам’яті:
1). LOAD ADR - завантажити (від англ. Load - завантажувати). Дивимся у рис. 1.1.:
машинний код – 0000 aaaa aaaa aaaa; виконання – (ADDR) Акумулятор.
Ця інструкція здійснює читання 16-розрядного числа з комірки пам’яті, на яку вказує поле адреси ADR, і розміщує його у акумуляторі. Перші найстарші 4 розряди (старша тетрада) містять код операції “завантаження” з пам’яті – 0000, а наступні 12 розрядів – адресу комірки, з якої відбуватиметься читання. Наприклад, для того, щоб прочитати число з 15-ї або 2041-ої комірки пам’яті і записати його до акумулятора, необхідно використати :
Таблиця 1.1.
2). STORE ADR - зберегти (від англ. Store - зберігати)
Машинний код – 0001 aaaa aaaa aaaa; виконання – Акумулятор (ADDR)).
Ця інструкція здійснює протилежну до інструкції LOAD дію, тобто 16-розрядне значення вмісту акумулятора записує у комірку пам’яті, на яку вказує поле адреси ADR. Код операції інструкції “збереження” до пам’яті – 0001, а наступні 12 розрядів – адреса комірки пам’яті. Наприклад, щоб записати значення вмісту акумулятора до 148-ї або 2043 комірки, необхідно використати наступні машинні коди:
Таблиця 1.2.
Якщо нам потрібно у пам’яті перенести число з однієї комірки до іншої, однією командою цього зробити не можна. Потрібно скористатись послідовно двома командами - LOAD та STORE, причому акумулятор буде посередницьким пунктом через який відбудеться передача.
Так, програма з двох інструкцій:
LOAD 28
STORE 56
виконує переміщення 16-розрядного числа, яке знаходилось у 28-й комірці пам’яті, до 56-ї комірки. Відзначимо, що інструкція читання (завантаження) LOAD не знищує числа у 28-ій комірці. Після виконання у цій програмі інструкції запису (збереження) STORE, код числа з 28-ої комірки пам’яті буде скопійований до 56-ої комірки, а у акумуляторі залишиться те саме 16-розрядне число з 28-ї комірки.
Відповідно цим двом інструкціям відповідатиме наступний машинний код:
0000 0000 0001 1100
0001 0000 0011 1000.
Наступна група інструкцій – це:
1.2. Інструкції арифметичних операцій:
1). ADD ADR – арифметичне додавання (від англ. Addition -додавання)
Машинний код – 0010 aaaa aaaa aaaa; виконання – Акумулятор + (ADDR) Акумулятор.
Ця інструкція виконує додавання вмісту акумулятора і числа з комірки пам’яті, на яку вказує адреса ADR, та записує результат назад до акумулятора. Перші 4 розряди машинного коду містять код операції додавання – 0010, а решта 12 розрядів – адресу у пам’яті 2-го операнда, що буде додаватись. Знову звернемо увагу на центральну позицію акумулятора, який постачає одне з двох чисел для додавання та зберігає результат.
Можна не переживати, що результат знищить одне з 2-х чисел, якщо перш ніж додаватись число зчитується до акумулятора з пам’яті. Але якщо один з операндів попадає у аккумулятор як результат виконання попередніх інструкцій і не був збережений у пам’яті, тоді він пропадає – буде “затертий” новим значенням акумулятора.
Нехай нам потрібно додати 3 числа, які знаходяться у 21-й, 22-й та 23-й комірках пам’яті, а результат необхідно зберегти до 25-ї комірки. Відповідна програма у мнемонічних кодах матиме вигляд:
LOAD 21 - зчитування 1-го операнда з пам’яті до акумулятора;
ADD 22 – додавання вмісту акумулятора (числа з 21-ої комірки) і вмісту 22-ої комірки
пам’яті. Тепер у акумуляторі знаходиться перший проміжний доданок;
ADD 23 – додавання першого проміжного доданку, що знаходиться у акумуляторі, з
вмістом 23-ої комірки пам’яті. Тепер у акумуляторі – другий проміжний
доданок – результат додавання трьох чисел;
STORE 25 – збереження результату у 25-й комірці пам’яті. Числовий код результату
копіюється до 25-ї комірки і він же залишається у акумуляторі.
У машинних кодах ця програма матиме наступний вигляд:
0000 0000 0001 0101
0010 0000 0001 0110
0010 0000 0001 0111
0001 0000 0001 1001.
2). SUB ADR – віднімання (від англ. Subtraction - віднімання).
Машинний код – 0011 aaaa aaaa aaaa; виконання: Акумулятор – (ADDR) Акумулятор.
Ця інструкція виконує віднімання від вмісту акумулятора значення вмісту комірки пам’яті з адресою, що вказана у полі ADR, і записує результат назад до акумулятора. Код операції віднімання – 0011, а решту 12 розрядів займає адреса комірки, вміст якої буде відніматися.
Інші групи інструкцій будуть розглянуті у наступних лабораторних роботах.
1.3. Призначення Регістру Ознак
Відповідно до обмежень, які закладені у архитектурі любого комп’ютера, у тому числі і нашого навчального – симулятора DeComp, результат виконання арифметичних і більшості інших інструкцій необхідно аналізувати для визначення його певних особливостей. Що саме:
- потрібно відрізняти додатні і від’ємні числа;
- потрібно визначати стан, коли результат виконання інструкції дорівнює нулю;
- потрібно визначати переповнення розрядної сітки акумулятора.
Для визначення таких станів існує регістр ознак у процесорі, який має три тригери: Z, S i C. На панелі навчального комп’ютера він розміщений біля акумулятора.
Нагадаємо, що прапорець Z (Zero - нуль) встановлюється у 1 (світиться), якщо результат операції дорівнює 0. Зрозуміло, що для команди ADD ця ознака встановиться лише у випадку, якщо до 0 додати 0, або якщо додаються два однакових числа з протилежними знаками.
Прапорець S (Sign - знак) встановлюється в 1, якщо результат операції – від’ємне число. Знову ж таки, інструкція ADD не може дати від’много результату за винятком чисел у доповняльному коді, яких ми поки що не розглядаємо. Зрозуміло, якщо віднімати від меншого числа більше інструкцією SUB, отримаємо ознаку від’ємного результату S.
І, нарешті, прапорець C (Carry - переніс) встановлюється в 1, коли у результаті арифметичної операції (додавання чи віднімання) виникає перенос із старшого розряду результату. Так, наприклад, переніс виникне і, відповідно, встановиться тригер C, якщо додати два 16-ти розрядних числа у 16-ти розрядному процесорі:
EMBED Equation.3 - результат – 17-ти розрядне число.
Відслідковувати виникнення переносу (ознака – C) або від’ємного результату (ознака – S) повинен сам програміст і це дуже важлива задача, оскільки є головною умовою отримання коректного, правильного результату. Адже, наприклад, у розглянутому прикладі, якщо не врахувати виникнення переносу, отримаємо: 22 375 + 47 733 = 4 572 (замість 70 108). Які дії треба виконувати для корекції помилкових результатів – це питання буде розглядатися при вивченні алгоритмів виконання арифметичних операцій у наступних роботах.
Деколи ці ознаки можуть з’являтися одночасно. Які ознаки встановлюються і якою інструкцією подано на рис. 1.1. Наприклад, інструкція віднімання SUB може встановлювати усі три ознаки: Z, S та C. Насправді операція віднімання здійснюється з використанням доповняльного коду, з яким ми познайомимось трохи пізніше
Для дослідження алгоритмів та виконання програм за окремими інструкціями існує покроковий режим роботи навчального комп’ютера.
Розглянемо,
1.4. Як у процесорі навчального комп’ютера виконуються інструкції.
Загальний принцип виконання однієї інструкції ми вже знаємо: спочатку її необхідно прочитати з пам’яті, а потім, у залежності від коду операції, виконати ті або інші необхідні дії. Це і є найбільш спрощений порядок виконання інструкції:
вибірка інструкції (fetch – вибір, виклик). ;
виконання інструкції (execution –виконання).
Оскільки більшість інструкцій призначені для виконання різних (арифметичних чи логічних, та ін.) операцій, для яких необхідні вхідні числа, а також збереження результату, для більшості процесорів комп’ютерів стандартним є наступний, більш детальний порядок виконання інструкціїй:
вибірка інструкції;
декодування (розпізнавання) інструкції;
вибірка (читання) операндів;
виконання операції (арифметичної, логічної чи якоїсь інакшої);
збереження (запис) результату.
У порівнянні із попереднім, простішим порядком виконання інструкції, у детальнішому порядку етап вибірки інструкції розділився на 2 частини: вибірку та декодування (розпізнавання) інструкції. Дійсно, етап декодування є надзвичайно важливим: він фактично є функціює пристрою керування, який повинен розпізнати (декодувати) інструкцію по її коду операції, а також згенерувати послідовність керуючих сигналів, які спричинять виконання усіх наступних етапів. Також 2-й етап – виконання інструкції – розділився на 3 частини: вибірку операндів, виконання операції та збереження результату. При цьому, під читанням та записом маються на увазі операції звертання до пам’яті.
Але насправді виконання інструкції складається з ще більшої кількості етапів.
Для дослідження порядку виконання окремих інструкцій у процесорі призначений 3-й режим роботи навчального комп’ютера – потактовий.
Розглянемо порядок виконання інструкції додавання (ADD) за допомогою потактового режиму роботи навчального комп’ютера. Для цього спочатку за допомогою пульта управління занесемо до 0-ї комірки пам’яті машинний код інструкції ADD 01 - 0010 0000 0000 0001, до 1-ї комірки – число 15 (двійковий код = 0000 0000 0000 1111), а до акумулятора число 240 (двійковий код = 0000 0000 1111 0000). У результаті виконання цієї інструкції у акумуляторі ми повинні отримати суму 15 + 240 – число 255 (0000 0000 1111 1111). Фактично нами складена програма додавання двох чисел, з яких одно знаходиться у комірці пам’яті з адресою 0000 0000 0001, а друге – у акумуляторі.
Для початку виконання інструкції до ЛАІ - лічильника адреси інструкцій - занесемо адресу розміщення інструкції ADD 01 - 0000 0000 0000, а також виберемо потактовий режим роботи симулятора (біля кнопки ПУСК).
Тепер, натискаючи кнопку ПУСК ми можемо такт за тактом відслідковувати процес проходження інформації по регістрах процесора від початку до закінчення виконання інструкції. Під час здійснення аналізу на панелі процесора синім кольором позначатиметься джерело інформації (вихідний пристрій), а білим – місце призначення (кінцевий пристрій).
Відзначимо, що швидкість виконання одного кроку можна змінювати. Для цього необхідно у самому верху панелі, під синьою стрічкою заголовку вікна програми симулятора, вибрати пункт меню Режими, а у ньому – команду Тривалість підсвітки... У віконечку, що з’явиться, можна вибрати одне із значень затримки від 200 до 4000 мс. Стандартним значенням, яке автоматично встановлюється при запуску симулятора, є 800 мс.
1-й крок. Натиснемо кнопку ПУСК. У результаті спочатку синім кольором засвітиться лічильник адреси інструкції (ЛАІ), а потім білим – регістр адреси пам’яті (РА) і значення ЛАІ опиниться у РА, тобто код розміщення нашої першої (і єдиної) інструкції - 0000 0000 0000. Дійсно, перш ніж прочитати інструкцію з пам’яті, необхідно до РА занести її адресу. Оскільки за адресами інструкцій слідкує ЛАІ, то саме з нього ми беремо потрібну нам адресу. ЛАІ РА.
2-й крок. Ще раз натиснемо кнопку ПУСК (Далі ця дія повторюється при виконанні кожного кроку). Тепер синім кольором засвітиться вікно пам’яті, а білим – регістр даних пам’яті (РД), тобто значення (вміст) виділеної комірки пам’яті (на яку вказує РА) зчитується і записується до РД – у нашому випадку - 0010 0000 0000 0001. Зараз машинний код інструкції вже прочитаний з пам’яті, але поки що знаходиться у регістрі даних. ПамРА РД.
3-й крок: Синій – РД, білий – регістр інструкції (РІ), тобто ми переносимо машинний код інструкції з РД до спеціального регістра – РІ. Саме з нього процесор може декодувати інструкцію, що і відбувається на цьому ж 3-му кроці. З точки демонстрації дія декодування абсолютно непомітна – це внутрішній процес пристрою управління, але після нього процесор вже точно знає, які саме дії необхідно виконувати саме у цій інструкції. РД РІ.
4-й крок. Оскільки команда додавання ADD використовує один з операндів, який знаходиться у пам’яті, тому на 4-му кроці значення адреси операнда (тобто 0000 0000 0001) з регістру інструкцій РІ заноситься до РА: АДР (РІ) РА.
5-й крок. Операнд (тобто, двійковий код числа 1510 - 0000 0000 0000 1111) зчитується з пам’яті і записується до РД: Пам(РА) РД.
6-й крок. Тепер ми маємо обидва операнди: один попередньо занесений у акумуляторі (0000 0000 1111 0000), а другий – у РД. Відповідно, на 6-му кроці виконується операція додавання і результат записується до акумулятора (0000 0000 1111 1111): РД + А А.
Відзначимо, що виконання будь-якого етапу закінчується операцією запису якогось проміжного результату до одного з регістрів процесора або пам’яті. Так, сама операція додавання не потребує запису – вона є “наскрізною”: будь-яка зміна чисел (операндів) на входах АЛП призводить до майже миттєвої зміни на його виході. А от запис результату до акумулятора і визначає закінчення 6-го кроку.
7-й крок. Оскільки операція додавання є арифметичною, тому вона впливає на усі 3 прапорці регістру ознак (РО). Внутрішні схеми процесора аналізують у акумуляторі результат виконання операції (у нас – додавання) і включають, при необхідності, відповідний прапорець: Z, S, C (A) РО. Хоча у нашому випадку жодна з ознак не змінюється.
8-й крок. На цьому виконання нашої інструкції ADD можна вважати закінченим. Залишився один маленький крок, хоча й надзвичайно важливий: підготувати адресу наступної інструкції. Якщо цього не зробити, процесор знову і знову виконуватиме ту ж саму інструкцію ADD. Отже: ЛАІ + 1 ЛАІ. У нашому випадку наступною інструкцією виявиться наше число 1510 = (0000 0000 0000 1111)2 у наступній комірці 0000 0000 0001, але оскільки наша програма складається лише з однієї інструкції, то усе добре. Правильніше було б наш операнд записати до комірки, яка гарантовано не попадає у зону адрес роботи програми.
Отже, виконання інструкції ADD зайняло 8 кроків. У скороченому вигляді мікрокоманди виконання інструкції ADD можна було б представити у наступному вигляді:
ЛАІ РА - (0000 0000 0000) - вибір адреси інструкції;
Пам(РА) РД - (0010 0000 0000 0001)- вибір коду інструкції;
РД РІ, - (0010 0000 0000 0001) - декодування інструкції;
Адр(РІ) РА - (0000 0000 0001) - вибір адреси 1-го операнду;
Пам(РА) РД - (0000 0000 0000 1111)- вибір коду 1-го операнду;
А + РД А - (0000 0000 1111 1111) – виконання інструкції (2-й операнд – у
акумуляторі);
ZSC(А) РО - (000) - встановлення прапорців регістру ознак;
ЛАІ + 1 ЛАІ - (0000 0000 0001) - підготовка адреси нової інструкції.
Такий запис мікрокроків – мікрокоманд виконання інструкції називають мікропрограмою виконання інструкції (у дужках наведено фактичні значення, які записуються у регістри процесора для нашої інструкції ADD 01).
Один крок виконання інструкції – це 1 такт роботи процесора. Якщо б тактова частота процесора дорівнювала 1ГГц, тоді виконання нашої інструкції зайняло б 8 нс (810-9 сек!). Але це частота сучасного процесора, комп’ютери ж 1-го покоління могли працювати на тактовій частоті 50 КГц. В цьому випадку наша інструкція виконалася б аж за 160 мкс (1,6 10-4 сек), хоча і це набагато швидше, ніж могла би порахувати людина.
2. Порядок виконання роботи
Ознайомитись з теоретичними відомостями до лабораторної роботи №2.
Дати визначення призначення прапорців регістру ознак;
Ввести у симулятор і виконати у покроковому режимі програму додавання двох чисел, яка була підготована у роботі № 1. Записати результати.
Ввести у симулятор та виконати у покроковому режимі програму, яка відніматиме два числа А і В для значень, коли А = В, А > В і А < В (значення чисел вибрати самостійно в межах від 20 до 100). Виписати результати виконання та значення прапорців ознак.
Ввести у симулятор та виконати у потактовому режимі 3 команди – LOAD, STORE i SUB, виписати порядок їх виконання у вигляді мікропрограми із вказанням реальних значень регістрів і поясненням дій, що виконуються у кожному такті.
Оформити та захистити звіт з лабораторної роботи.
Вимоги до звіту
Звіт повинен містити:
Назву (тему) лабораторної роботи;
Мету роботи;
Короткий теоретичний вступ (від 1,5 до 2 стор.);
Завдання і результати виконання пунктів 2 – 5 розділу „Порядок виконання роботи”;
Висновки.
У звіті програми повинні бути оформлені у вигляді:
- формулювання задачі;
- інформація про вхідні дані, їх попередньє розташування у комірках пам’яті,
призначення комірок, що використовуються;
- текст програми у форматі:
Література.
Нешумова К. А. Электронные вычислительные машины и системы. Учеб. для техникумов спец. ЭВТ. – 2-е изд., доп. и перераб. М.: Высш. шк., 1989.
Касаткин В.Н., Верлань А.Ф. Основы информатики и вычислительной техники: Проб. учеб. пособие для 10 – 11 кл. сред. шк. – К.: Рад. шк. 1989.
Рабинович З. Л., Раманаускас В. А. Типовые операции в вычислительных машинах. К.: Техніка, 1980.
Компьютеры: Справочное руководство. В 3-х томах. Том 1. Пер. с англ./ Под ред. Г. Хелмса – М.: Мир, 1986.
Преснухин Л. Н., Нестеров П. В. Цифровые вычислительные машины. Учеб. Пособие для втузов. М., «Высшая школа», 1974.
Цилькер Б. Я., Орлов С. А. Организация ЭВМ и систем. Учебник для вузов. – СПб.: Питер. 2006.
Хамахер К., Вранешич З., Заки С. Организация ЭВМ. 5-е изд. СПб.: Питер; Киев. Издательская група BHV, 2003. (серия „Класика computer science”)/