Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра СКС
Звіт
з лабораторної роботи № 3
з дисципліни: “Організація та функціонування комп’ютерів”
на тему: “Дослідження інструкцій переходів і зсуву. Організація циклів”
Лабораторна робота № 3
Тема: Дослідження інструкцій переходів і зсувів. Організація циклів.
Мета роботи: 1. Засвоїти використання основних інструкцій зсуву і переходів у системі
команд навчального комп'ютера DeComp.
2. Навчитись організовувати цикли необхідної стуктури і використовувати їх
у програмах.
1. Теоретичні відомості
Інструкції, з якими ми будемо знайомитися у даній роботі складають дві групи:
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).
Якщо умова виконується, тоді наступною буде виконуватися інструкція, яка розміщена у комірці пам’яті, номер якої вказаний у адресній частині коду інструкції.
Якщо умова не виконується, тоді наступною буде виконуватися інструкція, яка знаходиться відразу в сусідній комірці пам’яті з коміркою інструкції переходу.
У навчальному комп’ютері 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 - цикл3ічні зсуви ( розряди обертаються, не потрапляючи у ознаку переносу С).
- RCL, RCR - циклічні зсуви через ознаку С (розряди обертаються через ознаку переносу С).
2. Хід роботи:
Дослідити у потактовому режимі інструкції ROL, RCL. JP - для непарних номерів із списку групи, ROR, RCR, JC - для парних номерів із списку групи. Виписати результати та значення прапорців ознак.
Інструкція ROL(1111 100х хххх хххх) – здійснює циклічного зсуву вмісту акумулятора вліво.
Заношу до акумулятора число 0111 0000 0000 0000, ЛАІ встановлюю 0000 0000 0000.
№
№ комірки пам’яті у двійковому коді
Код інструкції
(двійковий)
Мнемонічний запис інструкції
Коментар до кожної
інструкції
1
0000 0000 0000
1111 1000 0000 0000
ROL
Циклічний зсув вліво
2
0000 0000 0001
1111 1000 0000 0000
ROL
Циклічний зсув вліво
3
0000 0000 0010
0111 1100 0000 0000
HALT
Стоп
№
Мнемонічний запис
Код, що обробляється
Коментар
1
ЛАІРА
0000 0000 0000
вибір адреси 1-ої інструкції і занесення її до Регістра Адреси
2
РАРД
1111 1000 0000 0000
вибір коду інструкції з РА і занесення його до Регістра Даних
3
РДРІ
1111 1000 0000 0000
декодування інструкції у Регістрі Інструкцій
4
AA
1110 0000 0000 0000
Зсув акумулятора
5
АРО
010
В регістрі ознак на s встановилась 1 – перший біт числа =1, число відємне
6
ЛАІ+1ЛАІ
0000 0000 0001
Підготовка адреси нової інструкції
7
ЛАІРА
0000 0000 0001
вибір адреси 2-ої інструкції і занесення її до Регістра Адреси
8
РАРД
1111 1000 0000 0000
вибір коду інструкції з РА і занесення його до Регістра Даних
9
РДРІ
1111 1000 0000 0000
декодування інструкції у Регістрі Інструкцій
10
AA
1100 0000 0000 0001
Зсув акумулятора
11
АРО
010
В регістрі ознак на s встановилась 1 – перший біт числа =1, число відємне
Інструкція RСL(1111 110х хххх хххх) – здійснює циклічного зсуву вмісту акумулятора вліво через регістр С.
Заношу до акумулятора число 1111 0000 0000 0000, ЛАІ встановлюю 0000 0000 0000.
№
№ комірки пам’яті у двійковому коді
Код інструкції
(двійковий)
Мнемонічний запис інструкції
Коментар до кожної
інструкції
1
0000 0000 0000
1111 1100 0000 0000
RСL
Циклічний зсув вліво
2
0000 0000 0001
1111 1100 0000 0000
RСL
Циклічний зсув вліво
3
0000 0000 0010
0111 1100 0000 0000
HALT
Стоп
№
Мнемонічний запис
Код, що обробляється
Коментар
1
ЛАІРА
0000 0000 0000
вибір адреси 1-ої інструкції і занесення її до Регістра Адреси
2
РАРД
1111 1100 0000 0000
вибір коду інструкції з РА і занесення його до Регістра Даних
3
РДРІ
1111 1100 0000 0000
декодування інструкції у Регістрі Інструкцій
4
AA
1110 0000 0000 0000
Зсув акумулятора
5
АРО
011
Регістри ознак на s та с встановились в 1 – перший біт числа =1, число від’ємне і s=1, крайній біт був =1 тому він попав в с
6
ЛАІ+1ЛАІ
0000 0000 0001
Підготовка адреси нової інструкції
7
ЛАІРА
0000 0000 0001
вибір адреси 2-ої інструкції і занесення її до Регістра Адреси
8
РАРД
1111 1100 0000 0000
вибір коду інструкції з РА і занесення його до Регістра Даних
9
РДРІ
1111 1100 0000 0000
декодування інструкції у Регістрі Інструкцій
10
AA
1100 0000 0000 0001
Зсув акумулятора
11
АРО
011
S=1, C=1
Інструкція JP (1010 aaaa aaaa aaaa) здійснює перехід на адресу аааа аааа аааа за умови шо регістр ознак – знаку числа S=1.
Встановлюю ЛАІ 0000 0000 0000
№
№ комірки пам’яті у двійковому коді
Код інструкції
(двійковий)
Мнемонічний запис інструкції
Коментар до кожної
інструкції
1
0000 0000 0000
1010 0000 0000 0011
JP 3
Умовний прехід
2
0000 0000 0001
0000 0000 0000 0000
3
0000 0000 0010
0000 0000 0000 0000
4
0000 0000 0011
0111 1100 0000 0000
HALT
Стоп
№
Мнемонічний запис
Код, що обробляється
Коментар
1
ЛАІРА
0000 0000 0000
вибір адреси 1-ої інструкції і занесення її до Регістра Адреси
2
РАРД
1010 0000 0000 0011
вибір коду інструкції з РА і занесення його до Регістра Даних
3
РДРІ
1010 0000 0000 0011
декодування інструкції у Регістрі Інструкцій
4
РІЛАІ
0000 0000 0011
Встановлення ЛАІ в 0000 0000 0011
5
ЛАІРА
0000 0000 0011
вибір адреси 2-ої інструкції і занесення її до Регістра Адреси
6
РАРД
0111 1100 0000 0000
вибір коду інструкції з РА і занесення його до Регістра Даних
7
РДРІ
0111 1100 0000 0000
декодування інструкції у Регістрі Інструкцій - стоп
Скласти програму, яка реалізуватиме оператор IF (умову перевірки вибрати самостійно). Закодувати її, ввести у симулятор та виконати її дослідження у покроковому режимі, Текст програми оформити згідно з прикладом у теоретичній частині даних методичних вказівок.
if (a > b) c= a; else c=b;
Змінна a- 0000 0000 0000 1111 знаходиться у 10-й комірці, змінна b 0000 0000 0001 0000 – у 11-й, а змінна c - 1 – у 12-й
№ комірки пам’яті
Двійковий код інструкції
Мнемонічний запис
Інструкції
Коментар
0000 0000 0000
0000 0000 0000 1011
LOAD 11;
завантажити до акумулятора змінну b
0000 0000 0001
0011 0000 0000 1010
SUB 10;
відняти від змінної b змінну a
0000 0000 0010
1100 0000 0000 0110
JNC 06;
якщо C = 0 (a<b), перейти до c:=a
0000 0000 0011
0000 0000 0000 1011
LOAD 11;
завантажити до акумулятора змінну b
0000 0000 0100
0001 0000 0000 1100
STORE 12;
записати змінну b на місце змінної c
0000 0000 0101
0111 1100 0000 0000
HALT;
зупинити програму
0000 0000 0110
0000 0000 0000 1010
LOAD 10;
завантажити до акумулятора змінну a
0000 0000 0111
0001 0000 0000 1100
STORE 12;
записати змінну a на місце змінної c
0000 0000 1000
0111 1100 0000 0000
HALT;
зупинити програму
Оператор IF (a > b) реалізується за допомогою інструкцій віднімання SUB та умовного переходу за умови відсутності переносу C - JNC: якщо при відніманні від змінної b (розміщеної у акумуляторі) змінної a (розміщеної у 10-й комірці) не виникає переносу, це означає, що a < b, а значить, необхідно пропустити фрагмент, де виконується c:= a (блок інструкцій LOAD, STORE та HALT у 3-й, 4-й та 5-й комірках), і почати виконувати фрагмент c:= b (блок інструкцій LOAD, STORE та HALT у 6-й, 7-й та 8-й комірках).
№
РА
РД
А
РІ
ЛАІ
РО
1
0000 0000 1011
0000 0000 0001 0000
0000 0000 0001 0000
0000 0000 0000 1011
0000 0000 0001
000
2
0000 0000 1010
0000 0000 0000 1111
0000 0000 0000 0001
0011 0000 0000 1010
0000 0000 0010
000
3
0000 0000 0010
1100 0000 0000 0110
0000 0000 0000 0001
1100 0000 0000 0110
0000 0000 0110
000
4
0000 0000 1010
0000 0000 0000 1111
0000 0000 0000 1111
0000 0000 0000 1010
0000 0000 0111
000
5
0000 0000 1100
0000 0000 0000 1111
0000 0000 0000 1111
0001 0000 0000 1100
0000 0000 1000
000
6
0000 0000 1000
0111 1100 0000 0000
0000 0000 0000 1111
0111 1100 0000 0000
0000 0000 1000
000
Розробити алгоритм і cкласти програму в інструкціях симулятора DeComp, що для довільного числа "А" з комірки пам"яті за адресою "N" підраховує кількість"1" - для непарних номерів із списку групи, і підраховує кількість "0" - для парних номерів із списку групи. Програма виконується в автоматичному режимі.
Формулювання задачі: Розробити алгоритм і cкласти програму в інструкціях симулятора DeComp, що для довільного числа "А" з комірки пам"яті за адресою "N" підраховує кількість"1".
Блок-схема алгоритму:
Інформація про вхідні дані і їх попереднє розташування у комірках пам’яті: вхідними даними буде число у якому буде підраховуватися кількість одиниць. Воно буде розташовуватися у комірці пам’яті за адресою 16(0000 0001 0000).
Призначення комірок що використовуються: для роботи програми використовуються комірки з адресами 17(0000 0001 0001), 18(0000 0001 0010), 19(0000 0001 0011). У комірку з адресою 17 записане число лічильника – тобто скільки ітерацій має виконати лічильник – у моєму випадку записане число 16 оскільки потрібно перевірити всі розряди числа, 16 раз зсунути його. У комірці 18 буде записано результат виконання команди - кількість одиниць у числі. У комірці 19 записано 1. Цією одиницею програма зменшує лічильний циклу, а також збільшує число кількості одиниць у вхідному числі.
Адр. комірки пам’яті у десятковому коді
Код інструкції
Мнемонічний формат інструкції
Коментарі інструкцій.
0
0000 0000 0001 0000
LOAD 16
Завантаження до акумулятора числа і зсув вліво через С
1
1111 0000 0000 0000
LSL
2
1101 0000 0000 0101
JC 5
Перевірка чи с=1
3
0001 0000 0001 0000
STORE 16
Зберігаємо число і переходимо на мітку
4
1110 0000 0000 1001
JMP 9
5
0001 0000 0001 0000
STORE 16
У разі якщо С=1 то зберігаємо число, завантажуємо число з кількістю одиниць, інкрементуємо його і зберігаємо.
6
0000 0000 0001 0010
LOAD 18
7
0010 0000 0001 0011
ADD 19
8
0001 0000 0001 0010
STORE 18
9
0000 0000 0001 0001
LOAD 17
Завантажуємо число лічильника і декрементуємо його.
10
0011 0000 0001 0011
SUB 19
11
1001 0000 0000 1110
JZ 14
Перевіряємо чи Z=0
12
0001 0000 0001 0001
STORE 17
Якщо ні то зберігаємо число лічильника
13
1110 0000 0000 0000
JMP 0
14
0111 1100 0000 0000
HALT
Якщо так то зупиняємо програму
Висновок: на цій лабораторній роботі я засвоїв використання основних інструкцій зсуву і переходів, навчивсь організовувати цикли необхідної стуктури і використовувати їх у програмах.