Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра CКС
Звіт
з лабораторної роботи № 3
з дисципліни: “Організація та функціонування комп’ютерів”
на тему: “ Дослідження інструкцій переходів і зсувів.
Організація циклів. ”
2010
Тема: Дослідження інструкцій переходів і зсувів. Організація циклів.
Мета роботи: 1. Засвоїти використання основних інструкцій зсуву і переходів у системі
команд навчального комп'ютера DeComp.
2. Навчитись організовувати цикли необхідної стуктури і використовувати їх
у програмах.
Теоретичні відомості:
Інструкції, з якими ми будемо знайомитися у даній роботі складають дві групи:
1) інструкції керування виконанням програми:
інструкція зупинки (HALT);
інструкції умовних переходів (JNZ, JZ, JP, JM, JNC та JC);
інструкція безумовного переходу (JMP);
2) інструкції зсувів (вліво (Left) та вправо (Right)):
інструкції логічного зсуву (LSL та LSR);
інструкції арифметичного зсуву (ASL та ASR);
інструкції циклічного зсуву (ROL та ROR);
інструкції циклічного зсуву через перенос C (RCL та RCR).
1.1. Розглянемо інструкції переходів.
Їх головне призначення – зміна звичайного порядку виконання інструкцій. У всіх інструкціях, за винятком інструкцій переходів, на останньому кроці адреса наступної інструкції визначається шляхом додавання 1 до ЛАІ. У інструкціях переходів 12 розрядів адресної частини містять нову адресу наступної інструкції. В результаті наступною після інструкції переходу буде не та інструкція, яка знаходиться у пам’яті зразу після інструкції переходу, а інструкція, яка може знаходитись у будь-якій іншій комірці пам’яті, на яку вкаже адреса у інструкції переходу.
Інструкція безумовного переходу JMP ADR має машинний код 1110 aaaa aaaa aaaa.
Відповідно, код операції дорівнює 1110, а решта розрядів – адресна частина. Мікропрограма виконання інструкції JMP має наступний вигляд:
ЛАІ ( РА;
РА ( РД;
РД ( РІ, декодування;
РІ ( ЛАІ – перехід на вказану адресу відбувається без будь-яких попередніх умов.
Як видно, інструкція безумовного переходу JMP просто записує до ЛАІ значення своєї адресної частини і програма буде змушена виконати інструкцію, що записана у комірці пам’яті за цією адресою. Інструкція JMP фактично є реалізацією оператора GOTO у мовах програмування Pascal, Basic та ін.
Призначення інструкцій умовного переходу (JNZ, JP тощо) дещо інше: у залежності від виконання чи не викогаггя умови, зазначеної у алгоритмі програми, перехід або буде здійснюватись, або не буде. Контроль виконання умови здійснює Регістр Ознак шляхом встановлення чи не встановлення відповідного тригера. (див. методичні матеріали до лабораторної роботи № 2).
Якщо умова виконується, тоді наступною буде виконуватися інструкція, яка розміщена у комірці пам’яті, номер якої вказаний у адресній частині коду інструкції.
Якщо умова не виконується, тоді наступною буде виконуватися інструкція, яка знаходиться відразу в сусідній комірці пам’яті з коміркою інструкції переходу.
Фактично інструкції умовного переходу дозволяють реалізувати оператори розгалуження IF та циклів FOR або WHILE. Наприклад, фрагменту програми на мові Pascal
if (a < b) then
c:= a;
else
c:= b;
при реалізації його у навчальному комп’ютері DeComp (причому, змінна a знаходиться у 10-й комірці, змінна b – у 11-й, а змінна c – у 12-й) відповідатиме такий фрагмент програми у машинних кодах:
№ комірки пам’яті
Двійковий код інструкції
Мнемонічний запис
інструкції
Коментар
0000 0000 0000
0000 0000 0000 1010
LOAD 10;
завантажити до акумулятора змінну a
0000 0000 0001
0011 0000 0000 1011
SUB 11;
відняти від змінної a змінну b
0000 0000 0010
1100 0000 0000 0110
JNC 06;
якщо C = 0 (a>b), перейти до c:=b
0000 0000 0011
0000 0000 0000 1010
LOAD 10;
завантажити до акумулятора змінну a
0000 0000 0100
0001 0000 0000 1100
STORE 12;
записати змінну a на місце змінної c
0000 0000 0101
0111 1100 0000 0000
HALT;
зупинити програму
0000 0000 0110
0000 0000 0000 1011
LOAD 11;
завантажити до акумулятора змінну b
0000 0000 0111
0001 0000 0000 1100
STORE 12;
записати змінну b на місце змінної c
0000 0000 1000
0111 1100 0000 0000
HALT;
зупинити програму
Як видно з програми, оператор IF (a < b) реалізується за допомогою інструкцій віднімання SUB та умовного переходу за умови відсутності переносу C - JNC: якщо при відніманні від змінної a (розміщеної у акумуляторі) змінної b (розміщеної у 11-й комірці) не виникає переносу, це означає, що a > b, а значить, необхідно “перескочити” фрагмент, де виконується c:= a (блок інструкцій LOAD, STORE та HALT у 3-й, 4-й та 5-й комірках), і почати виконувати фрагмент c:= b (блок інструкцій LOAD, STORE та HALT у 6-й, 7-й та 8-й комірках). Отже, у навчальному комп’ютері DeComp маємо такі інструкції умовних переходів (результат – число А знаходиться в акумуляторі):
Двійковий код
інструкції
Мнемонічний
запис інструкції
Значення ознаки, яка перевіряється
Значення
результату, що розміщений в акумуляторі
1000;
JNZ ADR
Z = 0
A ( 0
1001
JZ ADR
Z = 1
A = 0
1010
JP ADR
S = 0
A > 0
1011
JM ADR
S = 1
A <0
1100
JNC ADR
C = 0
A ( 216 - 1
1101
JC ADR
C = 1
A ( 216 - 1
При дослідженні інструкцій переходів у потактовому режимі видно, що їх хід відрізняється від розглянутого у прикладі, наведеному у лабораторній робті № 2. Для прикладу, мікропрограма інструкції JM матиме вигляд:
№
Мнемонічний
запис мікрооперації
Коментар
1
ЛАІ ( РА;
вибір адреси 1-ої інструкції і занесення її до регістру РА
2
РА ( РД;
вибір коду інструкції з РА і занесення його до регістру РД
3
РД ( РІ;
декодування іперевірка регістру ознак РО
4
РІ ( ЛАІ
якщо S = 1, інакше 5)
5
ЛАІ + 1 ( ЛАІ
якщо S = 0
1.2. Організація програмних циклів
Для організації циклу засобами навчального комп’ютера 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 разів і кожний раз виконується перевірка числа таких виконань шляхом зменшення значення у лічильнику (комірка пам’яті – 10). Коли у лічильнику значення стане рівним 0, програма почне виконувати процедуру LOOP 2.
1.3. Особливості виконання операцій зсуву
- LSL, LSR - логічні зсуви (розряд, що виходить за межі аккумулятора, потрапляє у ознаку
переносу С).
- ASL, ASR - арифметичні зсуви (не змінюється знак. У ознаку переносу розряд потрапляє
не зі старшого, тобто - знакового розряду, а з попереднього - старшого розряду
числа).
- ROL, ROR - циклічні зсуви ( розряди обертаються, не потрапляючи у ознаку переносу С).
- RCL, RCR - циклічні зсуви через ознаку С (розряди обертаються через ознаку переносу С).
Порядок виконання роботи:
Вивчити теоретичні відомостями до лабораторної роботи № 3.
Дослідити у потактовому режимі інструкції ROL, RCL. JP - для непарних номерів із списку групи, ROR, RCR, JC - для парних номерів із списку групи. Виписати результати та значення прапорців ознак.
інструкція ROL – циклічний зсув вліво ( розряди обертаються, не потрапляючи у ознаку переносу С). Код інструкції 1111 100x xxxx xxxx, де х – Довільна послідовність 0 чи 1 (на виконання інструкції значення бітів не впливають). Для початку виконання інструкції потрібно занести до акумулятора число (у нашому випадку число 1),надати нульового значення ЛАІ,а в 0-ву комірку занести код інструкції.
№
Мнемонічний запис
Код, що обробляється
Коментар
1
ЛАІ ( РА
0000 0000 0000
вибір адреси 1-ої інструкції і занесення її до Регістра Адреси
2
РА ( РД
1111 1000 0000 0000
вибір коду інструкції з РА і занесення його до Регістра Даних
3
РД ( РІ
1111 1000 0000 0000
декодування інструкції у Регістрі Інструкцій
4
А >> ( А
0000 0000 0000 0010
Зсув числа вліво на один розряд
5
А ( РО
0000 0000 0000 0010
встановлення прапорців регістру ознак
6
ЛАІ+1 ( ЛАІ
0000 0000 0001
підготувати адресу наступної інструкції
інструкція RCL – циклічний зсув вліво ( розряди обертаються, потрапляючи у ознаку переносу С). Код інструкції 1111 110x xxxx xxxxде х – Довільна послідовність 0 чи 1 (на виконання інструкції значення бітів не впливають). Для початку виконання інструкції потрібно занести до акумулятора число (у нашому випадку число 1),надати нульового значення ЛАІ,а в 0-ву комірку занести код інструкції.
№
Мнемонічний запис
Код, що обробляється
Коментар
1
ЛАІ ( РА
0000 0000 0000
вибір адреси 1-ої інструкції і занесення її до Регістра Адреси
2
РА ( РД
1111 1100 0000 0000
вибір коду інструкції з РА і занесення його до Регістра Даних
3
РД ( РІ
1111 1100 0000 0000
декодування інструкції у Регістрі Інструкцій
4
А >> ( А
0000 0000 0000 0010
Зсув числа вліво на один розряд
5
А ( РО
0000 0000 0000 0010
встановлення прапорців регістру ознак
6
ЛАІ+1 ( ЛАІ
0000 0000 0001
підготувати адресу наступної інструкції
інструкція JP – умовний перехід на певну комірку, якщо число у акумуляторі додатнє (S=0). Код інструкції 1010 аааа аааа аааа, де а – адрес комірки,на яку буде злійснюватись перехід. Для початку виконання інструкції потрібно занести до акумулятора число (у нашому випадку число 1),надати нульового значення ЛАІ, а в 0-ву комірку занести код інструкції.
№
Мнемонічний запис
Код, що обробляється
Коментар
1
ЛАІ ( РА
0000 0000 0000
вибір адреси 1-ої інструкції і занесення її до Регістра Адреси
2
РА ( РД
1010 0000 0000 0101
вибір коду інструкції з РА і занесення його до Регістра Даних
3
РД ( РІ
1010 0000 0000 0101
декодування інструкції у Регістрі Інструкцій
4
РІ ( ЛАІ
0000 0000 0101
умовний перехід на 5-ту комірку, якщо S=0, інакше
5
ЛАІ+1 ( ЛАІ
0000 0000 0000 0010
якщо S = 1
Скласти програму, яка реалізуватиме оператор IF (умову перевірки вибрати самостійно). Закодувати її, ввести у симулятор та виконати її дослідження у покроковому режимі, Текст програми оформити згідно з прикладом у теоретичній частині даних методичних вказівок.
Умова програми: a > b
№ комірки пам’яті
Двійковий код інструкції
Мнемонічний запис
інструкції
Коментар
0000 0000 0000
0000 0000 0000 1010
LOAD 10;
завантажити до акумулятора змінну a
0000 0000 0001
0011 0000 0000 1011
SUB 11;
відняти від змінної a змінну b
0000 0000 0010
1011 0000 0000 0110
JM 06;
якщо S=1 (a>b), перейти до c:=b
0000 0000 0011
0000 0000 0000 1010
LOAD 10;
завантажити до акумулятора змінну a
0000 0000 0100
0001 0000 0000 1100
STORE 12;
записати змінну a на місце змінної c
0000 0000 0101
0111 1100 0000 0000
HALT;
зупинити програму
0000 0000 0110
0000 0000 0000 1011
LOAD 11;
завантажити до акумулятора змінну b
0000 0000 0111
0001 0000 0000 1100
STORE 12;
записати змінну b на місце змінної c
0000 0000 1000
0111 1100 0000 0000
HALT;
зупинити програму
Як видно з програми, оператор IF (a > b) реалізується за допомогою інструкцій віднімання SUB та умовного переходу за умови перевірки ознаки S - JM : якщо при відніманні від змінної a (розміщеної у акумуляторі) змінної b (розміщеної у 11-й комірці) результат не є від’ємний , це означає, що a > b, а значить, необхідно “перескочити” фрагмент, де виконується c:= a (блок інструкцій LOAD, STORE та HALT у 3-й, 4-й та 5-й комірках), і почати виконувати фрагмент c:= b (блок інструкцій LOAD, STORE та HALT у 6-й, 7-й та 8-й комірках). Результат виконання програми міститься у 12-ій комірці. До 10-ї комірки занесемо число 5, а до 11-ї комірки – число 10.
№ кроку
РА
РД
А
РІ
ЛАІ
РО
1-й крок
0000 0000 1010
0000 0000 0000 1010
0000 0000 0000 1010
0000 0000 0000 1010
0000 0000 0001
2-й крок
0000 0000 1011
0000 0000 0000 1010
1111 1111 1111 1011
0011 0000 0000 1011
0000 0000 0010
S; C
3-й крок
0000 0000 0010
1011 0000 0000 0110
1111 1111 1111 1011
1011 0000 0000 0110
0000 0000 0110
S; C
4-й крок
0000 0000 1011
0000 0000 0000 1010
0000 0000 0000 1010
0000 0000 0000 1011
0000 0000 0111
S; C
5-й крок
0000 0000 1100
0000 0000 0000 1010
0000 0000 0000 1010
0001 0000 0000 1100
0000 0000 1000
S; C
6-й крок
0000 0000 1000
0111 1100 0000 0000
0000 0000 0000 1010
0111 1100 0000 0000
0000 0000 1000
S; C
Розробити алгоритм і cкласти програму в інструкціях симулятора DeComp, що для довільного числа "А" з комірки пам"яті за адресою "N" підраховує кількість"1" - для непарних номерів із списку групи, і підраховує кількість "0" - для парних номерів із списку групи. Програма виконується в автоматичному режимі.
так
ні
так
ні
№ комірки пам’яті
Двійковий код інструкції
Мнемонічний запис
інструкції
Коментар
0000 0000 0000
0000 0000 0000 1110
LOAD 14;
завантажити до акумулятора змінну a
0000 0000 0001
1111 1100 0000 0000
RCL
Зсуваємо число на один розряд вліво
0000 0000 0010
1100 0000 0000 0110
JNC 06;
Умовний перехід на 6 комірку,
якщо С=0.Інакше
виконується наступний оператор
0000 0000 0011
0000 0000 0000 1011
LOAD 11;
Завантаження нашого
лічильника до акумулятора
0000 0000 0100
0010 0000 0000 1100
ADD 12;
Додоаємо до нашого
Лічильника 1
0000 0000 0101
0001 0000 0000 1011
STORE 11;
Запис нового
значення лічильника
0000 0000 0110
0000 0000 0000 1101
LOAD 13;
Завантаження лічильника циклу
До акумулятора
0000 0000 0111
0011 0000 0000 1100
SUB 12;
Віднімаємо від нашого
Значення 1
0000 0000 1000
0001 0000 0000 1101
STORE 13;
Запис нового значення
лічильника
0000 0000 1001
1000 0000 0000 0001
JNZ 1
Перевіряємо умову виконання циклу
0000 0000 1010
0111 1100 0000 0000
HALT
Припиняємо програму
Для початку виконання програми потрібно занести відповідні інстукції у комірки пам’яті , починаючи з 0-ої. В 11-тій комірці буде міститись результат виконання програми, у 12-ту комірку потрібно занести число 1, у 13-ку – число 16 (лічильник циклу). У 14-ту комірку потрібно занести число N.
Оформити та захистити звіт з лабораторної роботи.
Висновок: на лабораторній роботі я дослідив інструкції переходів та зсувів, навчився організовувати цикли та склав власну програму, у якій використовувались попередньо здобуті знання.