You are on page 1of 10

Міністерство освіти і науки України

Національний університет „Львівська політехніка”


Кафедра СКС

Звіт
до лабораторної роботи №3
з дисципліни: “Організація та функціонування комп’ютерів”
на тему: “Дослідження інструкцій переходів і зсувів. Організація циклів”

Виконав: ст.гр. КІ-11


Мацько О.М.
Прийняв: ст. викл.
Кудрявцев О.Т.

Львів
2014
Тема: Дослідження інструкцій переходів та зсувів. Організація циклів.
Мета: Засвоїти використання основних операцій зсуву і переходів у системі команд
навчального комп’ютера.

Теоретичні відомості

У цій роботі продовжуємо вивчення системи команд навчального комп’ютера –


симулятора DeComp.
Як вже зазначалося у лабораторній роботі № 2, усі інструкції можна розбити на групи
згідно призначенню. Інструкції, з якими ми будемо знайомитися у даній роботі відносяться
до:
1) інструкції керування виконанням програми:
a) інструкція зупинки (HALT);
b) інструкції умовних переходів (JNZ, JZ, JP, JM, JNC та JC);
c) інструкція безумовного переходу (JMP);
2) інструкції зсувів (вліво (Left) та вправо (Right)):
a) інструкції логічного зсуву (LSL та LSR);
b) інструкції арифметичного зсуву (ASL та ASR);
c) інструкції циклічного зсуву (ROL та ROR);
d) інструкції циклічного зсуву через перенос C (RCL та RCR)
Головне призначення інструкцій переходу – зміна звичайного порядку виконання
інструкцій. У всіх інструкціях, за винятком інструкцій переходів, на останньому кроці адреса
наступної інструкції визначається шляхом додавання 1 до ЛАІ. У інструкціях переходів 12
розрядів адресної частини містять нову адресу наступної інструкції. В результаті наступною
після інструкції переходу буде не та інструкція, яка знаходиться у пам’яті зразу після
інструкції переходу, а інструкція, яка може знаходитись у будь-якій іншій комірці пам’яті, на
яку вкаже адреса у інструкції переходу.
Машинний код інструкції безумовного переходу JMP ADR має вигляд: 1110 aaaa aaaa
aaaa. Відповідно код операції дорівнює 1110, а решта розрядів – адресна частина.
Як видно, інструкція безумовного переходу JMP просто записує до ЛАІ значення
своєї адресної частини і програма буде змушена виконати інструкцію, що записана у комірці
пам’яті за цією адресою. Інструкція JMP фактично є реалізацією оператора GOTO у мовах
програмування Pascal та Basic та ін.
Призначення інструкцій умовного переходу (JNZ, JP тощо) дещо інше: у залежності
від виконання умови, зазначеної у алгоритмі програми, перехід або буде здійснюватись, або
ні. Контроль виконання умови здійснює Регістр Ознак шляхом встановлення чи не
встановлення відповідного тригера.
Якщо умова не виконується, тоді наступною буде інструкція, яка знаходиться зразу
після інструкції переходу.
Якщо умова виконується, тоді наступною буде інструкція, яка розміщена у комірці
пам’яті, що вказана у адресній частині коду інструкції.
Фактично інструкції умовного переходу дозволяють реалізувати оператори
розгалуження IF та циклів FOR або WHILE.
Отже, у навчальному комп’ютері DeComp маємо наступні інструкції умовних
переходів:
JNZ ADR – умовний перехід на ADR, якщо ознака Z = 0 (результат у акумуляторі A  0);
код операції – 1000;
JZ ADR – умовний перехід на ADR, якщо ознака Z = 1 (результат у акумуляторі A = 0);
код операції – 1001;
JP ADR – умовний перехід на ADR, якщо ознака S = 0 (результат у акумуляторі A  0);
код операції – 1010;
JM ADR – умовний перехід на ADR, якщо ознака S = 1 (результат у акумуляторі A < 0);
код операції – 1011;
JNC ADR – умовний перехід на ADR, якщо ознака C = 0 (результат у акумуляторі A  216 -1);
код операції – 1100;
JC ADR – умовний перехід на ADR, якщо ознака С = 1 (результат у акумуляторі A  216 -1);
код операції – 1101.

Організація циклів:
Для організації циклу засобами процесора DeComp в одній з комірок пам’яті
необхідно розмістити лічильник циклів. Лічильник циклів це число, яке може мати значення
N (якесь число) або 0 (const = N або const = 0). Відповідно, у циклі необхідно кожний раз
лічильник зменшувати (або збільшувати) на 1 і за допомогою інструкції умовного переходу
перевіряти, чи потрібно зробити цикл ще раз.

