МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТА
Кафедра ЕОМ
/
Курсова робота
з дисципліни:«Архітектура комп’ютера»
На тему:
«Проектування комп’ютера»
Варіант № 16
Анотація
В даній курсові роботі розглядаються принципи проектування комп’ютерів з архітектурою CISC. Здійснено аналіз основних принципів побудови комп’ютерів з використанням вище згаданої архітектури. Здійснено аналіз розроблених інструкцій. Подано схеми спроектованих комп’ютерів, а також опис створених форматів команд. Розглянуто алгоритм роботи розробленого симулятора та асемблера.
Зміст
Завдання для розробки спрощеного комп’ютера……………… 4
Вступ……………………………………………………………….. 5
Основні принципи побудови комп’ютерів архітектури CISC…6
Алгоритм розробки асемблера…………………………………...8
Алгоритм розробки стимулятора ………………………………10
Опис додаткового способу адресації……………………………11
Опис розроблених інструкцій……………………………………12
Функціональна схема комп’ютера до модифікації……………..18
Функціональна схема комп’ютера після модифікації..…………19
Опис розроблених форматів команд…………………………….20
Висновок……………………………………………………………22
Список Літератури………………………………………………...23
Додатки……………………………………………………………..24
Завдання для розробки спрощеного комп’ютера
Варіант №16
№
Арифметичні
Логічні
Керування
Прапорці
Адресація
1
2
3
4
5
6
7
8
1
2
3
16
2
7
11
1
2
16
2
9
ZF
2
3
4
8
Дані на проектування:
№
Мнемонічний код
Зміст
Арифметичні
2
INC regA
Збільшити на 1
7
SUB regA regB destReg
Віднімання : destReg=regA-regB
11
XSUB regA regB destReg
Віднімання і обмін операндів місцями: destReg=regAregB
Логічні
1
AND regA regB destReg
Побітове логічне І: destReg = regA & regB
2
XOR regA regB destReg
Додавання по модулю 2 destReg = regA # regB
16
CMPG regA regB destReg
Порівняти regA regB destReg= regA > regB
Керування. Умовні переходи
2
JMAE regA regB offSet
Беззнакове більше/рівно if (regA>= regB) PC=PC+1+offSet
9
JMNA regA regB offSet
Беззнакове не більше if (regA!> regB) PC=PC+1+offSet
№
Адресція
8
Базово – індексна (розробити IR та BR – базовий регістр)
№
Мнемонічний код
Зміст
Регістр ознаки нуля (ZF)
2
BSR regA destReg
Побітове сканування в зворотньому
напрямку(від старших до молодших) regA в пошуках
біта з 1 , повертає номер позиції в destReg. Якщо 1
знайдено ZF=1, інакше ZF=0
3
BSF regA destReg
Побітове сканування в прямому( від молодших
до старших) напрямку regA в пошуках біта з 1 ,
повертає номер позиції в destReg. Якщо 1 знайдено
ZF=1, інакше ZF=0
4
JE offSet
Перейти, якщо менше, if(ZF==0)PC=offset
Вступ
Архітектура рівня множинних інструкцій (Instruction Set Architecture, ISA) є межею поміж апаратним та програмним забезпеченням комп’ютера. Саме на цей рівень архітектури спирається системний програміст в розробці програмного забезпечення для прикладного програміста, а саме, ОС, утиліт, драйверів, бібліотек, компіляторів тощо.
Вже відомо, що двома основними архітектурами множини інструкцій є CISC i RISC. Фундатором CISC архітектури вважають фірму IBM з її базовою архітектурою 360, ядро якої використовують з 1964 року і до сьогодні, наприклад, в таких сучасних мейнфеймах як IBM ES/9000.
CISC – Complex Instruction Set Computer (архітектура з повною множинною інструкцій).
Лідером в розробці мікропроцесорів на основі архітектури СISC є компанія Intel зі своїми серіями х86 і Pentium. Ця архітектура є стандартом для ринку мікроком’ютерів. Для архітектури CISC характерне порівняно невелике число регістрів загального призначення; велика кількість машинних команд, деякі з яких семантично навантажені аналогічно операторам мов програмування високого рівня і виконуються за багато тактів; велика кількість методів адресації; велика кількість форматів команд різної розрядності; переважання двоадресного формату команд; наявність команд типу регістр-пам’ять.
Більшість сучасних процесорів для персональних комп'ютерів побудована за архітектурою CISC.
Останнім часом з'явилися гібридні процесори, що мають систему команд CISC, однак усередині перетворюють їх на ланцюжки RISC-команд, які й виконуються ядром процесора.
Поступове ускладнення CISC- процесорів відбувається в напрямку більш досконалого управління машинними ресурсами, а також у напрямку зближення машинних мов із мовами високого рівня.
1.Основні принципи побудови комп’ютерів архітектури CISC
Архітектурні принципи, які запропонував Джон фон Нейман:
1. Інформація кодується в двійковому представленні.
2. Інформація в комп’ютері ділиться на команди і дані.
3. Різнотипні за змістом слова розрізняються за способом застосування, а не
по способу кодування.
4. Слова інформації розміщаються в комірках пам’яті та ідентифікуються
номерами комірок – адресами слів.
5. Пам’ять є лінійною.
6. Пам’ять має довільну адресацію.
7. Команди і дані зберігаються в одній пам’яті.
8. Алгоритми представляються у вигляді послідовності керуючих слів, які
називаються командами. Команда визначається найменуванням операції
та слів інформації, які в ній приймають участь. Алгоритм записаний у
вигляді послідовності команд, називається програмою.
9. Весь набір виконуваних комп’ютером команд називається системою
команд комп’ютера.
10. Виконання обчислень, які визначені алгоритмом, являють собою
послідовне виконання команд в порядку, визначеному програмою.
Для виконання задачі на комп’ютері необхідно:
− забезпечити вибірку команди програми із його пам’яті в заданій
послідовності, організувати звернення до неї за відповідними адресами;
− забезпечити розпізнавання типів виконуваних операцій;
− організувати звернення до пам’яті за відповідними адресами для вибірки
необхідні для виконання кожної команди даних;
− організувати виконання над даними операцій відповідно до вказівок
команд;
− запам’ятати результат обчислень.
Для процесора комп'ютера із складною системою команд характерні наступні особливості:
− виконання команди за багато тактів, оскільки для цього потрібно здійснити
багаторазові операції звернення до основної пам'яті та до програмно
доступних регістрів процесора;
− орієнтація АЛП на виконання великої кількості операцій, що пов'язано з
розширеним складом системи команд;
− складна система розпізнавання команди, що пов'язано з великою кількістю
методів адресації та великою кількістю форматів команд різної
розрядності;
− програмне дешифрування команд з метою зменшення затрат обладнання;
− складна організація конвеєризації виконання команд, що пов'язано, в
першу чергу, з різнотипністю їх виконання;
− орієнтація структури на виконання команд типу регістр-пам'ять та пам'ять
пам'ять.
Основні елементи процесора - арифметико-логічний пристрій, пристрій керування і регістрова пам'ять або, як її ще називають, надоперативний запам'ятовуючий пристрій. До складу регістрової пам'яті, в свою чергу, входять наступні вузли - програмний лічильник, регістри: адреси, команди, даних, слова стану програми, а також регістровий файл, який складається з програмно доступних регістрів.
Різноманітність типів даних, форм представлення та опрацювання, необхідні дії для обробки та керування ходом виконання обчислень призводить до необхідності використання різноманітних команд – набору команд.
Кожен процесор має власний набір команд, який називається системою команд процесора.
Система команд характеризується трьома аспектами:
− формат;
− способи адресації;
− система операцій.
Форматом команди – є довжина команди, кількість, розмір, положення,
призначення та спосіб кодування полів. Команди мають включати наступні види інформації:
− тип операції, яку необхідно реалізувати в даній команді (поле
команди операції - КОП)
− місце в пам’яті звідки треба взяти перший операнд (А1);
− місце в пам’яті звідки треба взяти другий операнд (А2);
− місце в пам’яті куди треба помістити результат (А3).
КОП займає k розрядів. Ним може бути закодовано до N = 2k
різних операцій. Кількість двійкових розрядів, які відводяться під код операції, вибирається таким чином, щоб ними можна було закодувати всі виконувані в даному комп'ютері операції. Якщо деякий комп'ютер може виконувати Nc різних операцій, то мінімальна розрядність поля коду операції k визначається наступним чином: k = [log2 Nc], де вираз в дужках означає
заокруглення до більшого цілого. В нашій машині реалізовано 19 команд тобто поле КОП має займати k=[log219]=5.
Поле адреси (адресна частина) займає m розрядів. В ньому знаходяться адреси операндів. Кожна адреса займає mi розрядів, де і - номер адреси (і=1,2,...1), 1 - кількість адресних полів. Кожною адресою можна адресувати пам'ять ємністю 2 слів.
В комп’ютерах з архітектурою CISC використовується багато різноманітних способів адресації серед них:
пряма;
безпосередня;
непряма;
відносна;
безадресна
2.Алгоритм роботи розробленого асемблера
Рис. 1. Схема роботи асемблера
Загальна схема роботи асемблера (рис. 1) складається з 2 проходів. На першому проході асемблер перевіряє коректність синтаксису команд. На другому виконується генерування відповідних машинних команд, тобто числового представлення асемблерної команди.
Функція readAndParse виконує зчитування рядку асемблерної програми і декодування на відповідні поля: мітка, код операції, операнди. Отримана таким чином і декодована інструкція перевіряється на коректність: існування команди, відповідна кількість аргументів, існування міток та т. п.
Функція testRegArg перевіряє коректність використання назви регістра.
Функція testAddrArg перевіряє коректність використання адреси.
Функція labelArray перетворює відповідну мітку у адресу.
Program.as та program.mc – відповідно вхідний та вихідний файли.
3.Алгоритм роботи розробленого симулятора
Рис. 2 Функціональна схема симулятора.
Симулятор починає свою роботу ініціалізацією пам’яті та регістрів 0 значеннями (рис. 2.). Наступним кроком відбувається заванаження програми у машинних кодах в пам’ять. Далі відбувається покрокове виконання інструкцій та вивід стану на зовнішній пристрій (чи на екран консолі чи у файл).
У stateStruct зберігається стан машини – значення регістрів, пам’яті та програмний лічільник. stateStruct
Функція Run виконує обробку інструкцій з пам’яті, функція printState виводить поточний стан машини, а функція convertNum виконує перетворення числа у доповняльний код.
4.Опис додаткового способу адресації
Згідно завдання базово-індексна адресація формується шляхом додавання
бази, індексу та зміщення. Було розроблено два додаткових регістри:
BR – базовий регістр та IR – індексний регістр. У двох командах було використано новий спосіб адресації. Це команди SUB та XOR.
Ось короткий запис виконання команди SUB:
регістр1 – регістр2 = N, де N- зміщення
Під виконання команди сформується вказівник на номер регістру BR+ IR+ N, де буде зберігатися результат віднімання. Під час повторного запису у програмі команди SUB індексний регістр збільшиться на одиницю IR+1, тим самим збільшивши вказівник на номер регістру на одиницю.
При виконанні команди XOR :
регістр1 # регістр2 = N, де N використовується як зміщення та вказівник на номер регістру результату операції
В полі регістра1 вказується номер регістру де буде записуватися перший операнд. Операнд записується з пам’яті, яка визначається вказівником на адресу BR+ IR+ N. Під час повторного запису у програмі команди XOR індексний регістр збільшиться на одиницю IR+1, тим самим збільшивши вказівник на адресу пам’яті і вже наступне значення в пам’яті запишеться в регістр1.
5.Опис розроблених інструкцій
Інструкція INC regA
Здійснює збільшення значення, що знаходиться в RegA на 1.
Потактовий режим виконання:
Вміст програмного лічильника потрапляє в AddrReg.
З пам’яті Memory за адресою в AddrReg, в регістр DataReg витягаються дані.
Збільшення програмного лічильника на одиницю.
Відбувається декодування інструкції.
Зчитані дані потрапляють до InstrReg.
Дані з InstrReg подаються на вхід MUX, після чого з RegFile отримуємо перший операнд.
Отримані дані заносяться до InputReg, після чого потрапляють на вхід ALU.
Збільшення значення ALU на одиницю.
Результат потрапляє до RegFile, на місце раніше декодованого і використаного регістра.
Інструкція SUB regA regB destReg
Здійснює віднімання : destReg=regA-regB
Потактовий режим виконання:
Вміст програмного лічильника потрапляє в AddrReg.
З пам’яті Memory за адресою в AddrReg, в регістр DataReg витягаються дані.
Збільшення програмного лічильника на одиницю.
Відбувається декодування інструкції.
Зчитані дані, після опрацювання пристроєм керування, потрапляють до InstrReg.
Дані з InstrReg подаються на вхід MUX, після чого з RegFile отримуємо перший операнд.
Отримані дані заносяться до InputReg, після чого потрапляють на вхід ALU, як один із операндів.
До InstrReg потрапляє код другого операнда, дані подаються на вхід MUX, після чого з RegFile отримуємо другий операнд, який подається на другий вхід ALU.
Виконання операції в ALU.
Результат потрапляє до RegN,вказівник на якого формується шляхом додавання BR+IR+зміщення. Зміщення вказується в полі третього операнда.
Інструкція XSUB regA regB destReg
Здійснює віднімання і обмін операндів місцями: destReg=regA-regB.
Потактовий режим виконання:
Вміст програмного лічильника потрапляє в AddrReg
З пам’яті Memory за адресою в AddrReg, в регістр DataReg витягаються дані.
Збільшення програмного лічильника на одиницю.
Відбувається декодування інструкції
Зчитані дані, після опрацювання пристроєм керування, потрапляють до InstrReg
Дані з InstrReg подаються на вхід MUX, після чого з RegFile отримуємо перший операнд.
Отримані дані заносяться до InputReg, після чого потрапляють на вхід ALU, як один із операндів.
До InstrReg потрапляє код другого операнда, дані подаються на вхід MUX, після чого з RegFile отримуємо другий операнд, який подається на другий вхід ALU.
Виконання операції в ALU.
Результат потрапляє до RegFile, на місце регістру, який був розміщений, як третій операнд адресної частини команди (декодування аналогічне декодуванню перших двох регістрів).
Відбувається порівняня destReg < 0, то ZF=0, інакше ZF=1.
До InstrReg потрапляє код першого операнда, дані подаються на вхід MUX, після чого з RegFile отримуємо перший операнд, який подається на InputReg.
До InstrReg потрапляє код другого операнда, дані подаються на вхід MUX, після чого з RegFile отримуємо другий операнд, який записується до RegFile в регістр визначений у першому операнді команди.
Значення з InputReg потрапляє в ALU, а потім записується в RegFile, на місце регістра визначеного в другому операнді команди.
Інструкція AND regA regB destReg
Здійснює побітове логічне І: destReg = regA & regB.
Потактовий режим виконання:
Вміст програмного лічильника потрапляє в AddrReg.
З пам’яті Memory за адресою в AddrReg, в регістр DataReg витягаються дані.
Збільшення програмного лічильника на одиницю.
Відбувається декодування інструкції.
Зчитані дані, після опрацювання пристроєм керування, потрапляють до InstrReg.
Дані з InstrReg подаються на вхід MUX, після чого з RegFile отримуємо перший операнд.
Отримані дані заносяться до InputReg, після чого потрапляють на вхід ALU, як один із операндів.
До InstrReg потрапляє код другого операнда, дані подаються на вхід MUX, після чого з RegFile отримуємо другий операнд, який подається на другий вхід ALU.
Виконання операції в ALU.
Результат потрапляє до RegFile, на місце регістру, який був розміщений, як третій операнд адресної частини команди (декодування аналогічне декодуванню перших двох регістрів).
Інструкція XOR regA regB destReg
Додавання по модулю 2: destReg = regA # regB
Потактовий режим виконання:
Вміст програмного лічильника потрапляє в AddrReg.
З пам’яті Memory за адресою AddrReg, в регістр DataReg витягаються дані.
Збільшення програмного лічильника на одиницю.
Відбувається декодування інструкції.
З пам’яті Memory за адресою BR+IR+зміщення записуються дані в RegFile.
Зчитані дані, після опрацювання пристроєм керування, потрапляють до InstrReg.
Дані з InstrReg подаються на вхід MUX, після чого з RegFile отримуємо перший операнд.
Отримані дані заносяться до InputReg, після чого потрапляють на вхід ALU, як один із операндів.
До InstrReg потрапляє код другого операнда, дані подаються на вхід MUX, після чого з RegFile отримуємо другий операнд, який подається на другий вхід ALU.
Виконання операції в ALU.
Результат потрапляє до RegFile, на місце регістру, який був розміщений, як третій операнд адресної частини команди (декодування аналогічне декодуванню перших двох регістрів).
Інструкція CMPG regA regB destReg
Порівняти regA regB: destReg= regA > regB
Потактовий режим виконання:
Вміст програмного лічильника потрапляє в AddrReg
З пам’яті Memory за адресою в AddrReg, в регістр DataReg витягаються дані
Збільшення програмного лічильника на одиницю
Відбувається декодування інструкції
Зчитані дані, після опрацювання пристроєм керування, потрапляють до InstrReg
Дані з InstrReg подаються на вхід MUX, після чого з RegFile отримуємо перший операнд
Отримані дані заносяться до InputReg, після чого потрапляють на вхід ALU, як один із операндів
До InstrReg потрапляє код другого операнда, дані подаються на вхід MUX, після чого з RegFile отримуємо другий операнд, який подається на другий вхід ALU
Виконання операції в ALU
Результат потрапляє до RegFile, на місце регістру, який був розміщений, як третій операнд адресної частини команди (декодування аналогічне декодуванню перших двох регістрів)
Інструкція JMAЕ RegA RegB offset
Беззнакове більше/рівно if (regA>= regB) PC=PC+1+offSet
Потактовий режим виконання:
Вміст програмного лічильника потрапляє в AddrReg
З пам’яті Memory за адресою в AddrReg, в регістр DataReg витягаються дані
Збільшення програмного лічильника на одиницю
Відбувається декодування інструкції
Зчитані дані, після опрацювання пристроєм керування, потрапляють до InstrReg
Дані з InstrReg подаються на вхід MUX, після чого з RegFile отримуємо перший операнд
Отримані дані заносяться до InputReg, після чого потрапляють на вхід ALU, як один із операндів
До InstrReg потрапляє код другого операнда, дані подаються на вхід MUX, після чого з RegFile отримуємо другий операнд, який подається на другий вхід ALU
Виконання операції в ALU.
Якщо умова виконується то значення програмного лічильника потрапляє в InputReg, а потім на вхід ALU, як один із операндів
На другий вхід ALU подається зміщення, яке міститься в команді на місці третього операнда.
Виконується додавання.
Результат заноситься до програмного лічильника.
Якщо умова не виконується, то опрацьовується наступна інструкція в програмі.
Інструкція JMNA regA regB offSet
Беззнакове не більше if (regA!> regB) PC=PC+1+offSet
Потактовий режим виконання:
Вміст програмного лічильника потрапляє в AddrReg.
З пам’яті Memory за адресою в AddrReg, в регістр DataReg витягаються дані.
Збільшення програмного лічильника на одиницю.
Відбувається декодування інструкції.
Зчитані дані, після опрацювання пристроєм керування, потрапляють до InstrReg.
Дані з InstrReg подаються на вхід MUX, після чого з RegFile отримуємо перший операнд.
Отримані дані заносяться до InputReg, після чого потрапляють на вхід ALU, як один із операндів.
До InstrReg потрапляє код другого операнда, дані подаються на вхід MUX, після чого з RegFile отримуємо другий операнд, який подається на другий вхід ALU.
Виконання операції в ALU.
Якщо умова виконується то значення програмного лічильника потрапляє в InputReg, а потім на вхід ALU, як один із операндів
На другий вхід ALU подається зміщення, яке міститься в команді на місці третього операнда.
Виконується додавання.
Результат заноситься до програмного лічильника
Якщо умова не виконується, то опрацьовується наступна інструкція в програмі.
Інструкція BSR regA destReg
Побітове сканування в зворотньому напрямку(від старших до молодших) regA в пошуках біта з 1 , повертає номер позиції в destReg. Якщо 1 знайдено ZF=1, інакше ZF=0
Потактовий режим виконання:
Вміст програмного лічильника потрапляє в AddrReg
З пам’яті Memory за адресою в AddrReg, в регістр DataReg витягаються дані
Збільшення програмного лічильника на одиницю
Відбувається декодування інструкції
Зчитані дані, після опрацювання пристроєм керування, потрапляють до InstrReg
Дані з InstrReg подаються на вхід MUX, після чого з RegFile отримуємо перший операнд
Отримані дані заносяться до InputReg, після чого потрапляють на вхід ALU, як один із операндів
Виконання операції ALU
Встановлюється значення ZF в StatusReg
Результат потрапляє до RegFile, на місце регістру, який був розміщений, як другий операнд адресної частини команди
Інструкція BSF regA destReg
Побітове сканування в прямому( від молодших до старших) напрямку regA в пошуках біта з 1 ,повертає номер позиції в destReg. Якщо 1 знайдено
ZF=1, інакше ZF=0
Потактовий режим виконання:
Вміст програмного лічильника потрапляє в AddrReg
З пам’яті Memory за адресою в AddrReg, в регістр DataReg витягаються дані
Збільшення програмного лічильника на одиницю
Відбувається декодування інструкції
Зчитані дані, після опрацювання пристроєм керування, потрапляють до InstrReg
Дані з InstrReg подаються на вхід MUX, після чого з RegFile отримуємо перший операнд
Отримані дані заносяться до InputReg, після чого потрапляють на вхід ALU, як один із операндів
Виконання операції ALU.
Встановлюється значення ZF в StatusReg.
Результат потрапляє до RegFile, на місце регістру, який був розміщений, як другий операнд адресної частини команди.
Інструкція JE offSet
Перейти, якщо менше, if(ZF==0)PC=offset
Потактовий режим виконання:
1.Вміст програмного лічильника потрапляє в AddrReg
2.З пам’яті Memory за адресою в AddrReg, в регістр DataReg витягаються дані.
3.Відбувається декодування інструкції.
4. Визначається значення ZF в StatusReg.
5.Якщо ZF==0, то зчитані дані, після опрацювання потрапляють до програмного лічильника РС.
6.Виконуються інструкція програми , що відповідає адресі вмісту програмного лічильника РС.
7.Якщо ZF==1,то значення РС збільшується на одиницю і виконується наступна інструкція в програмі.
6.Функціональна схема комп’ютера до модифікації
System bus
32 bits
7.Функціональна схема комп’ютера після модифікації
System bus
32 bits
8.Опис розроблених форматів команд
Розроблена машина підтримує наступні формати:
Інструкції R-типу (add, nand,xsub,and,xor,cmpg)
Біти
Призначення
31-29
не використовуються
28-24
код операції
23-20
reg A
19-16
reg B
15-4
не використовуються
3-0
destReg
/
Інструкції I-типу (lw, sw, beq, jmae,jmna,sub )
Біти
Призначення
31-29
не використовуються
28-24
код операції
23-20
reg A
19-16
reg B
15-0
зміщення (16 біт, значення від -32768 до 32767)
/
Інструкції J-типу (jarl,bsr,bsf)
Біти
Призначення
31-29
не використовуються
28-24
код операції
23-20
reg A
19-16
reg B
15-0
не використовуються
/
Інструкції O-типу (halt,noop)
Біти
Призначення
31-29
не використовуються
28-24
код операції
23-0
не використовуються
/
Окремо слід відзначити інструкцію jne – її не можна віднести до існуючих типів інструкції, оскільки вона містить інформацію тільки про код операції та зміщення
Біти
Призначення
31-29
не використовуються
28-24
код операції
23-20
Базовий регістр BR
19-16
Індексний регістр IR
15-0
зміщення (16 біт, значення від -32768 до 32767)
/
А також інструкцію inc – її також не можна віднести до існуючих типів інструкції, вона містить інформацію про код операції та один регістр.
Біти
Призначення
31-29
не використовуються
28-24
код операції
23-20
reg A
19-0
не використовуються
/
Висновок
Отже, для процесора комп’ютера із складною системою команд характерні наступні особливості:
виконання команд за багато тактів;
орієнтація АЛП на виконання великої кількості операцій, що пов’язано з розширеним складом системи команд.
Складна конвеєризація виконання команд, що також пов’язано, в першу чергу, з різнотипністю їх виконання
Орієнтація на команди типу регістр-пам’ять та пам’ять- пам’ять.
Вказані особливості стимулюють побудову високопродуктивних
комп’ютерів.
В ході виконання курсової роботи був розроблений асемблер, який дозволяє переводити всі команди, які були подані, як вхідні дані у машинні інструкції, а також асемблер виконує всі перевірки, які потрібно виконувати згідно з завданням і у випадку помилки видає відповідне повідомлення.
Правильність роботи асемблера була перевірена за допомогою спеціально розроблених тестів, які написані за допомогою мови асемблера. Ці тести перевіряють коректність роботи реалізованих команд і директив.
Також був розроблений симулятор, який дозволяє дешифрувати всі машинні всі машинні інструкції, і згідно з командою виконати операцію, а також створюю звіт потактового виконання програми з виводом стану пам’яті і регістрів. Симулятор відповідає всім поставленим вимогам, робить перевірки на помилки і в разі їх виникнення виводить відповідне повідомлення. Також була розроблена система тестів, яка дозволила провести тестування коректності роботи симулятора. Система тестів була спрямована на виявлення помилок в розшифруванні машинних інструкцій, а також у виконанні команд.
Список літератури
Мельник А. О. Архітектура комп’ютера. Наукове видання. – Луцьк:
Волинська обласна друкарня, 2008. – 470 с.
Жмакин А. П. Архитектура ЭВМ. – СПб.: БХВ-Петербург, 2006. — 320 с:ил.
3. Таненбаум Э. Архитектура компьютера. 5-е изд. (+CD). — СПб.: Питер,
2007. — 844 с: ил.
4. Patterson D., and Hennessy J. Computer Architecture. A quantitative
Approach. Second Edition. - Morgan Kaufmann Publishers, Inc., San
Francisco, California, 1996. - 760 p.
Додатки:
Додаток №1 Код програми асемблера
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXLINELENGTH 1000
#define MAXNUMLABELS 65536
#define MAXLABELLENGTH 7 /* includes the null character termination */
// Додані команди
#define INC 0
#define SUB 1
#define XSUB 2
#define XOR 3
#define AND 4
#define CMPG 5
#define JMAE 6
#define JMNA 7
#define BSR 8
#define BSF 9
#define JE 10
// Стандартні команди
#define LW 11
#define SW 12
#define HALT 13
#define NOOP 14
#define ADD 15
#define NAND 16
#define BEQ 17
#define JALR 18
#define BR 19
#define IR 20
int readAndParse(FILE *, char *, char *, char *, char *, char *);
int translateSymbol(char labelArray[MAXNUMLABELS][MAXLABELLENGTH], int labelAddress[MAXNUMLABELS], int, char *);
int isNumber(char *);
void testRegArg(char *);
void testAddrArg(char *);
int
main(int argc, char *argv[])
{
char *inFileString, *outFileString;
FILE *inFilePtr, *outFilePtr;
int address;
char label[MAXLINELENGTH], opcode[MAXLINELENGTH], arg0[MAXLINELENGTH],
arg1[MAXLINELENGTH], arg2[MAXLINELENGTH], argTmp[MAXLINELENGTH];
int i;
int numLabels=0;
int num;
int addressField;
char labelArray[MAXNUMLABELS][MAXLABELLENGTH];
int labelAddress[MAXNUMLABELS];
if (argc != 3) {
printf("error: usage: %s <assembly-code-file> <machine-code-file>\n",
argv[0]);
exit(1);
}
inFileString = argv[1];
outFileString = argv[2];
inFilePtr = fopen(inFileString, "r");
if (inFilePtr == NULL) {
printf("error in opening %s\n", inFileString);
exit(1);
}
outFilePtr = fopen(outFileString, "w");
if (outFilePtr == NULL) {
printf("error in opening %s\n", outFileString);
exit(1);
}/* map symbols to addresses */ /* assume address start at 0 */
for (address=0; readAndParse(inFilePtr, label, opcode, arg0, arg1, arg2);
address++) {/* check for illegal opcode */
if (strcmp(opcode, "add") && strcmp(opcode, "nand") && strcmp(opcode, "inc") &&
strcmp(opcode, "sub") && strcmp(opcode, "xsub") && strcmp(opcode, "beq") &&
strcmp(opcode, "jalr") && strcmp(opcode, "xor") && strcmp(opcode, "and") &&
strcmp(opcode, "cmpg")&& strcmp(opcode, "bsf") && strcmp(opcode, "bsr") &&
strcmp(opcode, "je") && strcmp(opcode, "jmae") && strcmp(opcode, "jmna") &&
strcmp(opcode, "lw") && strcmp(opcode, "sw") && strcmp(opcode, "br") &&
strcmp(opcode, "halt") && strcmp(opcode, "noop") && strcmp(opcode, "ir") &&
strcmp(opcode, ".fill")) {printf("error: unrecognized opcode %s at address %d\n", opcode,
address);
exit(1);
}/* check register fields */
if (!strcmp(opcode, "add") || !strcmp(opcode, "nand") ||
!strcmp(opcode, "sub") || !strcmp(opcode, "xsub") ||
!strcmp(opcode, "xor") || !strcmp(opcode, "and") || !strcmp(opcode, "cmpg") ||
!strcmp(opcode, "bsr") || !strcmp(opcode, "bsf") ||
!strcmp(opcode, "jmae") || !strcmp(opcode, "jmna") ||
!strcmp(opcode, "beq") || !strcmp(opcode, "jalr") ||
!strcmp(opcode, "lw") || !strcmp(opcode, "sw")) {
testRegArg(arg0);
testRegArg(arg1);
}
if (!strcmp(opcode, "inc") || !strcmp(opcode, "br") || !strcmp(opcode, "ir")){
testRegArg(arg0);
}
if (!strcmp(opcode, "add") || !strcmp(opcode, "nand") ||
!strcmp(opcode, "xsub") ||
!strcmp(opcode, "and") || !strcmp(opcode, "cmpg")) {
testRegArg(arg2);
}/* check addressField */
if (!strcmp(opcode, "beq") || !strcmp(opcode, "sub") || !strcmp(opcode, "xor") ||
!strcmp(opcode, "lw") || !strcmp(opcode, "sw") ||
!strcmp(opcode, "jmae") || !strcmp(opcode, "jmna")) {
testAddrArg(arg2);
}
if (!strcmp(opcode, ".fill") || !strcmp(opcode, "je")) {
testAddrArg(