Виконання:
Якщо а > b, то с := a – b, інакше c := a + b;
Змінна а знаходиться в 11-й комірці, змінна b – в 12-й, а змінна с збережеться в 13-й.
№ комірки пам’яті |
Двійковий код інструкції |
Мнемонічний запис інструкції |
Коментар |
0000 0000 0000 0000 |
0000 0000 0000 1011 |
LOAD 11 |
Завантажити до А змінну а |
0000 0000 0000 0001 |
0011 0000 0000 1100 |
SUB 12 |
Відняти від змінної а змінну b |
0000 0000 0000 0010 |
1100 0000 0000 0111 |
JNC 7 |
Якщо С = 1 (a < b), то перейти до c := a + b |
0000 0000 0000 0011 |
0000 0000 0000 1011 |
LOAD 11 |
Завантажити до А змінну а |
0000 0000 0000 0100 |
0010 0000 0000 1100 |
ADD 12 |
Додати до змінної а змінну b |
0000 0000 0000 0101 |
0001 0000 0000 1101 |
STORE 13 |
Зберегти результат (змінну с) |
0000 0000 0000 0110 |
0111 1100 0000 0000 |
HALT |
Зупинити програму |
0000 0000 0000 0111 |
0000 0000 0000 1011 |
LOAD 11 |
Завантажити до А змінну а |
0000 0000 0000 1000 |
0011 0000 0000 1100 |
SUB 12 |
Відняти від змінної а змінну b |
0000 0000 0000 1001 |
0001 0000 0000 1101 |
STORE 13 |
Зберегти результат (змінну с) |
0000 0000 0000 1010 |
0111 1100 0000 0000 |
HALT |
Зупинити програму |
Блок-схема програми:
Для того щоб перевірити умову а > b, я виконую віднімання чисел ( а – b ) і перевіряю значення прапорця С за допомогою інструкції JNC. Якщо а > b, то при відніманні ми отримаємо додатне значення, прапорець С не активується і програма виконає віднімання чисел і збереження результату. Якщо а < b, то при відніманні відбудеться переповнення розрядної сітки і прапорець С активується. Тоді виконається додавання чисел і збереження результату.
Дослідження в по кроковому режимі:
Для дослідження дам значення змінним а та b і занесу їх значення до комірок 11 та 12. Нехай а = 610, b = 810. Так як a < b, в результаті ми маємо отримати суму цих чисел, тобто 1410.
610 = 1102;
810 = 10002;
1410 = 11102;
Крок |
РА |
РД |
А |
РІ |
ЛАІ |
РО |
1-й |
0000 0000 1011 |
0000 0000 0000 0110 |
0000 0000 0000 0110 |
0000 0000 0000 1011 |
0000 0000 0001 |
000 |
2-й |
0000 0000 1100 |
0000 0000 0000 1000 |
1111 1111 1111 1110 |
0011 0000 0000 1100 |
0000 0000 0010 |
011 |
3-й |
0000 0000 0010 |
1100 0000 0000 0111 |
1111 1111 1111 1110 |
1100 0000 0000 0111 |
0000 0000 0011 |
011 |
4-й |
0000 0000 1011 |
0000 0000 0000 0110 |
0000 0000 0000 0110 |
0000 0000 0000 1011 |
0000 0000 0100 |
011 |
5-й |
0000 0000 1100 |
0000 0000 0000 1000 |
0000 0000 0000 1110 |
0010 0000 0000 1100 |
0000 0000 0101 |
000 |
6-й |
0000 0000 1101 |
0000 0000 0000 1110 |
0000 0000 0000 1110 |
0001 0000 0000 1101 |
0000 0000 0110 |
000 |
7-й |
0000 0000 0110 |
0111 1100 0000 0000 |
0000 0000 0000 1110 |
0111 1100 0000 0000 |
0000 0000 0110 |
000 |
Отже, як можемо побачити, в результаті роботи програми значення акумулятора відповідає сумі двох цих чисел а і b. Тобто, в даному випадку програма спрацювала правильно.
Тепер перевіримо, що буде якщо ми поміняємо значення змінних місцями. Тобто а = 810, b = 610. Так як число а більше числа b, в результаті ми маємо отримати їх різницю, тобто, число 210
210 = 102;
Крок |
РА |
РД |
А |
РІ |
ЛАІ |
РО |
1-й |
0000 0000 1011 |
0000 0000 0000 1000 |
0000 0000 0000 1000 |
0000 0000 0000 1011 |
0000 0000 0001 |
000 |
2-й |
0000 0000 1100 |
0000 0000 0000 0110 |
0000 0000 0000 0010 |
0011 0000 0000 1100 |
0000 0000 0010 |
000 |
3-й |
0000 0000 0010 |
1100 0000 0000 0111 |
0000 0000 0000 0010 |
1100 0000 0000 0111 |
0000 0000 0111 |
000 |
4-й |
0000 0000 1011 |
0000 0000 0000 1000 |
0000 0000 0000 1000 |
0000 0000 0000 1011 |
0000 0000 1000 |
000 |
5-й |
0000 0000 1100 |
0000 0000 0000 0110 |
0000 0000 0000 0010 |
0011 0000 0000 1100 |
0000 0000 1001 |
000 |
6-й |
0000 0000 1101 |
0000 0000 0000 0010 |
0000 0000 0000 0010 |
0001 0000 0000 1101 |
0000 0000 1010 |
000 |
7-й |
0000 0000 1010 |
0111 1100 0000 0000 |
0000 0000 0000 0010 |
0111 1100 0000 0000 |
0000 0000 1010 |
000 |
І в цьому випадку програма спрацювала правильно. Через те, що a > b, при їх відніманні прапорець С не активувався, бо результатом є додатне число яке не переповнює розрядну сітку. Через це, інструкцією JNC 7 відбувся умовний перехід до інструкції, що знаходиться в 7-й комірці пам’яті. В першому випадку прапорець С активувався, а інструкція JNC робить умовний перехід лише тоді, коли С = 0. Тому програма продовжувала виконуватися без переходу.
Розробити алгоритм і написати програму в інструкціях симулятора DeComp, що для довільного числа "А" з комірки пам’яті за адресою "N" підраховує кількість"1" - для непарних номерів із списку групи, і підраховує кількість "0" - для парних номерів із списку групи. Програма виконується в автоматичному режимі.