Особливості виконання операцій зсуву:


- LSL, LSR - логічні зсуви (розряд, що виходить за межі аккумулятора, потрапляє у
ознаку переносу С).
- ASL, ASR - арифметичні зсуви (не змінюється знак. У ознаку переносу розряд
потрапляє не зі старшого, тобто - знакового розряду, а з попереднього - старшого розряду
числа).
- ROL, ROR - циклічні зсуви ( розряди обертаються, не потрапляючи у ознаку
переносу С).
- RCL, RCR - циклічні зсуви через ознаку С (розряди обертаються через ознаку
переносу С).

Хід виконання роботи


2.Дослідити у потактовому режимі інструкції ROL, RCL, JP - для непарних номерів із
списку групи, ROR, RCR, JC - для парних номерів із списку групи. Виписати результати та
значення прапорців ознак.
Оскільки мій номер 18 (парний), я досліджую інструкції ROR RCR, JС.

1.Дослідження інструкції ROR – циклічний зсув вправо ( розряди обертаються, не


потрапляючи у ознаку переносу С):
1. Записую в комірку з адресою 0 значення двійкового коду інструкції ROR
2. Записую двійковий код числа 15 в акумулятор (0000 0000 0000 1111)2
3. У набірне поле записую адресу нульової комірки і натискаю кнопку «Лічильник Адреси
Інструкції».
Адр.0 → ROR→(1111 1010 0000 0000)
А→ 1510 →(0000 0000 0000 1111)2
ЛАІ→ (0000 0000 0000)
4. Обираю потактовий режим програми натискаю на кнопку «Пуск».
5. Записав результати виконання дослідження в таблицю:
Мнемонічни
№ Код, що обробляється Коментар
й запис
Вибір адреси першої інструкції і занесення її
1 ЛАІ→РА 0000 0000 0000
до Регістра Адреси
Вибір коду інструкції ROL з Регістра Адреси і
2 РА→РД 1111 1010 0000 0000
занесення його до Регістра Даних
3 РД→РІ 1111 1010 0000 0000 Декодування інструкції у Регістрі Інструкцій
Запис результату в Акумулятор, після
4 А→А 1000 0000 0000 0111
циклічного зсуву вліво
5 А→РО 0S0 Перевірка результату в Регістрі Ознак
6 ЛАІ+1→ЛАІ 0000 0000 0001 підготовка адреси нової інструкції

У результаті виконання програми я отримав число (1000 0000 0000 0111)2 в акумуляторі. В
результаті виконання програми в регістрі ознак засвітився прапорець S.

2.Дослідження інструкції RCR – циклічний зсув вправо ( розряди обертаються,


потрапляючи у ознаку переносу С).
1.Записую в комірку з адресою 0 значення двійкового коду інструкції RCR
(1111 111x xxxx xxxx).
2.Записую двійковий код числа 49152 в акумулятор (1100 0000 0000 0000).
3.У набірне поле записую адресу нульової комірки і натискаю кнопку «Лічильник Адрес
Інструкцій».
Адр.0 → RCR→(1111 1110 0000 0000)
А→ 4915210→(1100 0000 0000 0000)2
ЛАІ→ (0000 0000 0000)
4.Обираю потактовий режим програми натискаю на кнопку «Пуск ».
5.Записав результати виконання дослідження в таблицю:

Мнемонічни Код, що
№ Коментар
й запис обробляється
Вибір адреси першої інструкції і занесення
1 ЛАІ→РА 0000 0000 0000
її до Регістра Адреси
Вибір коду інструкції ROL з Регістра
2 РА→РД 1111 1110 0000 0000
Адреси і занесення його до Регістра Даних
Декодування інструкції у Регістрі
3 РД→РІ 1111 1110 0000 0000
Інструкцій
Запис результату в Акумулятор, після
4 А→А 0110 0000 0000 0000
циклічного зсуву вліво
Перевірка результату в Регістрі Ознак і
5 А→РО 000
встановлення прапорців
6 ЛАІ+1→ЛАІ 0000 0000 0001 підготовка адреси нової інструкції
У результаті виконання програми я отримав число (0110 0000 0000 0000)2 в акумуляторі. В
регістрі ознак змін не відбулося.

3.Дослідження інструкції JС - умовний перехід на певну комірку, якщо число у


