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 - циклічні зсуви через ознаку С (розряди обертаються через ознаку переносу С).
2. Порядок виконання роботи:
Вивчити теоретичні відомостями до лабораторної роботи № 3.
Дослідити у потактовому режимі інструкції ROL, RCL. JP - для непарних номерів із списку групи, ROR, RCR, JC - для парних номерів із списку групи. Виписати результати та значення прапорців ознак.
Виконання:
Мій номер 11.
Інструкція ROL - циклічний зсув уліво значення що знаходиться у акумуляторі. Її код 1111 100х хххх хххх, де ххх це довільна комбінація нулів або одиниць.
До акумулятора заносим 5734410(1110 0000 0000 00002). До комірки за адресою 0(0000 0000 0000 заносим значення інструкції ROL (1111 1000 0000 0000).У ЛАІ встановлюєм за допомогою набірного поля адресу інструкції ROL (0000 0000 0000).
№ |
Мнемонічний запис |
Код, що обробляється |
Коментар |
1 |
ЛАІ РА |
0000 0000 0000 |
вибір адреси інструкції і занесення її до Регістра Адреси |
2 |
Пам(РА) РД |
1111 1000 0000 0000 |
вибір коду інструкції з РА і занесення його до Регістра Даних |
3 |
РД РІ |
1111 1000 0000 0000 |
декодування інструкції у Регістрі Інструкцій |
4 |
ROL(A) A |
1100 0000 0000 0001 |
циклічний зсув вліво числа в акумуляторі |
5 |
ZSC(А) РО |
010 |
встановлення прапорців регістру ознак |
7 |
ЛАІ + 1 ЛАІ |
0000 0000 0001 |
підготовка адреси нової інструкції |
Результат виконання програми число 1100 0000 0000 00012 (4915310) що знаходиться у Акумуляторі. У РО значення тригера S встановлюється 1. У результаті виконання відбувається переповнення розрядної сітки, тим не менше тригер С не змінює свого значення, а до молодшого розряду додається 1.
Інструкція JP - циклічний зсув уліво значення що знаходиться у акумуляторі. Її код 1111 110х хххх хххх, де ххх це довільна комбінація нулів або одиниць.
До акумулятора заносим 5734410(1110 0000 0000 00002). До комірки за адресою 0(0000 0000 0000 заносим значення інструкції RCL (1111 1100 0000 0000). У ЛАІ встановлюєм за допомогою набірного поля адресу інструкції RCL (0000 0000 0000).
№ |
Мнемонічний запис |
Код, що обробляється |
Коментар |
1 |
ЛАІ РА |
0000 0000 0000 |
вибір адреси інструкції і занесення її до Регістра Адреси |
2 |
Пам(РА) РД |
1111 1100 0000 0000 |
вибір коду інструкції з РА і занесення його до Регістра Даних |
3 |
РД РІ |
1111 1100 0000 0000 |
декодування інструкції у Регістрі Інструкцій |
4 |
RCL(A) A |
1100 0000 0000 0000 |
циклічний зсув вліво числа в акумуляторі |
5 |
ZSC(А) РО |
011 |
встановлення прапорців регістру ознак |
7 |
ЛАІ + 1 ЛАІ |
0000 0000 0001 |
підготовка адреси нової інструкції |
Результат виконання програми число 1100 0000 0000 00002 (4915210) що знаходиться у Акумуляторі. У РО значення тригера S i C встановлюється 1. У результаті виконання відбувається переповнення розрядної сітки, тригер С змінює своє значення. Тут до молодшого розряду при переповненні не додається 1 на відміну від інструкції ROL.
Інструкція JP - Умовний перехід на ADR, якщо S=0. Її код 1010 хххх хххх хххх, де хххх – це адреса інструкції яку потрібно виконати у випадку коли умова здійснюється.
До комірки за адресою 0(0000 0000 1010 заносим значення інструкції RCL (1010 0000 0000 1111). У ЛАІ встановлюєм за допомогою набірного поля адресу інструкції RCL (0000 0000 1010).
№ |
Мнемонічний запис |
Код, що обробляється |
Коментар |
1 |
ЛАІ ® РА |
0000 0000 1010 |
вибір адреси інструкції і занесення її до РА |
2 |
Пам(РА) ® РД |
1010 0000 0000 1111 |
вибір коду інструкції з РА і занесення його до РД |
3 |
РД ® РІ |
1010 0000 0000 1111 |
декодування інструкції в РІ |
4 |
РІ ® ЛAІ |
0000 0000 1100 |
Занесення нової адреси в ЛАІ і підготовка інструкції, що розміщена за цією адресою |
В результаті виконання цієї інструкції відбудеться перехід за адресою 0000 0000 11112. Буде здійснено непрямий порядок виконання інструкцій. Значення РО не змінюється.
Скласти програму, яка реалізуватиме оператор IF (умову перевірки вибрати самостійно). Закодувати її, ввести у симулятор та виконати її дослідження у покроковому режимі, Текст програми оформити згідно з прикладом у теоретичній частині даних методичних вказівок.
if (a = b)
с=a + b;
else
c=b;
Змінна a знаходиться у 1010 комірці, змінна b – у 1110, а змінна c – у 1210
№ комірки пам’яті |
Двійковий код інструкції |
Мнемонічний запис інструкції |
Коментар |
0000 0000 0000 |
0000 0000 0000 1010 |
LOAD 10; |
завантажити до акумулятора змінну a |
0000 0000 0001 |
0011 0000 0000 1011 |
SUB 11; |
відняти від змінної a змінну b |
0000 0000 0010 |
1001 0000 0000 0110 |
JZ 06; |
якщо Z = 1 (a=b), перейти до c:=b |
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 |
0010 0000 0000 1011 |
ADD 11; |
Додати а+в і записати до акумулятора |
0000 0000 1000 |
0001 0000 0000 1100 |
STORE 12 |
На місце змінної с запишеться значення акумулятора, тобто суми а+в |
0000 0000 1001 |
0111 1100 0000 0000 |
HALT; |
зупинити програму |
Розробити алгоритм і cкласти програму в інструкціях симулятора DeComp, що для довільного числа "А" з комірки пам"яті за адресою "N" підраховує кількість"1" - для непарних номерів із списку групи, і підраховує кількість "0" - для парних номерів із списку групи. Програма виконується в автоматичному режимі.
Виконання:
Розробити алгоритм і cкласти програму в інструкціях симулятора DeComp, що для довільного числа "А" з комірки пам"яті за адресою "N" підраховує кількість"0". Програма виконується в автоматичному режимі.
Вхідні дані: у 12 комірці міститься початкове, та подальше змінене, значення змінної А (0101 0111 1101 010112), у 13 комірці зберігається змінна S (лічильник «0»), у 14 комірці міститься одиничка що буде слугувати для збільшення n, у 15 комірці зберігається значення n (кількість не перевірених на одиницю розрядів).
Блоксхема розв’язування завдання
Адреса комірки пам’яті |
Код інструкції (двійковий) |
Мнемонічний формат інструкції |
Коментар до груп інструкцій, що відповідають блокам алгоритму програми |
0 |
0000 0000 0000 1100 |
LOOP1:LOAD 12 |
Завантаження змінної ”A” до акумулятора |
1 |
1111 1110 0000 0000 |
RCR |
Циклічний зсув вправо через С |
2 |
0001 0000 0000 1100 |
STORE 12 |
Запис модифікованої змінної ”A” назад у пам’ять |
3 |
1101 0000 0000 0111 |
JC LOOP 2 |
Якщо С=0 (молодший біт змінної ”A” (12) вийшов за межі розрядної сітки акумулятора), то виконується наступні три інструкції (збільшення ”S” на одиницю) в іншому разі, коли С=0 (молодший біт змінної ”A” рівний 02) ці інструкції оминаються – відбувається перехід на комірку за адресою 710 |
4 |
0000 0000 0000 1101 |
LOAD 13 |
Завантаження змінної ”S” до акумулятора |
5 |
0010 0000 0000 1110 |
ADD 14 |
Збільшення ”S” на одиницю: підрахунок кількості одиниць в змінній ”A” |
6 |
0001 0000 0000 1101 |
STORE 13 |
Збереження ”S” в пам’яті ЕОМ |
7 |
0000 0000 0000 1111 |
LOOP 2:LOAD 15 |
Завантаження змінної ”n” до акумулятора |
8 |
0011 0000 0000 1110 |
SUB 14 |
Зменшити ”n” на одиницю: зміна параметрів циклу. |
9 |
0001 0000 0000 1111 |
STORE 15 |
Збереження ”n” в пам’яті ЕОМ |
10 |
1000 0000 0000 0000 |
JNZ LOOP 1 |
Перевірка умови виконання циклу. Якщо в результат зміни параметрів циклу Z=0 тоді виконується наступна команда (зупинка процесора), в іншому випадку відбувається перехід на комірку за адресою 02 |
11 |
0111 1100 0000 0000 |
HALT |
Зупинка процесора |
Результат виконання програми запишеться у 13 комірку.
Висновки: При виконанні даниої роботи я засвоїв основні інструкції зсуву та переходу у системі команд навчального комп'ютера DeComp. Також я засвоїв як правильно організовувати цикли у програмі DeComp.