
офк звіт 2
.docМіністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Звіт
з лабораторної роботи № 2
з дисципліни: “Організація та функціонування комп’ютерів”
на тему: “ Набір інструкцій навчального комп’ютера. Загальний порядок виконання інструкцій ”
Виконав: ст.гр. КІ-11
Москва О.Р.
Прийняв: ст..викл.
Кудрявцев О.Т.
Львів
2011
Лабораторна робота № 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.1. Інструкції звертання до пам’яті:
1) LOAD ADR - завантажити машинний код цієї інстркції – 0000 aaaa aaaa aaaa; виконання – (ADDR) Акумулятор.
Ця інструкція здійснює читання 16-розрядного числа з комірки пам’яті, на яку вказує поле адреси ADR, і розміщує його у акумуляторі. Перші найстарші 4 розряди (старша тетрада) містять код операції “завантаження” з пам’яті – 0000, а наступні 12 розрядів – адресу комірки, з якої відбуватиметься читання. Наприклад, для того, щоб прочитати число з 15-ї або 2041-ої комірки пам’яті і записати його до акумулятора, необхідно використати :
-
Мнемонічний запис
Машинний код
LOAD 15
0000 0000 0000 1111
LOAD 2041
0000 1111 1111 1001
2) STORE ADR – зберегти. Машинний код – 0001 aaaa aaaa aaaa; виконання – Акумулятор (ADDR)).
Ця інструкція здійснює протилежну до інструкції LOAD дію, тобто 16-розрядне значення вмісту акумулятора записує у комірку пам’яті, на яку вказує поле адреси ADR. Код операції інструкції “збереження” до пам’яті – 0001, а наступні 12 розрядів – адреса комірки пам’яті. Наприклад, щоб записати значення вмісту акумулятора до 148-ї або 2043 комірки, необхідно використати такі машинні коди:
-
Мнемонічний запис
Машинний код
STORE 148
0001 0000 1001 0100
STORE 2043
0001 1111 1111 1011
Якщо нам потрібно у пам’яті перенести число з однієї комірки до іншої, однією командою цього зробити не можна. Потрібно скористатись послідовно двома командами - LOAD та STORE, причому акумулятор буде посередницьким пунктом, через який відбудеться передача.
Так, програма з двох інструкцій:
Мнемонічний запис |
Машинний код |
LOAD 28 |
0000 0000 0001 1100 |
STORE 56 |
0001 0000 0011 1000 |
виконує переміщення 16-розрядного числа, яке знаходилось у 28-й комірці пам’яті, до 56-ї комірки. Відзначимо, що інструкція читання (завантаження) LOAD не знищує числа у 28-ій комірці. Після виконання у цій програмі інструкції запису (збереження) STORE, код числа з 28-ої комірки пам’яті буде скопійований до 56-ої комірки, а у акумуляторі залишиться те саме 16-розрядне число з 28-ї комірки.
1.2. Інструкції арифметичних операцій:
1) ADD ADR – арифметичне додавання
Машинний код – 0010 aaaa aaaa aaaa; виконання – Акумулятор + (ADDR) Акумулятор.
Ця інструкція виконує додавання вмісту акумулятора і числа з комірки пам’яті, на яку вказує адреса ADR, та записує результат назад до акумулятора. Перші 4 розряди машинного коду містять код операції додавання – 0010, а решта 12 розрядів – адресу у пам’яті 2-го операнда, що буде додаватись. Знову звернемо увагу на центральну позицію акумулятора, який постачає одне з двох чисел для додавання та зберігає результат.
Можна не переживати, що результат знищить одне з 2-х чисел, яке перед виконанням дії додавання було записано з пам’яті до акумулятора, бо воно залишилося у пам’яті за своєю адресою. Проте, якщо операнд був записаний в акумулятор як результат виконання попередньої інструкції і не був збережений у пам’яті, то тоді він пропаде – буде “затертий” новим значенням акумулятора.
Нехай нам потрібно додати 3 числа, які знаходяться у 21-й, 22-й та 23-й комірках пам’яті, а результат необхідно зберегти в 25-й комірці. Відповідна програма у мнемонічних кодах матиме вигляд:
Машинний код |
Мнемонічний запис |
Коментар |
0000 0000 0001 0101
|
LOAD 21 |
зчитування 1-го операнда з пам’яті до акумулятора |
0010 0000 0001 0110
|
ADD 22 |
додавання вмісту акумулятора (числа з 21-ої комірки) і вмісту 22-ої комірки пам’яті. Тепер у акумуляторі знаходиться перший проміжний доданок |
0010 0000 0001 0111
|
ADD 23 |
додавання першого проміжного доданку, що знаходиться у акумуляторі, з вмістом 23-ої комірки пам’яті. Тепер у акумуляторі – другий проміжний доданок – результат додавання трьох чисел |
0001 0000 0001 1001
|
STORE 25 |
збереження результату у 25-й комірці пам’яті. Числовий код результату копіюється до 25-ї комірки і він же залишається у акумуляторі. У машинних кодах ця програма матиме наступний вигляд |
2) SUB ADR – віднімання (від англ. Subtraction - віднімання).
Машинний код – 0011 aaaa aaaa aaaa; виконання: Акумулятор – (ADDR) Акумулятор.
Ця інструкція виконує віднімання від вмісту акумулятора значення вмісту комірки пам’яті з адресою, що вказана у полі ADR, і записує результат назад до акумулятора. Код операції віднімання – 0011, а решту 12 розрядів займає адреса комірки, вміст якої буде відніматися. Інші властивості цієї інструкції співпадають із властивостями інструкції додавання ADD.
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 ЛАІ.
У нашому випадку, замість інструкції у наступній комірці 0000 0000 0001, виявиться наше число 1510 = (0000 0000 0000 1111)2, але оскільки наша програма складається лише з однієї інструкції, то усе добре. Правильніше було б наш операнд записати до комірки, яка гарантовано не попадає у зону адрес роботи програми.
Отже, виконання інструкції ADD зайняло 8 тактів. У скороченому вигляді мікрокоманди виконання інструкції ADD для нашого прикладу можна було б представити у такому вигляді:
№ |
Мнемонічний запис |
Код, що обробляється |
Коментар |
1 |
ЛАІ РА |
0000 0000 0000 |
вибір адреси 1-ої інструкції і занесення її до Регістра Адреси |
2 |
РА РД |
0010 0000 0000 0001 |
вибір коду інструкції з РА і занесення його до Регістра Даних |
3 |
РД РІ |
0010 0000 0000 0001 |
декодування інструкції у Регістрі Інструкцій |
4 |
РІ РА |
0000 0000 0001 |
вибір адреси 1-го операнда |
5 |
РА РД |
0000 0000 0000 1111 |
вибір коду 1-го операнда з пам’яті і запис його до Регістру Даних |
6 |
А + РД А |
0000 0000 1111 1111 |
виконання операції додавання (2-й операнд – у акумуляторі) |
7 |
ZSC(А) РО |
000 |
встановлення прапорців регістру ознак |
8 |
ЛАІ + 1 ЛАІ |
0000 0000 0001 |
підготовка адреси нової інструкції |
Такий запис мікрокоманд виконання інструкції називають мікропрограмою виконання інструкції. У дужках наведено фактичні значення, які записуються у регістри процесора для нашої інструкції ADD 01.
2. Порядок виконання роботи
1. Опис призначення прапорців Регістру Ознак;
Прапорець Z (Zero - нуль) встановлюється у 1 (світиться), якщо результат операції дорівнює 0. Зрозуміло, що для команди ADD ця ознака встановиться лише у випадку, якщо до 0 додати 0, або якщо додаються два однакових числа з протилежними знаками.
Прапорець S (Sign - знак) встановлюється в 1, якщо результат операції – від’ємне число. Знову ж таки, інструкція ADD не може дати від’ємного результату за винятком чисел у доповняльному коді, яких ми поки-що не розглядаємо. Зрозуміло, якщо віднімати від меншого числа більше інструкцією SUB, отримаємо ознаку від’ємного результату S.
Прапорець C (Carry - перенос) встановлюється в 1, коли у результаті арифметичної операції (додавання чи віднімання) виникає перенос із старшого розряду результату або при виконанні операції зсуву вправо чи вліво крайній розряд числа вийшов за межі розрядної сітки.
2. Ввести у симулятор і виконати дослідження у потактовому режимі програми додавання двох чисел, яка була підготована у роботі № 1
У двійковому поданні дана програма матиме наступний вигляд:
0000 0000 0000 1010 – двійковий код 1-ої інструкції
0010 0000 0000 1011 - - “ - 2-ої інструкції
0001 0000 0000 1100 - - “ - 3-ої інструкції
0111 1100 0000 0000 - - “ - 4-ої інструкції
Відповідно, двійковий код першої інструкції необхідно занести до комірки з адресою 0 (0000 0000 0000), другу – у комірку з адресою 1 (0000 0000 0001), третю – у комірку з адресою 2 (0000 0000 0010), а четверту – у комірку з адресою 3 (0000 0000 0011).
Після того, як програма розміщена у пам’яті навчального комп’ютера і у 10-ту (код адреси у двійковій формі - 0000 0000 1010) та у 11-ту (код адреси - 0000 0000 1011) комірки будуть занесені задані числа, необхідно у Лічильнику Адреси Інструкції за допомогою набірного поля встановити адресу першої інструкції, тобто код адреси - 0000 0000 0000, тобто показати процесору звідки починати виконання програми.
Дослідження:
№ |
Мнемонічний запис |
Код, що обробляється |
Коментар |
1 |
ЛАІ PA |
0000 0000 0000 |
Вибір першої інструкції і занесення її до Регістра Адреси |
2 |
РА РД |
0000 0000 0000 1010 |
Вибір коду інструкції Load10 і занесення його до Регістра Даних |
3 |
РД→ РІ |
0000 0000 0000 1010 |
Декодування інструкції у Регістрі Інструкцій |
4 |
РІ → РА |
0000 0000 1010 |
Вибір адреси першого операнда |
5 |
РА → РД |
0000 0000 0000 1101 |
Вибір коду першого операнда з пам’яті і запис його до Регістру Даних |
6 |
РД→ А |
0000 0000 0000 1101 |
Занесення інформації з регістра даних в Акумулятор |
7 |
ЛАІ+1→ ЛАІ |
000 000 001 |
Вибір адреси другої інструкції |
8 |
ЛАІ→ РА |
000 000 001 |
Занесення адреси другої інструкції до Регістра Адреси |
9 |
РА → РД |
0010 0000 0000 1011 |
Вибір коду інструкції ADD11 і занесення його до Регістра Даних |
10 |
РД → РІ |
0010 0000 0000 1011 |
Декодування інструкції у Регістрі Інструкцій |
11 |
РІ→ РА |
0000 0000 1011 |
Вибір адреси другого операнда |
12 |
РА→ РД |
0000 0000 0010 0001 |
Вибір коду другого операнда і запис його до Регістру Даних |
13 |
А+РД → А |
0000 0000 0010 1110 |
Виконання операції додавання (другий операнд у акумуляторі) |
14 |
ZSC(A) → РО |
000 |
Встановлення прапорців регістру ознак |
15 |
ЛАІ+1→ ЛАІ |
0000 0000 0010 |
Вибір адреси третьої інструкції |
16 |
ЛАІ→ РА |
0000 0000 0010 |
Вибір третьої інструкції і занесення її до Регістра Адреси |
17 |
РА → РД |
0001 0000 0000 1100 |
Вибір коду інструкції STORE12 і занесення його до Регістра Даних |
18 |
РД → РІ |
0001 0000 0000 1100 |
Декодування інструкції у Регістрі Інструкцій |
19 |
РІ → РА |
0000 0000 1100 |
Вибір адреси другого операнда |
20 |
А→ РД |
0000 0000 0010 1110 |
Запис інформації з акумулятора в регістр даних(в 12 комірку) |
21 |
РД → РА |
|
|
22 |
ЛАІ+1→ ЛАІ |
0000 0000 0011 |
Вибір адреси четвертої інструкції |
23 |
ЛАІ→ РА |
0000 0000 0011 |
Вибір четвертої інструкції і занесення її до Регістра Адреси |
24 |
РА→ РД |
0111 1100 0000 0000 |
Вибір коду інструкції HALT і занесення його до Регістра Даних |
25 |
РД→ РІ |
0111 1100 0000 0000 |
Декодування інструкції у Регістрі Інструкцій |
4. Ввести у симулятор та виконати дослідження у покроковому режимі програми, яка відніматиме два числа А і В для значень, коли А = В, А > В і А < В, вибравши довільні відповідні значення.
Програма що буде віднімати числа:
Програма:
Мнемонічний код інструкції |
Дія, яку виконує інструкція |
LOAD 10 |
завантажити (прочитати) значення числа з 10-ї комірки пам’яті до акумулятора; |
SUB 11 |
Відняти від числа в акумуляторі значення числа з 11-ї комірки пам’яті і результат зберегти в акумуляторі; |
STORE 12 |
зберегти (записати) значення числа з акумулятора до 12-ї комірки пам’яті; |
HALT |
зупинити роботу процесора. |
У двійковому поданні дана програма матиме наступний вигляд:
0000 0000 0000 1010 – двійковий код 1-ої інструкції
0011 0000 0000 1011 - - “ - 2-ої інструкції
0001 0000 0000 1100 - - “ - 3-ої інструкції
0111 1100 0000 0000 - - “ - 4-ої інструкції
Відповідно, двійковий код першої інструкції необхідно занести до комірки з адресою 0 (0000 0000 0000), другу – у комірку з адресою 1 (0000 0000 0001), третю – у комірку з адресою 2 (0000 0000 0010), а четверту – у комірку з адресою 3 (0000 0000 0011).
Після того, як програма розміщена у пам’яті навчального комп’ютера і у 10-ту (код адреси у двійковій формі - 0000 0000 1010) та у 11-ту (код адреси - 0000 0000 1011) комірки будуть занесені задані числа, необхідно у Лічильнику Адреси Інструкції за допомогою набірного поля встановити адресу першої інструкції, тобто код адреси - 0000 0000 0000, тобто показати процесору звідки починати виконання програми.
При А=B (3=3)
інструкція |
Крок 1 |
Крок 2 |
Крок 3 |
Крок 4 |
РА |
0000 0000 1010 |
0000 00001011 |
0000 0000 0010 |
0000 0000 0011 |
РД |
0000 00000011 |
0000 00000011 |
0000 00000000 |
0111110000000000 |
S C Z |
------ |
Z |
Z |
Z |
А |
0000 0000 0000 0011 |
000000000000 0000 |
0000 0000 0000 0000 |
0000 000000000000 |
РІ |
0000 0000 0000 1010 |
0011000000001011 |
00001000000001100 |
0111110000000000 |
ЛАІ |
000000000001 |
000000000010 |
000000000011 |
0000 0000 0011 |
Загорівся прапорець що означає нуль, бо 3-3=0.
При А>B (4=3)
інструкція |
Крок 1 |
Крок 2 |
Крок 3 |
Крок 4 |
РА |
000000001010 |
000000001011 |
000000001100 |
000000000011 |
РД |
0000000000000100 |
0000000000000011 |
0000000000000001 |
0111110000000000 |
S C Z |
---- |
---- |
---- |
---- |
Акумулятор |
0000000000000100 |
0000000000000001 |
0000000000000001 |
0000000000000001 |
РІ |
1010 |
0011000000001011 |
00001000000001100 |
0111110000000000 |
ЛАІ |
000000000001 |
000000000010 |
000000000011 |
000000000011 |