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;
JNZLOOP 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 100xxxxxxxxx, де х – Довільна послідовність 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 110xxxxxxxxxде х – Довільна послідовність 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-й крок |
000000001010 |
0000000000001010 |
0000000000001010 |
0000000000001010 |
000000000001 |
|
2-й крок |
000000001011 |
0000000000001010 |
1111 1111 1111 1011 |
0011 000000001011 |
000000000010 |
S; C |
3-й крок |
000000000010 |
1011 0000 0000 0110 |
1111 1111 1111 1011 |
1011 0000 0000 0110 |
000000000110 |
S; C |
4-й крок |
000000001011 |
0000000000001010 |
0000000000001010 |
0000000000001011 |
000000000111 |
S; C |
5-й крок |
000000001100 |
0000000000001010 |
0000000000001010 |
0001 0000 0000 1100 |
0000 0000 1000 |
S; C |
6-й крок |
0000 0000 1000 |
0111 1100 0000 0000 |
0000000000001010 |
0111 1100 0000 0000 |
0000 0000 1000 |
S; C |
Розробити алгоритм і cкластипрограмувінструкціях симулятора DeComp, що для довільного числа "А" з коміркипам"ятіза адресою"N" підраховує кількість"1" - для непарнихномерівіз списку групи, і підраховуєкількість"0" - для парнихномерівіз списку групи. Програмавиконуєтьсявавтоматичномурежимі.
початок
Ввід А
k=0; b=16;
А=>>A
If C=0
так
ні
k=k+1
b=b-1
if b!=0
так
ні
Вивід k
кінець
№ коміркипам’яті |
Двійковий код інструкції |
Мнемонічнийзапис інструкції |
Коментар |
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 |
00010000 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.
