Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
О
Факультет:
КН
Кафедра:
Не вказано

Інформація про роботу

Рік:
2018
Тип роботи:
Звіт до лабораторної роботи
Предмет:
ООФК

Частина тексту файла (без зображень, графіків і формул):

Міністерство науки і освіти України Технічний коледж національного університету «Львівська політехніка» ЗВІТ з лабораторної роботи №3 З предмету ОФК Львів - 2018 Мета: 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 має машинний код 1110 aaaa aaaa aaaa. Відповідно, код операції дорівнює 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 JNZ ADR Z = 0 A 0  1001 JZ ADR Z = 1 A = 0  1010 JP ADR S = 0 A > 0  1011 JM ADR S = 1 A <0  1100 JNC ADR C = 0 A 216 - 1  1101 JC ADR 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; JNZ LOOP 1 – перехід на LOOP 1, якщо у результаті виконання попередньої операції ознака Z ≠ 0, тобто вміст акумулятора не дорівнює 0, інакше – перехід на наступну адресу – 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 - для парних номерів із списку групи. Виписати результати та значення прапорців ознак. Виконання: Так як мій порядковий номер з списку групи це 1 (не парне число), я буду досліджувати інструкції ROL, RCL. JP. Інструкція ROL Циклічний зсув вліво ( розряди обертаються, не потрапляючи у ознаку переносу С) Виконаємо підготовку. В акумулятор внесемо число 4410, в комірку №0 інструкцію ROL (двійковий код 1111 1000 0000 0000). В ЛАІ введемо адресу першої інструкції. Дослідження інструкції ROL: № Мнемонічний запис Код, що обробляється Коментар  1 ЛАІ→РА 0000 0000 0000 Вибір адреси першої інструкції і занесення її до Регістра Адреси  2 РА→РД 1111 1000 0000 0000 Вибір коду інструкції ROL з Регістра Адреси і занесення його до Регістра Даних  3 РД→РІ 1111 1000 0000 0000 Декодування інструкції у Регістрі Інструкцій  4 А→А 0000 0000 0001 0110 Запис результату в Акумулятор, після циклічного зсуву вліво  5 А→РО 000 Перевірка результату в Регістрі Ознак і встановлення прапорців  В даному випадку у Регістрі ознак 1 набуло значення S. Це і є наслідком виконання інструкції циклічного зсуву ROL. Інструкція RCL Циклічний зсув вліво ( розряди обертаються, потрапляючи у ознаку переносу С). Виконаємо підготовку. В акумулятор внесемо число 110, в комірку №0 інструкцію RCL (двійковий код 1111 1100 0000 0000), в ЛАІ занесемо адресу 0-ї комірки пам’яті, де знаходиться наша інструкція. Дослідження інструкції RCL: № Мнемонічний запис Код, що обробляється Коментар  1 ЛАІ→РА 0000 0000 0000 Вибір адреси першої інструкції і занесення її до Регістра Адреси  2 РА→РД 1111 1100 0000 0000 Вибір коду інструкції RCL з Регістра Адреси і занесення його до Регістра Даних  3 РД→РІ 1111 1100 0000 0000 Декодування інструкції у Регістрі Інструкцій  4 А→А 0000 0000 0000 0000 Запис результату в Акумулятор, після циклічного зсуву вліво через C  5 А→РО 101 Перевірка результату в Регістрі Ознак і встановлення прапорців  В даному випадку у Регістрі ознак 1 набуло значення С. Це і є наслідком виконання інструкції циклічного зсуву RCL. Інструкція JP Умовний перехід на певну комірку, якщо число у акумуляторі додатнє (S=0). Виконаємо підготовку. В Акумулятор внесемо число 010 в комірку пам'яті за адресою 0 інструкцію віднімання від акумулятора числа з 4 комірки(двійковий код 0011 0000 0000 0100), в комірці 1 – умовний перехід JP (двійковий код 1010 0000 0000 0000), в 4 комірку число 510, а в ЛАІ ввести адресу першої інструкції, тобто 0000 0000 0000 Дослідження інструкції JP: № Мнемонічний запис Код, що обробляється Коментар  1 ЛАІ→РА 0000 0000 0000 Вибір адреси першої інструкції і занесення її до Регістра Адреси  2 РА→РД 0011 0000 0000 0100 Вибір коду інструкції SUB з Регістра Адреси і занесення його до Регістра Даних  3 РД→РІ 1111 1100 0000 0000 Декодування інструкції у Регістрі Інструкцій  4 РІ→РА 0000 0000 0100 Вибір адреси операнда  5 РА→РД 0000 0000 0000 0101 Вибір коду операнда з памяті і занесення його в Регістр Адреси  6 А - РД→А 1111 1111 1111 1011 Виконання операції віднімання із занесенням результату в Акумулятор  7 А→РО 011 Встановлення прапорців Регістру Ознак  8 ЛАІ + 1 →ЛАІ 0000 0000 0001 Вибір адреси наступної інструкції  9 ЛАІ→РА 0000 0000 0001 Занесення адреси інструкції до Регістра Адреси  10 РА→РД 1010 0000 0000 0000 Вибір коду інструкції JP 0 з Регістра Адреси і занесення його до Регістра Даних  11 РД→РІ 1010 0000 0000 0000 Декодування інструкції в Регістрі Інструкцій  12 ЛАІ + 1 →ЛАІ 0000 0000 0010 Якщо S=0, то перехід на 0 адресу, якщо ні – подальше виконання інструкцій   В даному випадку у Регістрі ознак 1 набуло значення S. Це і є умовою виконання інструкції умовного переходу JP. Скласти програму, яка буде реалізувати оператор IF (умову перевірки вибрати самостійно). Закодувати її, ввести у симулятор та виконати її дослідження у покроковому режимі, Текст програми оформити згідно з прикладом у теоретичній частині даних методичних вказівок. Виконання: Якщо а > 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" - для парних номерів із списку групи. Програма виконується в автоматичному режимі. Виконання: Мій порядковий номер зі списку групи - непарний, тому моя програма буде підраховувати кількість одиниць в двійковому записі числа А. А – вибране число 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, а також навчився організовувати цикли необхідної структури і використовувати їх, створивши власну програму.
Антиботан аватар за замовчуванням

30.10.2024 01:10-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!