Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра СКС
/
ЗВІТ
з лабораторної роботи № 3
з дисципліни «Організація та функціонування комп’ютерів»
на тему: «Дослідження інструкцій переходів і зсувів. Організація циклів.»
Тема: «Дослідження інструкцій переходів і зсувів. Організація циклів.»
Мета:
1. Засвоїти використання основних інструкцій зсуву і переходів у системі команд навчального комп’ютера DeComp.
2. Навчитись організовувати цикли необхідної структури і використовувати їх у програмах.
Теоретична частина
Головне призначення інструкції переходів – зміна звичайного порядку виконання інструкцій. У всіх інструкціях, за винятком інструкцій переходів, на останньому кроці адреса наступної інструкції визначається шляхом додавання 1 до ЛАІ. У інструкціях переходів 12 розрядів адресної частини містять нову адресу наступної інструкції. В результаті наступною після інструкції переходу буде не та інструкція, яка знаходиться у пам’яті зразу після інструкції переходу, а інструкція, яка може знаходитись у будь-якій іншій комірці пам’яті, на яку вкаже адреса у інструкції переходу.
Інструкція безумовного переходу JMP ADR має машинний код 1110 aaaa aaaa aaaa.
Відповідно, код операції дорівнює 1110, а решта розрядів – адресна частина. Мікропрограма виконання інструкції JMP має наступний вигляд:
ЛАІ ( РА;
РА ( РД;
РД ( РІ, декодування;
РІ ( ЛАІ – перехід на вказану адресу відбувається без будь-яких попередніх умов.
Як видно, інструкція безумовного переходу JMP просто записує до ЛАІ значення своєї адресної частини і програма буде змушена виконати інструкцію, що записана у комірці пам’яті за цією адресою. Інструкція JMP фактично є реалізацією оператора GOTO у мовах програмування Pascal, Basic та ін.
Призначення інструкцій умовного переходу (JNZ, JP тощо) дещо інше: у залежності від виконання чи не виконання умови, зазначеної у алгоритмі програми, перехід або буде здійснюватись, або не буде. Контроль виконання умови здійснює Регістр Ознак шляхом встановлення чи не встановлення відповідного тригера.
Для організації циклу засобами навчального комп’ютера DeComp в одній з комірок пам’яті необхідно розмістити лічильник циклів. Лічильник циклів це число, яке може мати значення N (якесь число) або 0 (const = N або const = 0). Відповідно, у циклі необхідно кожний раз лічильник зменшувати (або збільшувати) на 1 і за допомогою інструкції умовного переходу перевіряти, чи потрібно зробити цикл ще раз.
Наприклад, у комірці пам’яті за адресою 1010 розміщений лічильник - const = K = 15, у комірці пам’яті за адресою 1110 – константа = 1 (const = 1), яка буде обслуговувати цей лічильник. Тоді програма обслуговування циклу:
LOOP 1: . . . – мітка (адреса) попередньої частини програми;
LOAD 10 - вибрати значення з комірки 10 і розмістити його у акумуляторі;
SUB 11 - із значення, що є у акумуляторі, відняти 1;
JNZ LOOP 1 – перехід на LOOP 1, якщо у результаті виконання попередньої
операції ознака Z ≠ 0, тобто вміст акумулятора не дорівнює 0,
інакше – перехід на наступну aдресу – LOOP 2.
LOOP 2 . . . .
Це є лічильник "на 0", тобто процедура LOOP 1 виконується K = 15 разів і кожний раз виконується перевірка числа таких виконань шляхом зменшення значення у лічильнику. Коли у лічильнику значення стане рівним 0, програма почне виконувати процедуру LOOP 2.
Хід роботи
1. Ознайомитись з теоретичними відомостями до лабораторної роботи № 2.
2. Дослідити у потактовому режимі інструкції ROL, RCL, JP. Виписати результати та значення прапорців ознак.
Інструкція ROL – циклічний зсув вліво (розряди обертаються, не потрапляючи у ознаку переносу С). Код інструкції 1111 100a aaaa aaaa.
Перед початком виконання інструкції заніс до акумулятора число 1000 0000 0000 00012, надав нульового значення ЛАІ, в 0-ву комірку заніс код інструкції.
№
Мнемонічний запис
Код, що обробляється
Коментар
1
ЛАІ ( РА
0000 0000 0000
вибір адреси 1-ої інструкції і занесення її до Регістра Адреси
2
РА ( РД
1111 1000 0000 0000
вибір коду інструкції з РА і занесення його до Регістра Даних
3
РД ( РІ
1111 1000 0000 0000
декодування інструкції у Регістрі Інструкцій
4
A ( А
0000 0000 0000 0010
Циклічний зсув вмістимого акумулятора
5
А ( РО
000
встановлення прапорців регістру ознак
6
ЛAІ +1 ( ЛAІ
0000 0000 0001
Перехід до наступної іструкції
Інструкція RCL – циклічний зсув вліво (розряди обертаються, потрапляючи у ознаку переносу С).
Код інструкції 1111 110а аааа аааа.
Перед виконання інструкції заніс до акумулятора число 1000 0000 0000 00012, , в 0-ву комірку заніс код інструкції, надав нульового значення ЛАІ.
№
Мнемонічний запис
Код, що обробляється
Коментар
1
ЛАІ ( РА
0000 0000 0000
вибір адреси 1-ої інструкції і занесення її до Регістра Адреси
2
РА ( РД
1111 1100 0000 0000
Вибір коду інструкції з РА і занесення його до РД
3
РД ( РІ
1111 1100 0000 0000
Декодування інструкції у РІ
4
А>>(А
0000 0000 0000 0010
Зсув числа вліво на один розряд
5
А ( РО
001
встановлення прапорців регістру ознак
6
ЛАІ+1 ( ЛАІ
0000 0000 0001
Перехід до наступної іструкції
Інструкція JP – умовний перехід на певну комірку, якщо число у акумуляторі додатнє (S=0).
Код інструкції 1010 аааа аааа аааа, де а – адрес комірки, на яку буде здійснюватись перехід.
Перед початком виконання інструкції заніс до акумулятора число 0000 0000 0000 00012, в 0-ву комірку заніс код інструкції 1010 0000 0000 1111 (тобто якщо число додатне, відбувається перехід до 15 комірки), надав нульового значення ЛАІ.
№
Мнемонічний запис
Код, що обробляється
Коментар
1
ЛАІ ( РА
0000 0000 0000
вибір адреси 1-ої інструкції і занесення її до Регістра Адреси
2
РА ( РД
1010 0000 0000 1111
Вибір коду інструкції з РА і занесення його до РД
3
РД ( РІ
1010 0000 0000 1111
Декодування інструкції у РІ
4
РІ (ЛАІ
0000 0000 1111
Умовний перехід на 15-ту комірку, якщо S=0, інакше
5
ЛАІ+1 ( ЛАІ
0000 0000 0010
Якщо S = 1 – перехід на 2-гу комірку
Скласти програму, яка реалізуватиме оператор IF (умову перевірки вибрати самостійно). Закодувати її, ввести у симулятор та виконати її дослідження у покроковому режимі, Текст програми оформити згідно з прикладом у теоретичній частині даних методичних вказівок.
Алгоритм:
Програма у машинних кодах:
№ комірки пам’яті
Двійковий код інструкції
Мнемонічний запис
інструкції
Коментар
0000 0000 0000
0000 0000 0001 0000
LOAD 16
завантажити до акумулятора змінну a
0000 0000 0001
0011 0000 0001 0001
SUB 17
відняти від змінної a змінну b
0000 0000 0010
1001 0000 0000 0101
JZ 5
якщо Z = 0 (a=b), перейти до c = a -b
0000 0000 0011
0001 0000 0001 0000
STORE 16;
записати a на місце змінної c
0000 0000 0100
0111 1100 0000 0000
HALT
зупинити програму
0000 0000 0101
0001 0000 0001 0010
STORE 18;
записати a-b на місце змінної c
0000 0000 0110
0111 1100 0000 0000
HALT;
зупинити програму
Програма виконана при a=b, тобто a-b=0; в результаті отримали 0.
крок
РА
РД
А
РІ
ЛАІ
РО
1-й
0000 0001 0000
0000 0000 0000 0011
0000 0000 0000 0011
0000 0000 0001 0000
0000 0000 0001
000
2-й
0000 0001 0001
0000 0000 0000 0011
0000 0000 0000 0000
0011 0000 0001 0001
0000 0000 0010
100
3-й
0000 0000 0010
1001 0000 0000 0101
0000 0000 0000 0000
1001 0000 0000 0101
0000 0000 0101
100
4-й
0000 0001 0010
0000 0000 0000 0000
0000 0000 0000 0000
0001 0000 0001 0010
0000 0000 0110
100
5-й
0000 0000 0110
0111 1100 0000 0000
0000 0000 0000 0000
0111 1100 0000 0000
0000 0000 0110
100
Програма виконана при a>b, тобто a-b=с; в результаті отримали а.
крок
РА
РД
А
РІ
ЛАІ
РО
1-й
0000 0001 0000
0000 0000 0000 0011
0000 0000 0000 0011
0000 0000 0001 0000
0000 0000 0001
000
2-й
0000 0001 0001
0000 0000 0000 0010
0000 0000 0000 0001
0011 0000 0001 0001
0000 0000 0010
000
3-й
0000 0000 0010
1001 0000 0000 0101
0000 0000 0000 0001
1001 0000 0000 0101
0000 0000 0011
000
4-й
0000 0001 0000
0000 0000 0000 0001
0000 0000 0000 0001
0001 0000 0001 0000
0000 0000 0100
000
5-й
0000 0000 0100
0111 1100 0000 0000
0000 0000 0000 0001
0111 1100 0000 0000
0000 0000 0100
000
Розробити алгоритм і cкласти програму в інструкціях симулятора DeComp, що для довільного числа "А" з комірки пам’яті за адресою "N" підраховує кількість"1".
А – вибране число
k – кількість одиниць у записі числа А
b – лічильник циклу
с – ознака виходу за межі розрядної сітки
Алгоритм програми:
Завантажити до акумулятора число A.
Для того, щоб визначити значення старшого розряду числа, виконати логічний зсув вліво. Якщо це 12, то до попередньо підготовленої комірки пам’яті додаємо 110 ,якщо 02, пропускаємо додавання.
В лічильнику циклу віднімаємо 110. Перевіряємо, чи число в лічильнику дорівнює 010 . Якщо ні, то повертаємося до п.2. Якщо так – закінчуємо програму.
Адреса комірки пам’яті у десятковому коді
Двійковий код інструкції
Мнемонічний запис
Інструкції
Коментар
0
0000 0000 0000 1111
LOAD 15
Визначення старшого розряду за допомогою зсуву числа A на один розряд вліво
1
1111 1100 0000 0000
RCL
2
0001 0000 0000 1111
STORE 15
3
1101 0000 0000 0111
JC 7
Умовний перехід на 7 комірку,
якщо С=1.Інакше виконується наступний оператор
4
0000 0000 0000 1100
LOAD 12
Збільшення лічильника одиниць на 1 та збереження нового значення.
5
0010 0000 0000 1101
ADD 13
6
0001 0000 0000 1100
STORE 12
7
0000 0000 0000 1110
LOAD 14
Зменшення лічильника циклу на 1 та збереження нового значення.
8
0011 0000 0000 1101
SUB 13
9
0001 0000 0000 1110
STORE 14
10
1000 0000 0000 0000
JNZ 0
Перевіряємо умову виконання циклу
11
0111 1100 0000 0000
HALT
Завершення програми
Висновок: Засвоїв використання основних інструкцій зсуву і переходів у системі команд навчального комп’ютера DeComp, навчився організовувати цикли необхідної структури і використовувати їх у програмах.