Міністерствоосвіти і науки України
Національний університет „Львівська політехніка”
Кафедра CКС
Звіт
з лабораторної роботи № 3
з дисципліни: “Організація та функціонування комп’ютерів”
на тему: “Дослідженняінструкційпереходів і зсувів.
Організаціяциклів. ”
2010
Тема: Дослідження інструкцій переходів і зсувів. Організаціяциклів.
Мета роботи: 1. Засвоїтивикористанняосновнихінструкційзсуву і переходів у системі
команд навчальногокомп'ютераDeComp.
2. Навчитисьорганізовувати цикли необхідноїстуктури і використовуватиїх
у програмах.
Теоретичнівідомості:
Інструкції, з якими ми будемознайомитисяуданійроботіскладаютьдвігрупи:
1) інструкціїкеруваннявиконаннямпрограми:
інструкціязупинки (HALT);
інструкціїумовнихпереходів (JNZ, JZ, JP, JM, JNC та JC);
інструкціябезумовного переходу (JMP);
2) інструкціїзсувів (вліво (Left) та вправо (Right)):
інструкціїлогічногозсуву (LSL та LSR);
інструкціїарифметичногозсуву (ASL та ASR);
інструкціїциклічногозсуву (ROL та ROR);
інструкціїциклічногозсуву через перенос C (RCL та RCR).
1.1. Розглянемоінструкціїпереходів.
Їх головне призначення – зміна звичайного порядку виконання інструкцій. У всіх інструкціях, за винятком інструкцій переходів, на останньому кроці адреса наступної інструкці ївизначається шляхом додавання 1 до ЛАІ. У інструкціях переходів 12 розрядів адресної частини містять нову адресу наступної інструкції. В результаті наступною післяінструкції переходу буде не та інструкція, яка знаходиться у пам’яті зразу післяінструкції переходу, а інструкція, яка може знаходитись у будь-якій іншій комірці пам’яті, на яку вкаже адреса у інструкції переходу.
Інструкція безумовного переходу JMP ADRмаємашинний код 1110aaaaaaaaaaaa.
Відповідно, код операції дорівнює1110, а рештарозрядів – адресначастина. Мікропрограма виконання інструкції JMP маєнаступнийвигляд:
ЛАІ ( РА;
РА ( РД;
РД (РІ, декодування;
РІ ( ЛАІ – перехід на вказану адресу відбувається без будь-яких попередніх умов.
Як видно, інструкціябезумовного переходу JMP просто записує до ЛАІ значеннясвоєїадресноїчастини і програма буде змушенавиконатиінструкцію, що записана укомірціпам’яті за цієюадресою. ІнструкціяJMPфактично є реалізацією оператора GOTO у мовахпрограмуванняPascal, Basic та ін.
Призначенняінструкційумовного переходу (JNZ, JP тощо)дещоінше: у залежностівідвиконаннячи невикогаггяумови, зазначеної у алгоритміпрограми, перехідабо буде здійснюватись, або не буде. Контроль виконанняумовиздійснюєРегістрОзнак шляхом встановленнячи не встановленнявідповідноготригера. (див. методичніматеріали до лабораторноїроботи № 2).
Якщоумовавиконується, тодінаступною буде виконуватисяінструкція, яка розміщенаукомірціпам’яті, номер якоївказаний у адреснійчастині коду інструкції.
Якщоумоване виконується, тодінаступною буде виконуватисяінструкція, яка знаходитьсявідразу в сусіднійкомірціпам’яті з коміркоюінструкції переходу.
Фактичноінструкціїумовного переходу дозволяютьреалізуватиоператорирозгалуженняIF та циклівFOR абоWHILE. Наприклад, фрагменту програми на мовіPascal
if (a < b) then
c:= a;
else
c:= b;
при реалізаціїйого у навчальномукомп’ютеріDeComp (причому, зміннаaзнаходиться у 10-й комірці, зміннаb – у 11-й, а зміннаc – у 12-й) відповідатиметакий фрагмент програмиумашинних кодах:
№ коміркипам’яті
Двійковий код інструкції
Мнемонічнийзапис
інструкції
Коментар
0000 0000 0000
0000 0000 0000 1010
LOAD 10;
завантажити до акумуляторазміннуa
0000 0000 0001
0011 0000 0000 1011
SUB 11;
віднятивідзмінноїaзміннуb
0000 0000 0010
1100 0000 0000 0110
JNC 06;
якщоC = 0 (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таумовногопереходузаумовивідсутностіпереносу C - JNC: якщопривідніманнівідзмінноїa (розміщеноїуакумуляторі) змінноїb (розміщеноїу 11-йкомірці) невиникаєпереносу, цеозначає,щоa > b, азначить, необхідно “перескочити” фрагмент, девиконуєтьсяc:= a (блокінструкцій LOAD, STORE та HALT у 3-й, 4-йта 5-йкомірках), іпочативиконуватифрагментc:= b (блокінструкцій LOAD, STORE та HALT у 6-й, 7-йта 8-йкомірках). Отже, у навчальномукомп’ютеріDeCompмаємотакіінструкціїумовнихпереходів (результат – число Азнаходиться в акумуляторі):
Двійковий код
інструкції
Мнемонічний
запис інструкції
Значення ознаки, яка перевіряється
Значення
результату, що розміщений в акумуляторі
1000;
JNZADR
Z = 0
A( 0
1001
JZADR
Z = 1
A = 0
1010
JP ADR
S = 0
A > 0
1011
JMADR
S = 1
A <0
1100
JNCADR
C = 0
A( 216 – 1
1101
JCADR
C = 1
A( 216 – 1
При дослідженніінструкційпереходів у потактовому режимі видно, щоїххідвідрізняєтьсявідрозглянутого у прикладі, наведеному у лабораторнійробті № 2. Для прикладу, мікропрограмаінструкціїJMматимевигляд:
№
Мнемонічний
записмікрооперації
Коментар
1
ЛАІ ( РА;
вибірадреси 1-ої інструкції і занесенняїї до регістру РА
2
РА ( РД;
вибір коду інструкції з РА і занесенняйого до регістру РД
3
РД (РІ;
декодуванняіперевіркарегіструознак РО
4
РІ ( ЛАІ
якщоS = 1, інакше 5)
5
ЛАІ + 1 ( ЛАІ
якщоS = 0
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 - циклічнізсуви через ознаку С (розрядиобертаються через ознаку переносу С).
Порядок виконанняроботи:
Вивчититеоретичнівідомостями до лабораторноїроботи № 3.
Дослідити употактовомурежиміінструкціїROL, RCL. JP - для непарнихномерівіз списку групи, ROR, RCR, JC - для парнихномерівіз списку групи. Виписати результати та значення прапорців ознак.
інструкція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
підготувати адресу наступноїінструкції
інструкція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
підготувати адресу наступноїінструкції
інструкція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
Скластипрограму, яка реалізуватиме оператор 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
Розробити алгоритм і cкластипрограмувінструкціях симулятора DeComp, що для довільного числа "А" з коміркипам"ятіза адресою"N" підраховує кількість"1" - для непарнихномерівіз списку групи, і підраховуєкількість"0" - для парнихномерівіз списку групи. Програмавиконуєтьсявавтоматичномурежимі.
так
ні
так
ні
№ коміркипам’яті
Двійковий код інструкції
Мнемонічнийзапис
інструкції
Коментар
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.
Оформити та захиститизвіт з лабораторноїроботи.
Висновок: на лабораторній роботі я дослідив інструкції переходів та зсувів, навчився організовувати цикли та склав власну програму, у якій використовувались попередньо здобуті знання.