акумуляторі додатнє (S=0).
1.Записую в комірку з адресою 0 значення двійкового коду інструкції LOAD 10
(0000 0000 0000 1010).
2.Записую в комірку з адресою 1 значення двійкового коду інструкції SUB 11
(0011 0000 0000 1011).
3.Записую в комірку з адресою 2 значення двійкового коду інструкції JP 4
(1101 0000 0000 0100).
4.Записую в комірку з адресою 4 значення двійкового коду інструкції STORE 7
(0001 0000 0000 0111).
5.Записую в комірку з адресою 10 значення двійкового коду числа 3710
(0000 0000 0010 0101).
6.Записую в комірку з адресою 11 значення двійкового коду числа 2110
(0000 0000 0001 0100)2.
7.У набірне поле записую адресу нульової комірки і натискаю кнопку «Лічильник Адрес
Інструкцій».
8.Обираю потактовий режим програми натискаю на кнопку «Пуск ».
Адр.0 – LOAD 10→(0000 0000 0000 1010)
Адр.1 – SUB 11→(0011 0000 0000 1011)
Адр.2 – JP 4→(1101 0000 0000 0100)
Адр.4 – STORE 7→(0001 0000 0000 0111)
Адр.10 → 3710 → (0000 0000 0010 0101)2
Адр.11→ 2110 → (0000 0000 0001 0100) 2
ЛАІ→ (0000 0000 0000)
№ Код, що Мнемонічний Коментар
обробляється запис
1 0000 0000 0000 ЛАІ→РА Вибір адреси першої інструкції і занесення
її до Регістра Адреси
2 0000 0000 0000 0001 РА→РД Вибір коду інструкції LOAD 10 з Регістра
Адреси і занесення його до Регістра Даних
21 0001 0000 0000 0001 РА→РД Вибір коду інструкції STORE 7 з Регістра
3 0000 0000 0000 0001 РД→РІ Декодування інструкції у Регістрі
Адреси і занесення його до Регістра Даних
Інструкцій
22
4 0001
0000 0000
0000 0000
0001 0001 РД→РІ
РІ→РА Декодування
Вибір інструкціїоперанда
адреси першого у Регістрі
Інструкцій
5
23 0000 0000
0000 0000 0001
0001 0101 РА→РД
РІ→РА Вибір
Вибір коду першого
адреси операнда
третього з пам’яті і
операнда
запис його до Регістру Даних
24 0000 0000 0010 0101 А→РД Занесення даних з Акумулятора до
6 0000 0000 0001 0110 РД→А Занесення інформації з Регістра Даних в
Регістра Даних
Акумулятор
25 0000 0000 0010 0001 РД→РА Запис даних з Регістру Даних до 7 комірки
7 0000 0000 0001 ЛАІ + 1 →ЛАІ Вибір адреси другої інструкції
8 0000 0000 0000 ЛАІ→РА Занесення адреси другої інструкції до
Регістра Адреси
9 0001 0000 0000 0001 РА→РД Вибір коду інструкції SUB 11 з Регістра
Адреси і занесення його до Регістра Даних
10 0001 0000 0000 0001 РД→РІ Декодування інструкції у Регістрі
Інструкцій
11 0000 0000 0001 РІ→РА Вибір адреси другого операнда
12 0000 0000 0001 0010 РА→РД Вибір коду другого операнда з пам’яті і
запис його до Регістру Даних
13 0000 0000 0000 1101 А - РД→А Виконання операції віднімання із
занесенням результату в Акумулятор
14 000 А→РО Встановлення прапорців Регістру Ознак
15 0000 0000 0010 ЛАІ + 1 →ЛАІ Вибір адреси третьої інструкції
16 0000 0000 0010 ЛАІ→РА Занесення адреси третьої інструкції до
Регістра Адреси
17 1101 0000 0000 0100 РА→РД Вибір коду інструкції JP 4 з Регістра
Адреси і занесення його до Регістра Даних
18 1101 0000 0000 0100 РД→РІ Декодування інструкції у Регістрі
Інструкцій
19 0000 0000 0100 РІ→ЛАІ якщо S = 0, перехід до адреси 4 інструкції
20 0000 0000 0100 ЛАІ→РА Вибір адреси інструкції і занесення її до
Регістра Адреси
В результаті виконання цієї інструкції  відбудеться перехід за адресою 0000 0000 01002. Буде
здійснено непрямий порядок виконання інструкцій. Значення РО не змінюється.

3. Скласти програму, яка реалізуватиме оператор IF (умову перевірки вибрати самостійно).


