І в цьому випадку програма спрацювала правильно. Через те, що a > b, при їх відніманні прапорець С не активувався, бо результатом є додатне число яке не переповнює розрядну сітку. Через це, інструкцією JNC 7 відбувся умовний перехід до інструкції, що знаходиться в 7-й комірці пам’яті. В першому випадку прапорець С активувався, а інструкція JNC робить умовний перехід лише тоді, коли С = 0. Тому програма продовжувала виконуватися без переходу.
Розробити алгоритм і написати програму в інструкціях симулятора DeComp, що для довільного числа "А" з комірки пам’яті за адресою "N" підраховує кількість"1" - для непарних номерів із списку групи, і підраховує кількість "0" - для парних номерів із списку групи. Програма виконується в автоматичному режимі.
Мій порядковий номер зі списку групи - непарний, тому моя програма буде підраховувати кількість одиниць в двійковому записі числа А.
А – вибране число
k – кількість одиниць у записі числа А
b – лічильник циклу
с – ознака виходу за межі розрядної сітки
|
№ |
№ комірки пам’яті |
Двійковий код інструкції |
Мнемонічний запис інструкції |
Коментар |
|
1 |
0000 0000 0000 |
0000 0000 0000 1010 |
LOAD 10; |
завантажити до акумулятора змінну a |
|
2 |
0000 0000 0001 |
0011 0000 0000 1011 |
SUB 11; |
відняти від змінної a змінну b |
|
3 |
0000 0000 0010 |
1000 0000 0000 0101 |
JNZ 05; |
якщо Z = 0 (a≠b), перейти до c:=a+b |
|
4 |
0000 0000 0011 |
0001 0000 0000 1100 |
STORE 12; |
записати 0 на місце змінної c |
|
5 |
0000 0000 0100 |
0111 1100 0000 0000 |
HALT; |
зупинити програму |
|
6 |
0000 0000 0101 |
0000 0000 0000 1010 |
LOAD 10; |
завантажити до акумулятора змінну a |
|
7 |
0000 0000 0110 |
0010 0000 0000 1011 |
ADD 11; |
Додати до змінної a змінну b |
|
8 |
0000 0000 0111 |
0001 0000 0000 1100 |
STORE 12; |
записати суму a і b на місце змінної c |
|
9 |
0000 0000 1000 |
0111 1100 0000 0000 |
HALT; |
зупинити програму |
Адр.12 → k
Адр.13 → 1
Адр.14 → b
Адр.15 → А(число)
ЛАІ → Адр.0

Алгоритм програми:
Завантажити до акумулятора число A.
Для того, щоб визначити значення старшого розряду числа, виконати логічний зсув вліво. Якщо це 12, то до попередньо підготовленої комірки пам’яті додаємо 110 ,якщо 02, пропускаємо додавання.
В лічильнику циклу віднімаємо 110. Перевіряємо, чи число в лічильнику дорівнює 010 . Якщо ні, то повертаємося до п.2. Якщо так – закінчуємо програму.
|
№ |
№ комірки пам’яті |
Двійковий код інструкції |
Мнемонічний запис Інструкції |
Коментар |
|
1 |
0000 0000 0000 |
0000 0000 0000 1111 |
LOAD 15 |
Визначення старшого розряду за допомогою зсуву числа A на один розряд вліво |
|
2 |
0000 0000 0001 |
1111 1100 0000 0000 |
RCL |
|
|
3 |
0000 0000 0010 |
0001 0000 0000 1111 |
STORE 15 |
|
|
4 |
0000 0000 0011 |
1101 0000 0000 0111 |
JC 7 |
Умовний перехід на 7 комірку, якщо С=1. Інакше виконується наступний оператор |
|
5 |
0000 0000 0100 |
0000 0000 0000 1100 |
LOAD 12 |
Збільшення лічильника одиниць на 1 та збереження нового значення. |
|
6 |
0000 0000 0101 |
0010 0000 0000 1101 |
ADD 13 |
|
|
7 |
0000 0000 0110 |
0001 0000 0000 1100 |
STORE 12 |
|
|
8 |
0000 0000 0111 |
0000 0000 0000 1110 |
LOAD 14 |
Зменшення лічильника циклу на 1 та збереження нового значення. |
|
9 |
0000 0000 1000 |
0011 0000 0000 1101 |
SUB 13 |
|
|
10 |
0000 0000 1001 |
0001 0000 0000 1110 |
STORE 14 |
|
|
11 |
0000 0000 1010 |
1000 0000 0000 0000 |
JNZ 0 |
Перевіряємо умову виконання циклу |
|
12 |
0000 0000 1011 |
0111 1100 0000 0000 |
HALT |
Завершення програми |
Висновок: під час виконання лабораторної роботи я засвоїв використання основних інструкцій зсуву і переходів у системі команд навчального комп'ютера DeComp, а також навчився організовувати цикли необхідної структури і використовувати їх, створивши власну програму.