МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
/
Пояснювальна записка
до курсової роботи
З дисципліни
“Архітектура комп’ютерів”
На тему:
«Проектування комп’ютера»
Варіант №9
Анотація
Курсова робота складається з трьох частин: перша частина являє собою розробку програми, яка перетворює вхідну програму на мові асемблер в мову машинних кодів. В цій частині проводиться аналіз всіх команд які потрібно реалізувати, а також розробка тестів для тестування даної програми.
В другій частині здійснюється розробка симулятора, який може відсимулювати будь-який машинний код, а також розробка тестів для тестування розробленої програми.
Третя частина являє собою розробку асемблерної програми для перевірки коректності роботи моделі спрощеного комп’ютера. Програма має бути ефективною:
- не перевищувати 50 рядків;
- і не має виходити за 1000 інструкцій для будь яких вхідних даних.
Зміст
1. Конкретизовані та розширені вихідні дані для проектування 4
2. Аналіз основних принципів побудови комп’ютерів. 7
2.1. Система команд 11
2.2. Способи адресації 12
3. Аналіз принципів побудови спрощеного комп’ютера 14
3.1. Структура СК до модифікації 14
3.2. Система команд 16
3.3. Структура СК після модифікації 18
3.4. Потактове виконання команд 21
4. Результат роботи 25
Висновок 35
Список використаної літератури 36
Додаток А. Вихідний код транслятора. 37
Додаток Б. Вихідний код симулятора. 46
Конкретизовані та розширені вихідні дані для проектування
Кожен варіант складається з наступних завдань:
8 додаткових інструкцій без використання регістрів стану:
3 – арифметичні
3 – логічні
2 – керування
3 додаткові інструкції з використання регістрів стану.
Передбачити на власний вибір 3 інструкцій (з розроблених в п. 1, 2), які підтримують додатковий тип адресації.
Таблиця 1.1 – Варіант №9
№
Розряд-
ність
Арифметичні
Логічні
Керування
Прапорці
Адре-
сація
1
2
3
4
5
6
7
8
1
2
3
9
2
4
1
6
3
10
12
1
13
ZF
1
2
4
1
Визначити формати команд згідно розрядності шини даних, розміру пам’яті та регістрового файлу.
Таблиця 1.2 - Розрядність
№
Розрядність шини даних
Розмір пам’яті
Байт
Розмір регістрового файлу(к-сть регістрів)
2
24
4096
8
Реалізація додаткових команд. Необхідно реалізувати 8 додаткових команд. Серед них 3 арифметичні, 3 логічні та 2 команди керування згідно варіанту. Команди не мають повторюватися.
Таблиця 1.3 – Арифметичні команди
№
Мнемонічнй код
Зміст
4
IDIV regA regB
destReg
Знакове ділення destReg=regA/regB
1
DEC regA
Зменшити regA на 1
6
XADD regA regB destReg
Додати і обміняти операнди місцями destReg=regA+regB regA<=>regB
Таблиця 1.4 – Логічні команди
№
Мнемонічнй код
Зміст
3
SHL regA regB destReg
Логічний зсув вліво destReg=regA << regB
10
OR regA regB destReg
Логічне побітове АБО destReg=regA | regB
12
NEG regA destReg
Заміна знаку на протилежний
Таблиця 1.5 – Команди керування
№
Мнемонічнй код
Зміст
1
JMA regA regB offSet
Беззнакове більше if (regA> regB) PC=PC+1+offSet
13
JMNE regA regB offSet
Не рівно if (regA!= regB) PC=PC+1+offSet
Реалізувати додатковий спосіб адресації. Передбачити, що 3 інструкції підтримують інший вид адресації згідно варіанту. Визначення операндів, які підтримують інший спосіб адресації узгодити з викладачем.(крім безадресної)
Примітка: безадресний варіант передбачає створення стеку та реалізацію 2 додатковий команд наведених в таблиці.
Таблиця 1.6 – Додаткова адресація
№
Адресація
1
Безадресна – реалізація стеку. Максимальна глибина 32 слова по 32 розряди.
Таблиця 1.7 – Безадресні команди
Мнемонічнй код
Зміст
POP
Зчитати з стеку в 1 регістр
PUSH
Записати в стек з 1 регістру
Регістри стану: CF –регістр переносу, SF – регістр знаку, ZF – регістр 0.
Таблиця 1.8 – регістр ознаки нуля ZF
№
Мнемонічнй код
Зміст
1
CMP regA regB
Порівняти regA regB і встановити прапорці
CF
SF
ZF
regA < regB
1
1
0
regA = regB
0
0
1
regA > regB
0
0
0
3
BSR regA destReg
Побітове сканування в зворотньому напрямку(від старших до молодших) regA в пошуках біта з 1 , повертає номер позиції в destReg. Якщо 1 знайдено ZF=1, інакше ZF=0
4
JE offSet
Перейти, якщо менше, if(ZF==0)PC=offset
Аналіз основних принципів побудови комп’ютерів.
CISC (англ. Complex Instruction Set Computer — комп'ютер зі складним набором команд) — це архітектура системи команд, в якій більшість команд є комплексними, тобто реалізують певний набір простіших інструкцій процесора або шляхом зіставлення з кожною CISC-командою певної мікропрограми, або принаймні можуть бути зведені до набору таких простих інструкцій. Крім того, ознаками CISC-архітектури можна вважати також наявність великої кількості методів адресації пам'яті з можливістю безпосередньої роботи з операндами в основній пам'яті комп'ютера. Тобто, CISC-архітектури відносяться, як правило, до класу двохадресних.
Архітектури з комплексними наборами команд, розвиток яких припав на кінець 60-х — 70-ті роки пропонували програмісту досить різноманітний набір порівняно високорівневих інструкцій машинної мови, таких, наприклад, як «виклик підпрограми» або «відняти одиницю та перейти, якщо результат ненульовий», а також велику кількість способів звертання до операндів в пам'яті для полегшення роботи зі складними структурами даних. В ті часи, за відсутності повноцінних мов програмуваннявисокого рівня та відповідних компіляторів, така апаратна підтримка високорівневого інструментарію програмування могла підвищити продуктивність праці програміста. До того ж, програма, складена з таких команд займала небагато в пам'яті комп'ютера.
Типовими прикладами CISC-архітектур були системи VAX, PDP-11, IBM System/360, сімейства мікропроцесорів Motorola 68000 та Intel x86.
Але з появою високорівневих мов та оптимізуючих компіляторів, розвитком електроніки, який спричинив здешевлення комп'ютерної пам'яті виявилось, що використання високорівневих машинних команд суттєво обмежує можливості до оптимізації програми, підвищення її швидкодії.
Зокрема, складні команди потребували багато часу на процедуру декодування, потребували багато апаратурних ресурсів для реалізації, що негативно відображалось на загальній швидкодії та складності системи. Далі, наявність спеціальних команд, таких як «виклик підпрограми» не завжди виправдовувала себе, в багатьох випадках доцільніше було б замість такої загальної команди використати набір елементарніших інструкцій, які в результаті спричиняли б виконання меншої кількості обчислень процесором. Це стосувалось і обчислювальних команд, які підтримували роботу з операндами в повільній пам'яті, що далеко не завжди давало оптимальний результат. Набагато ефективніше було б відокремити процедури роботи з пам'яттю (завантаження та збереження операндів) від проведення обчислень, що дало б можливість оптимізувати процедури звертання до запам'ятовуючого пристрою. Зрозуміло, що ці оптимізації повинні були виконуватись вже компіляторами з мов високого рівня, які до того часу досягли досить високого рівня функціональності.
Ці та інші проблеми CISC-архітектур призвели до створення в 80-ті роки RISC-архітектур (від англ. Reduced Instruction Set Computer — комп'ютер зі скороченим набором команд), які вибудовують прямо протилежну модель системи команд з максимальним спрощенням семантики машинної команди, зведенням її до елементарної, мінімізацією методів адресації пам'яті тощо та принциповою орієнтацією на мови високого рівня й оптимізуючі компілятори з них, аніж на програмування безпосередньо в машинних мовах.
Сучасні CISC-архітектури, такі як останні втілення сімейства процесорів x86, хоч і відповідають CISC-концепції на рівні архітектури системи команд, але всередині процесора реалізують якраз пристосованішу до сьогоднішніх реалій RISC-модель, трансформуючи потік CISC-команд в процесі виконання в набори з простіших RISC-мікрооперацій, які й виконуються процесором.
Для виконання задачі на комп’ютері необхідно:
забезпечити вибірку команди програми із його пам’яті в заданій послідовності, організувати звернення до неї за відповідними адресами;
забезпечити розпізнавання типів виконуваних операцій;
організувати звернення до пам’яті за відповідними адресами для вибірки необхідних для виконання кожної команди даних;
організувати виконання над даними операцій відповідно до вказівок команд;
запам’ятати результат обчислень.
Комп'ютер виконує кожну команду як послідовність простих операцій:
Вибірка чергової команди із основної пам'яті.
Визначення типу вибраної команди, тобто її дешифрування.
Визначення адрес даних, необхідних для виконання цієї команди.
Виконання операцій пересилання даних (зчитування даних із пам'яті в регістри процесора).
Виконання операції відповідно до її коду в полі коду операції команди.
Визначення адрес, за якими запам'ятовуються результати.
Запам'ятовування результатів.
Підготовка до виконання наступної команди, тобто обчислення її адреси.
Для процесора комп'ютера із складною системою команд характерні наступні особливості:
виконання команди за багато тактів, оскільки для цього потрібно здійснити багаторазові операції звернення до основної пам'яті та до програмно-доступних регістрів процесора;
орієнтація АЛП на виконання великої кількості операцій, що пов'язано з розширеним складом системи команд;
складна система розпізнавання команди, що пов'язано з великою кількістю методів адресації та великою кількістю форматів команд різної розрядності;
програмне дешифрування команд з метою зменшення затрат обладнання;
складна організація конвеєризації виконання команд, що пов'язано, в першу чергу, з різнотипністю їх виконання;
орієнтація структури на виконання команд типу регістр-пам'ять та пам'ять-пам'ять.
Основні елементи процесора - арифметико-логічний пристрій, пристрій керування і регістрова пам'ять або, як її ще називають, надоперативний запам'ятовуючий пристрій. До складу регістрової пам'яті, в свою чергу, входять наступні вузли - програмний лічильник, регістри: адреси, команди, даних, слова стану програми, а також регістровий файл, який складається з програмно доступних регістрів.
Структура регістрової (надоперативної) пам'яті процесора складається з регістрів спеціального та зального призначення. До регістрів спеціального призначення належать:
регістри адреси (РгА);
регістри команд (РгК);
програмний лічильник(ПЛ)
регістри даних (РгД).
РгА зберігає адресу даного або команди при зверненні до основної пам'яті. РгД зберігає операнд при його запису або зчитуванні з основної пам'яті. В ролі операнда може бути дане, команда або адреса. РгК зберігає команду після її зчитування з основної пам'яті. ПЛ підраховує команди та зберігає адресу поточної команди. Комп'ютер з архітектурою Джона фон Неймана має один програмний лічильник.
2.1. Система команд
Різноманітність типів даних, форм представлення та опрацювання, необхідні дії для обробки та керування ходом виконання обчислень призводить до необхідності використання різноманітних команд – набора команд.
Кожен процесор має власний набір команд, який називається системою команд процесора.
Система команд характеризується трьома аспектами:
формат,
способи адресації,
система операцій.
Форматом команди – є довжина команди, кількість, розмір, положення, призначення та спосіб кодування полів. Команди мають включати наступні види інформації:
тип операції, яку необхідно реалізувати в даній команді (поле команду операції - КОП);
місце в пам’яті звідки треба взяти перший операнд (А1);
місце в пам’яті звідки треба взяти другий операнд (А2);
місце в пам’яті куди треба помістити результат (А3).
Кожному з цих видів інформації відповідає своя частина двійкового слова – поле. Реальна система команд зазвичай має команди декількох форматів, тип формату визначає КОП.
Команда в комп'ютері зберігається в двійковій формі. Вона вказує тип операції, яка має бути виконаною, адреси операндів, над якими виконується операція, та адреси розміщення результатів виконання операції. Відповідно до цього команда складається з двох частин, коду операції та адресної частини.
. Способи адресації
Варіанти інтерпретації бітів (розрядів) поля адреси з метою знаходження операнда називаються способами адресації. Коли команда вказує на операнд, він може знаходитись в самій команді, в основній або зовнішній пам'яті чи в регістровій пам'яті процесора. За роки існування комп'ютерів була створена своєрідна технологія адресації, яка передбачає реалізацію різних способів адресації, чому послужило ряд причин:
забезпечення ефективного використання розрядної сітки команди;
забезпечення ефективної апаратної підтримки роботи з масивами даних;
забезпечення задання параметрів операндів;
можливість генерації великих адрес на основі малих.
Існує велика кількість способів адресації. Розглянемо п’ять основних способів адресації операндів в командах.
Пряма – в цьому випадку адресне поле зберігає адресу операнда. Її різновидом є пряма регістрова адресація, яка адресує не комірку пам’яті а номер регістру.
Безпосередня – в поле адреси команди поміщається не адреса, а сам операнд.
Непряма – в полі адреси команди зберігається адреса комірки пам’яті в якій знаходиться адреса операнда. Такій спосіб дозволяє оперувати з адресами як з даними. Різновид непряма-регістрова адресація, адреса адреси зберігається в регістрі загального призначення.
Відносна – адреса формується, як сума з двох доданків: бази, яка зберігається в спеціальному регістрі чи в одному з регістрів спеціального призначення, та зміщення, яке задається в полі адреси команди. Різновид індексна та базова індексна. При індексній замість базового регістра є індексний, який автоматично модифікується (зазвичай збільшується на 1). Базова-індексна адресація формується адреса як сума трьох доданків: бази, індексу та зміщення.
Безадресна – поле адреси в команді відсутнє. Адреса операнда, або немає змісту або є по замовчуванню(наприклад дії на спеціальним регістром - акумулятором). Безадресні команди неможливо використати для інших регістрів чи комірок пам’яті. Одним з різновидів безадресної адресації є використання стеку.
В команду вводяться спеціальні ознаки з тим, щоб пристрій керування міг розпізнати використаний спосіб. Це можуть бути додаткові розряди в команді, або для різних типів команд закріплюватись різні способи адресації.
Аналіз принципів побудови спрощеного комп’ютера
Структура СК до модифікації
/
Рис. 3.1. Функціональна схема СК до модифікації
В спрощеному комп’ютері (СК) в пам’яті зберігаються, як дані так і інструкції. Кожна інструкція закодована числом. Це число складається з декількох полів: поле назви команди чи код операції (КОП) та полів операндів. В СК є два види пам’яті: загальна пам’ять, та регістрова пам’ять. В загальній пам’яті зберігаються інструкції програми та дані над якими оперують інструкції. В регістровий пам’яті зберігаються дані над якими виконуються інструкції. У реальних комп’ютерах регістрова пам’ять є малою за розмірами та швидкою, працює на швидкості ядра процесора, загальна пам’ять є великою за розміром, але набагато повільніша за ядро процесора. Регістрова пам’ять підтримує лише пряму адресацію, загальна пам’ять підтримує декілька типів адресації.
У СК є 8 регістрів по 32 розряди, пам’ять складається з 65536 слів по 32 розряди. Отже СК є 32 розрядним комп’ютером. Він підтримує 8 інструкцій, кожна з яких розписана нижче. У СК є спеціальний регістр лічільник команд (ЛК).
За прийнятою домовленістю 0вий регістр завжди містить 0 (це не обмовлено апаратними вимогами проте асемблерна програма ніколи не має змінювати значення 0ого регістра, який ініціалізуються 0 ).
/
Рис.3.2. Формат СК
СК підтримує 4 формати інструкцій. Біти 31-25 не використовує жодна інструкція тому вони завжди мають дорівнювати 0.
Інструкції R-типу (add, nand):
біти 24-22: код операції
біти 21-19: reg A
біти 18-16: reg B
біти 15-3: не використовуються ( =0)
біти 2-0: destReg
/
Рис.3.3. Інструкція R-типу
I-тип інструкцій (lw, sw, beq):
біти 24-22: код операції
біти 21-19: reg A
біти 18-16: reg B
біти 15-0: зміщення (16 біт, значення від -32768 до 32767)
/
Рис.3.4. Інструкція I-типу
J-тип інструкцій:
біти 24-22: код операції
біти 21-19: reg A
біти 18-16: reg B
біти 15-0: не використовуються ( =0)
O-тип інструкцій (halt, noop):
біти 24-22: код операції
біти 21-0: не використовуються ( =0)
Система команд
Таблиця 1.9. Система команд
№
Мнемонічний код
інструкції
КОП
Опис операції
1
ADD regA regB destReg
00000
Додає вміст регістру regA до вмісту regB, та зберігає в destReg
2
NAND regA regB destReg
00001
Виконує логічне побітове І-НЕ вмісту regA з вмістом regB, та зберігає в destReg
3
LW regA regB offset
00010
Завантажує regB з пам’яті. Адреса пам’яті формується додаванням зміщення до вмісту regA.
4
SW regA regB offset
00011
Зберігає вміст регістру regB в пам’ять. Адреса пам’яті формується додаванням зміщення до вмісту regA.
5
BEQ regA regB offset
00100
Якщо вміст регістрів regA та regB однаковий, виконується перехід на адресу програмний лічильник(ПЛ) + 1+зміщення, в ПЛ зберігається адреса поточної тобто beq інструкції.
6
JALR regA regB
00101
Спочатку зберігає ПЛ+1 в regB, в ПЛ адреса поточної (jalr) інструкції. Виконує перехід на адресу, яка зберігається в regA. Якщо в якості regA regB задано один і той самий регістр, то спочатку в цей регістр запишеться ПЛ+1, а потім виконається перехід до ПЛ+1.
7
HALT
00110
Збільшує значення ПЛ на 1, потім припиняє виконання, стимулятор має повідомляти, що виконано зупинку.
8
IDIV regA regB
destReg
00111
Знакове ділення destReg=regA/regB
9
DEC regA
01000
Зменшити regA на 1
10
XADD regA regB destReg
01001
Додати і обміняти операнди місцями destReg=regA+regB regA<=>regB
11
SHL regA regB destReg
01010
Логічний зсув вліво destReg=regA << regB
12
OR regA regB destReg
01011
Логічне побітове АБО destReg=regA | regB
13
NEG regA destReg
01100
Заміна знаку на протилежний
14
JMA regA regB offSet
01101
Беззнакове більше if (regA> regB) PC=PC+1+offSet
15
JMNE regA regB offSet
01110
Не рівно if (regA!= regB) PC=PC+1+offSet
16
CMP regA regB
01111
Порівняти regA regB і встановити прапорці
17
BSR regA destReg
10000
Побітове сканування в зворотньому напрямку(від старших до молодших) regA в пошуках біта з 1 , повертає номер позиції в destReg. Якщо 1 знайдено ZF=1, інакше ZF=0
18
JE offSet
10001
Перейти, якщо менше, if(ZF==0)PC=offset
19
PUSH regA
10010
Записує значення regA в вершину стеку.
20
POP regA
10011
Зчитує значення з вершини стеку і заносить в regA.
Структура СК після модифікації
/
Рис. 3.5. Функціональна схема СК після модифікації.
Після модифікації відбулись зміни :
Зменшилась шина данних (з 32бітів до 24 бітів).
Додано 8 додаткових операцій:
3 арифметичні операції (IDIV, XADD, DEC);
3 логічні операції (SHL, OR, NEG);
2 операції керування (JMA, JMNE).
Було додано прапорець ZF, з яким працюють команди CMP, BSR, JE.
Зменшилась пам’ять (з 65535 слів до 4096).
Число регістрів залишилось незмінним (8).
Додано 2 команди (PUSH/POP) для збереження/завантаження даних при безадресній адресації.
Отже , СК є 24 розрядним комп’ютером. У СК є 8 регістрів по 24 розряди. Пам’ять складається з 4096 слів по 24 розряди. Він підтримує 20 інструкцій, кожна з яких буде розписана нижче.
За прийнятою домовленістю 0вий регістр завжди містить 0 (це не обмовлено апаратними вимогами проте асемблерна програма ніколи не має змінювати значення 0-ого регістра, який ініціалізуються 0 ).
СК підтримує 6 форматів інструкцій.
Інструкції R-типу (add, nand, idiv, xadd, shl, or):
біти 23-18: код операції;
біти 17-15: reg A;
біти 14-12: reg B;
біти 11-3: не використовуються (=0)
біти 2-0: destReg.
23-18
17-15
14-12
11-3
2-0
opcode
regA
regB
unused
destReg
Рис.3.6. Інструкція R-типу після модифікації.
I-тип інструкцій (lw, sw, beq, jma , jmne):
біти 23-18: код операції;
біти 17-15: reg A;
біти 14-12: reg B;
біти 11-0: зміщення (12 біт, значення від -2048 до 2047).
23-18
17-15
14-12
11-0
opcode
regA
regB
Offset
Рис.3.7. Інструкція I-типу після модифікації.
J-тип інструкцій (jalr, neg, cmp, bsr):
біти 23-18: код операції;
біти 17-15: reg A;
біти 14-12: reg B;
біти 11-0: не використовуються (=0)
23-18
17-15
14-12
11-0
opcode
regA
regB
Unused
Рис.3.8. Інструкція J-типу після модифікації.
Інструкції S-типу (push, pop, dec):
біти 23-18: код операції;
біти 17-15: reg A;
біти 14-0: не використовуються;
23-18
17-15
14-0
opcode
regA
Unused
Рис.3.9. Інструкція S-типу після модифікації.
Інструкції K-типу (JE):
біти 23-18: код операції;
біти 17-12: не використовуються;
біти 11-0: зміщення (12 біт, значення від -2048 до 2047).
23-18
17-12
11-0
opcode
Unused
Offset
Рис.3.10. Інструкція K-типу після модифікації.
O-тип (halt):
біти 43-39: код операції;
біти 38-0: не використовуються.
23-18
17-0
opcode
Unused
Рис.3.11. Інструкція O-типу після модифікації.
Прапорець нуля (англ. Zero flag) – використовується в командах CMP, BSR, JE (команда CMP впливає на стан прапорців CF, SF i ZF, BSR – побітове сканування, JE – команда переходу).
Потактове виконання команд
Інструкції add, nand, idiv, xadd, shl, or:
memAddr <= PC;
PC++; mem (встановлення адреси);
instrReg <= mem[memAddr];
aluOP <= Reg[instrReg[17-15]]
aluRes <=aluOP operation Reg[IR[14-12]];
Reg[instrReg[2-0]] <= aluRes;
Інструкції lw, sw, beq, jma , jmnle:
sw/lw
memAddr <= PC;
PC++; mem (встановлення адреси);
instrReg <= mem[memAddr];
memAddr <= Reg[instrReg[14-12]] + instrReg [11-0];
memData <= mem[mamAddr]; or mem[mamAddr] <= memData then Reg[instrReg[14-12]] <= mem[Addr];
умовних переходів
memAddr <= PC;
PC++; mem (встановлення адреси);
IR <= mem[memAddr];
aluRes <= Reg[instrReg [17-15]] logic_operation Reg[instrReg [14-12]];
Якщо умова виконується, то:
PC <= PC + instrReg[11-0] + 1;
Інструкції jalr, cmp, neg, bsr :
Jalr:
memAddr <= PC;
PC++; mem (встановлення адреси);
IR <= mem[memAddr];
Reg[instrReg [24-20]] <= PC;
PC <= Reg[instrReg[29-25]];
If Reg[instrReg[29-25]] = Reg[instrReg [24-20]] then:
Reg[instrReg[29-25]] <= PC+1;
PC <= Reg[instrReg[29-25]];
neg:
memAddr <= PC;
PC++; mem (встановлення адреси);
IR <= mem[memAddr];
Reg[instrReg[14-12]] <= - Reg[instrReg [17-15]]
bsr:
memAddr <= PC;
PC++; mem (встановлення адреси);
IR <= mem[memAddr];
Reg[instrReg[14-12]] <= Reg[instrReg [17-15]] >> cycle bits
If bit == 1 then ZF <= 1
Reg[instrReg[14-12]] <= NumberOfBits[Reg[instrReg [17-15]]].
Break.
Cmp:
memAddr <= PC;
PC++; mem (встановлення адреси);
IR <= mem[memAddr];
If Reg[instrReg[17-15]] < Reg[instrReg [14-12]] then:
CF = 1; SF=1; ZF=0;
If Reg[instrReg[17-15]] = Reg[instrReg [14-12]] then:
CF = 0; SF=0; ZF=1;
If Reg[instrReg[17-15]] > Reg[instrReg [14-12]] then:
CF = 0; SF=0; ZF=0;
Інструкції halt:
memAddr <= PC;
PC++; mem (встановлення адреси);
IR <= mem[memAddr];
Stop.
Інструкції push, pop:
push
memAddr <= PC;
PC++; mem (встановлення адреси);
IR <= mem[memAddr];
StackTop != MaxWordsOfStack
If true then
StackTop <= StackTop+1;
StackData <= Reg[instrReg [17-15]];
Stack[StackTop] <= StackData;
NumberOfStack <= NumberOfStack+1;
If false then
Exit
pop
memAddr <= PC;
PC++; mem (встановлення адреси);
IR <= mem[memAddr];
StackTop != MinWordsOfStack
If true then
StackData <= Stack[StackTop];
Reg[instrReg [17-15]] <= StackData;
Stack[StackTop] <= 0;
StackTop < StackTop - 1;
If false then
Exit
JE
memAddr <= PC;
PC++; mem (встановлення адреси);
IR <= mem[memAddr];
If ZF == 0 then PC <= Offset[instrReg[11-0]].
Результат роботи
Для перевірки коректної роботи процесора написані спеціальні програми. Ці програми використовують усі наявні команди, що були розроблені в даному процесорі.
Програма для перевірки команд IDIV, XADD, SHL, DEC, LW, BEQ, NEG.
Код програми
lw 0 1 x1
lw 0 2 x2
start idiv 1 2 4
xadd 1 2 3
shl 1 2 1
dec 2
beq 2 0 done
beq 0 0 start
done neg 2 2
halt
x1 .fill 8
x2 .fill 2Результат виконання:
@@@
state:
pc 0
memory:
mem[ 0 ] 528394
mem[ 1 ] 532491
mem[ 2 ] 1875972
mem[ 3 ] 2400259
mem[ 4 ] 2662401
mem[ 5 ] 2162688
mem[ 6 ] 1114113
mem[ 7 ] 1114106
mem[ 8 ] 3219456
mem[ 9 ] 1572864
mem[ 10 ] 8
mem[ 11 ] 2
registers:
reg[ 0 ] 0
reg[ 1 ] 0
reg[ 2 ] 0
reg[ 3 ] 0
reg[ 4 ] 0
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
Stack Top: -1
Stack:
Flags:
CF 0
SF 0
ZF 0
end state
/**********************************************************/
machine halted
total of 10 instructions executed
final state of machine:
@@@
state:
pc 10
memory:
mem[ 0 ] 528394
mem[ 1 ] 532491
mem[ 2 ] 1875972
mem[ 3 ] 2400259
mem[ 4 ] 2662401
mem[ 5 ] 2162688
mem[ 6 ] 1114113
mem[ 7 ] 1114106
mem[ 8 ] 3219456
mem[ 9 ] 1572864
mem[ 10 ] 8
mem[ 11 ] 2
registers:
reg[ 0 ] 0
reg[ 1 ] 512
reg[ 2 ] -7
reg[ 3 ] 10
reg[ 4 ] 4
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
Stack Top: -1
Stack:
Flags:
CF 0
SF 0
ZF 0
end state
Перевірка виконання команд: BSR.
Код програми:
lw 0 1 x1
lw 0 2 x2
lw 0 3 x3
bsr 2 4
halt
x1 .fill 10
x2 .fill 262144
x3 .fill 15Результат обчислень:
@@@
state:
pc 0
memory:
mem[ 0 ] 528389
mem[ 1 ] 532486
mem[ 2 ] 536583
mem[ 3 ] 4276224
mem[ 4 ] 1572864
mem[ 5 ] 10
mem[ 6 ] 262144
mem[ 7 ] 15
registers:
reg[ 0 ] 0
reg[ 1 ] 0
reg[ 2 ] 0
reg[ 3 ] 0
reg[ 4 ] 0
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
Stack Top: -1
Stack:
Flags:
CF 0
SF 0
ZF 0
end state
/**********************************************************/
machine halted
total of 5 instructions executed
final state of machine:
@@@
state:
pc 5
memory:
mem[ 0 ] 528389
mem[ 1 ] 532486
mem[ 2 ] 536583
mem[ 3 ] 4276224
mem[ 4 ] 1572864
mem[ 5 ] 10
mem[ 6 ] 262144
mem[ 7 ] 15
registers:
reg[ 0 ] 0
reg[ 1 ] 10
reg[ 2 ] 262144
reg[ 3 ] 15
reg[ 4 ] 18
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
Stack Top: -1
Stack:
Flags:
CF 0
SF 0
ZF 1
end state
Перевірка виконання команд: OR, NEG, JMA, JMNE.
Код програми
lw 0 1 x1
lw 0 2 x2
lw 0 3 x3
start or 1 2 1
neg 3 3
jma 3 2 done
jmne 0 0 start
done halt
x1 .fill 10
x2 .fill 5
x3 .fill 15Результат виконання:
@@@
state:
pc 0
memory:
mem