Закодувати її, ввести у симулятор та виконати її дослідження у покроковому режимі, Текст
програми оформити згідно з прикладом у теоретичній частині даних методичних вказівок.
if (a > b)then
с=a;
else
c=b;
Змінна a знаходиться у 1010 комірці, змінна b – у 1110, а змінна c – у 1210
До 10-ї комірки занесемо число 5, а до 11-ї комірки – число 10.
Адр.10→510→(0000 0000 0000 0101)2
Адр.11→1010→(0000 0000 0000 1010)2
Адреса Двійковий код Мнемонічний Коментар
комірки інструкції запис
пам’яті у
інструкції
десятково
му
коді
0 0000 0000 0000 1010 LOAD 10; завантажити до акумулятора змінну
a
1 0011 0000 0000 1011 SUB 11; відняти від змінної a змінну b
2 1001 0000 0000 0110 JP 06; якщо S= 0 (a>b), перейти до 6
комірки
3 0000 0000 0000 1011 LOAD 10; завантажити до акумулятора змінну
а
4 0001 0000 0000 1100 STORE 12; записати змінну а на місце змінної c

5 0111 1100 0000 0000 HALT; зупинити програму


6 0000 0000 0000 1011 LOAD 11; завантажити до акумулятора змінну
b
7 0001 0000 0000 1100 STORE 12 На місце змінної с запишеться
значення змінної b
8 0111 1100 0000 0000 HALT; зупинити програму

початок

ввід а, b

Так
(a-b)>0

Ні

c=b

c=a

вивід с

кінець

Як видно з програми, оператор 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-ій комірці.
Дослідження програми у покроковому режимі:
№ РО
РА РД А РІ ЛАІ
кроку (ZSC)

1-й 000000001010 0000000000001010 0000000000001010 0000000000001010 000000000001 000

2-й 000000001011 0000000000001010 1111 1111 1111 1011 0011 000000001011 000000000010 011

3-й 000000000010 1010 0000 0000 0110 1111 1111 1111 1011 1010 0000 0000 0110 000000000110 011

4-й 000000001011 0000000000001010 0000000000001010 0000000000001011 000000000111 011

5-й 000000001100 0000000000001010 0000000000001010 0001 0000 0000 1100 0000 0000 1000 011

6-й 0000 0000 1000 0111 1100 0000 0000 0000000000001010 0111 1100 0000 0000 0000 0000 1000 011

4. Розробити алгоритм і cкласти програму в інструкціях симулятора DeComp, що для


довільного числа "А" з комірки пам'яті за адресою"N" підраховує кількість "0" – для парних
номерів із списку групи. Програма виконується в автоматичному режимі.
Оскільки мій номер парний моє завдання - cкласти програму в інструкціях симулятора
DeComp, що для довільного числа "А" з комірки пам'яті за адресою"N" підраховує кількість
"0".
початок

ввід А
B=15; K=0

зсув вліво
числа А

Так
С=0 ?

Ні

K=K+1

b=B-1

Ні
B=0 ?

Так

Вивід K

кінець

А - задане число; K-кількість одиниць у числі А; B – лічильник циклу; С – ознака виходу за межі
розрядної сітки.
1.Адр.12 –K
2.Адр.13 – 1
3. Адр.14 –B
1.Записую двійковий код числа 1510 (0000 0000 0000 1111)2 в 16 комірку
2. У набірне поле записую адресу нульової комірки і натискаю кнопку «Лічильник Адреси
Інструкції».
3.Обираю автоматичний режим програми натискаю на кнопку «Пуск».
А→ 1510 →(0000 0000 0000 1111)2
ЛАІ→ (0000 0000 0000)
№ комірки Двійковий код Мнемонічний запис
Коментар
пам’яті інструкції інструкції
0 0000 0000 0001 0000 LOAD 16 Завантажити до акумулятора змінну A
1 1111 1100 0000 0000 RCL Зсуваємо число на один розряд вліво
2 0001 0000 0001 0000 STORE 16 Запис нового значення А
Умовний перехід на 8 комірку,
3 1100 0000 0000 0111 JNC 7 якщо С=0.Інакше
виконується наступний оператор
Завантаження нашого
4 0000 0000 0000 1100 LOAD 12
лічильника до акумулятора
Додаємо до нашого
5 0010 0000 0000 1101 ADD 13
Лічильника 1
Запис нового
6 0001 0000 0000 1100 STORE 12
значення лічильника
Завантаження лічильника циклу
7 0000 0000 0000 1111 LOAD 14
До акумулятора
Віднімаємо від нашого
8 0011 0000 0000 1101 SUB 13
Значення 1
Запис нового значення
9 0001 0000 0000 1111 STORE 14
Лічильника
10 1000 0000 0000 0000 JNZ 0 Перевіряємо умову виконання циклу
11 0111 1100 0000 0000 HALT Припиняємо програму
Висновок:
Після виконання даної лабораторної роботи я навчився використовувати основні
операції зсуву та переходу у системі команд навчального комп’ютера, навчився
організовувати цикли, створивши власну програму.

You might also like