Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab3_OFK.docx
Скачиваний:
3
Добавлен:
26.11.2019
Размер:
115 Кб
Скачать
☆

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 - циклічнізсуви через ознаку С (розрядиобертаються через ознаку переносу С).

Порядок виконанняроботи:

  1. Вивчититеоретичнівідомостями до лабораторноїроботи № 3.

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

  1. інструкція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

підготувати адресу наступноїінструкції

  1. інструкція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

підготувати адресу наступноїінструкції

  1. інструкція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

  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

  1. Розробити алгоритм і 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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]