Міністерство науки і освіти України
Технічний коледж національного університету
«Львівська політехніка»
ЗВІТ
з лабораторної роботи №2
З предмету ОФК
Львів - 2018
Мета:
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 розрядів – адреса комірки пам’яті.
1.2. Інструкції арифметичних операцій
1) ADD ADR – арифметичне додавання (від англ. Addition -додавання)
Машинний код – 0010 aaaa aaaa aaaa; виконання – Акумулятор + (ADDR) Акумулятор.
Ця інструкція виконує додавання вмісту акумулятора і числа з комірки пам’яті, на яку вказує адреса ADR, та записує результат назад до акумулятора. Перші 4 розряди машинного коду містять код операції додавання – 0010, а решта 12 розрядів – адресу у пам’яті 2-го операнда, що буде додаватись. Знову звернемо увагу на центральну позицію акумулятора, який постачає одне з двох чисел для додавання та зберігає результат.
Можна не переживати, що результат знищить одне з 2-х чисел, яке перед виконанням дії додавання було записано з пам’яті до акумулятора, бо воно залишилося у пам’яті за своєю адресою. Проте, якщо операнд був записаний в акумулятор як результат виконання попередньої інструкції і не був збережений у пам’яті, то тоді він пропаде – буде “затертий” новим значенням акумулятора.
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-ти розрядному процесорі.
Порядок виконання роботи:
Описати призначення прапорців Регістру Ознак;
Виконання:
Прапорці Регістру Ознак необхідні для того, щоб проаналізувати виконання арифметичних дії и деяких інструкції на наявність певних особливостей.
Прапорець Z (у перекладі з англійської Zero - нуль) активується (отримує значення 1) тоді, коли результат операції дорівнює 0.
Прапорець S (у перекладі з англійської Sign – знак) активується (отримує значення 1) тоді, коли результатом операції стало від’ємне число.
Прапорець C (у перекладі з англійської Carry – перенос) активується (отримує значення 1) тоді, коли у результаті арифметичної операції розряд числа виходить за межі розрядної сітки.
Ввести у симулятор і виконати дослідження у потактовому режимі програми додавання двох чисел, яка була підготована у роботі № 1. Записати результати – мікропрограму виконання з необхідними поясненнями (згідно зразку)
Виконання:
На лабораторні роботі №1 я зробив програму, яка була призначена для додавання двох чисел (числа 22 та 33). Програма має такий вигляд:
Мнемонічний код інструкції
Машинний код
Дія, яку виконує інструкція
LOAD 10
0000 0000 0000 1010
завантажити (прочитати) значення числа з 10-ї комірки пам’яті до акумулятора;
ADD 11
0010 0000 0000 1011
додати до числа в акумуляторі значення числа з 11-ї комірки пам’яті і результат зберегти в акумуляторі;
STORE 12
0001 0000 0000 1100
зберегти (записати) значення числа з акумулятора до 12-ї комірки пам’яті;
HALT
0111 1100 0000 0000
зупинити роботу процесора.
Для виконання дослідження програми в по тактовому режимі, я заніс до ЛАІ адресу першої інструкції, тобто 0, і, обравши по тактовий режим роботи, приступив до дослідження. Кожен такт виконується з натиском кнопки ПУСК. Результати дослідження я заніс до таблиці.
Дослідження програми у потактовому режимі
№
Код, що обробляється
Мнемонічний запис
Коментар до кожної інструкції
1
0000 0000 0000
ЛАІ→РА
Вибір адреси першої інструкції та її запис до Регістру Адреси
2
0000 0000 0000 1010
Пам(РА)→РД
Зчитування та занесення вмісту комірки (інструкції) до Регістру Даних
3
0000 0000 0000 1010
РД→РІ
Декодування інструкції до Регістру Інструкцій
4
0000 0000 1010
РІ→РА
Початок виконання інструкції. Регістр Інструкцій вказує до якої комірки треба звернутись
5
0000 0000 0001 0110
Пам(РА)→РД
Зчитування та занесення вмісту комірки (число) до Регістру Даних
6
0000 0000 0001 0110
РД→А
Зчитування та занесення числа до Акумулятор
7
0000 0000 0001
ЛАІ→ЛАІ+1
Вибір адреси наступної (другої) інструкції
8
0000 0000 0001
ЛАІ→РА
Запис адреси другої інструкції до Регістру Адреси
9
0010 0000 0000 1011
Пам(РА)→РД
Вибір коду інструкції ADD 11 і його запис до Регістру Даних
10
0010 0000 0000 1011
РД→РІ
Декодування інструкції у Регістру Інструкцій
11
0000 0000 1011
РІ→РА
Вибір адреси другого числа
12
0000 0000 0010 0001
Пам(РА)→РД
Запис двійкового значення числа до Регістру Даних
13
0000 0000 0011 0111
А+РД→А
Виконання арифметичної дії та запис результату до Акумулятор
14
000
А→РО
Встановлення прапорців Регістру Ознак
15
0000 0000 0010
ЛАІ→ЛАІ+1
Вибір наступної (третьої) інструкції
16
0000 0000 0010
ЛАІ→РА
Запис адреси третьої інструкції до Регістру Адреси
17
0001 0000 0000 1100
Пам(РА)→РД
Вибір коду інструкції STORE 12 і його запис до Регістру Даних
18
0001 0000 0000 1100
РД→РІ
Декодування інструкції до РІ
19
0000 0000 1100
РІ→РА
Вибір адреси комірки, до якої буде записано результат арифметичної дії
20
0000 0000 0011 0111
А→РД
Запис результату додавання з Акумулятора до Регістру Даних
21
0000 0000 1100
РД→Пам(РА)
Зчитування результату додавання та його запис до конкретної комірки
22
0000 0000 0011
ЛАІ→ЛАІ+1
Вибір наступної (четвертої) інструкції
23
0000 0000 0011
ЛАІ→РА
Запис адреси четвертої інструкції до Регістру Адреси
24
0111 1100 0000 0000
Пам(РА)→РД
Зчитування вмісту комірки (інструкція) і його запис до Регістру Даних
25
0111 1100 0000 0000
РД→РІ
Декодування інструкції до Регістру Інструкцій
Ввести у симулятор та виконати дослідження у покроковому режимі програми, яка відніматиме два числа А і В для значень, коли А = В, А > В і А < В, вибравши довільні значення чисел А і В. Виписати результати виконання дослідження і значення прапорців ознак у таблицю, взірець якої поданий у роботі № 1. Поясніть отримані результати.
Виконання:
Для того щоб виконати це завдання я склав програму яка віднімає від числа з комірки 13, число з комірки 14 і зберігає результат в 15-ій комірці.
; ;
Мнемонічний код інструкції
Машинний код
Дія, яку виконує інструкція
LOAD 13
0000 0000 0000 1101
завантажити (прочитати) значення числа з 13-ї комірки пам’яті до акумулятора;
SUB 14
0011 0000 0000 1110
Відняти від числа в акумуляторі значення числа з 14-ї комірки пам’яті і результат зберегти в акумуляторі;
STORE 15
0001 0000 0000 1111
зберегти (записати) значення числа з акумулятора до 15-ї комірки пам’яті;
HALT
0111 1100 0000 0000
зупинити роботу процесора.
Запис програми починаю з 4 комірки пам’яті. Наступні коди інструкцій записую в наступні комірки:
; ; ;
Тепер можна переходити до дослідження роботи програми.
Почнемо з випадку при якому числа в комірках 13 та 14 будуть одинакові.
А = В
Нехай числом яке я запишу до 13-ї та 14-ї комірок буде . Перед натисканням кнопки ПУСК треба занести значення адреси першої інструкції (0000 0000 0000 0100) до Лічильника Адреси Інструкції. Потім я почав дослідження результати якого я записав в таблицю:
Крок
РА
РД
А
РІ
ЛАІ
РО
1-й
0000 0000 1101
0000 0000 0000 1010
0000 0000 0000 1010
0000 0000 0000 1101
0000 0000 0101
000
2-й
0000 0000 1110
0000 0000 0000 1010
0000 0000 0000 0000
0011 0000 0000 1110
0000 0000 0110
100
3-й
0000 0000 1111
0000 0000 0000 0000
0000 0000 0000 0000
0001 0000 0000 1111
0000 0000 0111
100
4-й
0000 0000 0111
0111 1100 0000 0000
0000 0000 0000 0000
0111 1100 0000 0000
0000 0000 0111
100
Оскільки числа А та B одинакові, то результатом віднімання чисел є число 0. Щоб сповістити нас про результат, загорається прапорець Z, що означає що результатом операції є нуль.
Перейдемо до дослідження випадку коли число з комірки 13 більше, ніж число з комірки 14.
А > В
Нехай число А = 1, а число В = . Я записав їх до комірок 13 і 14, встановив адресу першої інструкції (0000 0000 0000 0100) і почав дослідження:
Крок
РА
РД
А
РІ
ЛАІ
РО
1-й
0000 0000 1101
0000 0000 0000 1010
0000 0000 0000 1010
0000 0000 0000 1101
0000 0000 0101
000
2-й
0000 0000 1110
0000 0000 0000 0110
0000 0000 0000 0100
0011 0000 0000 1110
0000 0000 0110
000
3-й
0000 0000 1111
0000 0000 0000 0100
0000 0000 0000 0100
0001 0000 0000 1111
0000 0000 0111
000
4-й
0000 0000 0111
0111 1100 0000 0000
0000 0000 0000 0100
0111 1100 0000 0000
0000 0000 0111
000
Оскільки результатом віднімання є додатне число, то жоден прапорець не активувався. Через це в РО можна побачити наступне значення: 000.
І закінчимо дослідження програми випадком при якому число з комірки 13 менше, ніж число з комірки 13.
А < В
Нехай число А = а число В = 1. Я записав їх до комірок 13 і 14, встановив адресу першої інструкції (0000 0000 0000 0100) і почав дослідження:
Крок
РА
РД
А
РІ
ЛАІ
РО
1-й
0000 0000 1101
0000 0000 0000 0110
0000 0000 0000 0110
0000 0000 0000 1101
0000 0000 0101
000
2-й
0000 0000 1110
0000 0000 0000 1010
1111 1111 1111 1100
0011 0000 0000 1110
0000 0000 0110
011
3-й
0000 0000 1111
1111 1111 1111 1100
1111 1111 1111 1100
0001 0000 0000 1111
0000 0000 0111
011
4-й
0000 0000 0111
0111 1100 0000 0000
1111 1111 1111 1100
0111 1100 0000 0000
0000 0000 0111
011
Оскільки результатом арифметичної операції є від’ємне число, то активувалось два прапорці: S (Sign) та C (Carry). Через це в РО можна побачити наступне значення: 011. Варто підмітити, що в якості результату ми отримали число -4 у доповняльному коді (1111 1111 1111 11002)
Ввести у симулятор та виконати дослідження у потактовому режимі 3-х окремих інструкції – LOAD, STORE i SUB. Пояснити необхідну підготовку числових даних, виписати порядок виконання інструкцій у вигляді мікропрограм із вказанням реальних значень регістрів і поясненням дій, що виконуються у кожному такті.
Виконання:
LOAD (0000 xxxx xxxx xxxx, де xxxx xxxx xxxx – адреса комірки, з якої дані будуть перенесені до акумулятор)
Зробимо так, щоб мікропрограма зчитувала вміст 8-ї комірки. Для цього запишемо в комірку 8 деяке число, наприклад 16. Після того як ми занесли число, до 8-ї комірки треба вписати інструкцію зчитування. Виглядає інструкція зчитування наступним чином: 0000 0000 0000 1000. Запишемо інструкцію в 9-ту комірку. До ЛАІ занесемо адресу першої інструкції (0000 0000 1001).
; ; ;
Отримуємо наступну мікропрограму:
№
п/п
Код, що обробляється
Мнемонічний запис
Коментар до кожної інструкції
1
0000 0000 1001
ЛАІ→РА
Зчитування адреси інструкції
2
0000 0000 0000 1000
РА→РД
Зчитування вмісту комірки (інструкція) і занесення його до РД
3
0000 0000 0000 1000
РД→РІ
Декодування вмісту комірки і занесення його у РІ
4
0000 0000 1000
РІ→РА
Вибір адреси комірки, у якій знаходиться число
5
0000 0000 0001 0000
РА→РД
Зчитування і занесення вмісту комірки (число) до РД
6
0000 0000 0001 0000
РД→А
Занесення числа до акумулятору
7
0000 0000 1010
ЛАІ→ЛАІ+1
Завершення виконання інструкції
Після виконання інструкції в акумуляторі можна побачити наступне значення: 0000 0000 0001 0000 (число 16). Число є вмістом 8-ї комірки, з якої і відбувалось зчитування. Отже мікропрограма працює коректно.
STORE (0001 xxxx xxxx xxxx, де xxxx xxxx xxxx – адреса комірки, до якої буде записано число з акумулятора).
Зробимо так, щоб мікропрограма записувала вміст акумулятора до 8-ї комірки. Онулимо комірку 8. Щоб перевірити коректність роботи програми, заносимо будь-яке число до Акумулятора. Нехай це буде число 16. Після коректного виконання програми до 8-ї комірки має записатися число 16 замість числа яке було там до виконання операції.
Заносимо інструкцію до комірки з номером 9. Інструкція має наступний вигляд: 0001 0000 0000 1000. Коли інструкція була занесена, можна переходити до виконання. Для цього вносимо до ЛАІ адресу першої інструкції (0000 0000 1001), встановлюємо потактовий режим і натискаємо клавішу «ПУСК». Отримуємо наступну мікропрограму:
№
п/п
Код, що обробляється
Мнемонічний запис
Коментар до кожної інструкції
1
0000 0000 1001
ЛАІ→РА
Зчитування адреси інструкції
2
0001 0000 0000 1000
РА→РД
Зчитування вмісту комірки (інструкція) і занесення його до РД
3
0001 0000 0000 1000
РД→РІ
Декодування вмісту комірки і занесення його у РІ
4
0000 0000 1000
РІ→РА
Вибір адреси комірки, у яку буде записане число
5
0000 0001 0000
РА→А
Зчитування числа з акумулятора
6
0000 0001 0000
А→РД
Запис числа з акумулятор до РД
7
0000 0000 1010
ЛАІ→ЛАІ+1
Завершення виконання інструкції
Після виконання інструкції в 8-ї комірці можна побачити наступне значення: 0000 0000 0001 0000 (число 16). Число 16 є вмістом акумулятора. Отже вміст акумулятора був записаний до 5-ї комірки. Це означає, що мікропрограма працює коректно.
SUB (0011 xxxx xxxx xxxx, де хххх хххх хххх – адреса комірки, у якій знаходиться від’ємник)
Зробимо так, щоб мікропрограма віднімала число, вказане у 8-ї комірці, від вмісту акумулятора. Але спочатку необхідно внести якесь число до акумулятора. Робимо це за допомогою мікропрограми LOAD яку ми розглядали вище. Запишемо до акумулятор число. Хай це буде 16.
Тепер ми можемо виконати віднімання. Спочатку задаємо від’ємник у комірку під номером 8. Хай це буде число 10 (0000 0000 0000 1010). У результаті віднімання (16 – 10) ми повинні отримати число 6 (0000 0000 0000 0110). Якщо після виконання інструкції ми отримаємо це число, то в такому випадку мікропрограма працює коректно.
Заносимо інструкцію до комірки з номером 9. Інструкція має наступний вигляд: 0011 0000 0000 1000. Якщо інструкція була занесена, можна переходити до виконання. Для цього вносимо до ЛАІ адресу першої інструкції (0000 0000 0000), встановлюємо потактовий режим і натискаємо клавішу «ПУСК».
№
п/п
Код, що обробляється
Мнемонічний запис
Коментар до кожної інструкції
1
0000 0000 1001
ЛАІ→РА
Зчитування адреси інструкції
2
0011 0000 0000 1000
РА→РД
Занесення вмісту комірки (інструкція) до РД
3
0011 0000 0000 1000
РД→РІ
Декодування інструкції до РІ
4
0000 0000 0000 1000
РІ→РА
Зчитування адреси від’ємника
5
0000 0000 0000 1010
РА→РД
Зчитування значення від’ємника та його запис до РД
6
0000 0000 0000 0110
РД+А→А
Виконання арифметичної дії та запис результату до акумулятор
7
000
А→РО
Встановлення відповідних прапорців до РО
8
0000 0000 0000 1010
ЛАІ→ЛАІ+1
Завершення виконання інструкції
У результаті арифметичної дії віднімання ми отримали число 6 (0000 0000 0000 0110), яке зберігається в акумуляторі. При цьому вміст Регістру Ознак дорівнює 000. Це означає, що отримане число не є від’ємним, не дорівнює 0 и не переповнює розрядну сітку. Отже мікропрограма працює коректно.
Висновок:
Я засвоїв порядок виконання програм у комп’ютері. Ознайомився з форматом та набором інструкцій симулятора навчальної ЕОМ, засвоїв формати і способи використання інструкцій звертання до пам’яті та інструкцій арифметичних операцій, також засвоїв призначення регістра ознак процесора, ознайомився з потактовим режимом роботи навчального комп’ютера і засвоїв базовий порядок виконання інструкції навчального комп’ютера та навчився досліджувати хід виконання окремих інструкцій.