Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
КУРСОВА РОБОТА
з курсу: «Архітектура комп’ютерів»
на тему: „Проектування комп’ютера”
Львів-2015
Анотація
Мета курсової роботи полягає в опануванні студентом знать про принципи дії та архітектуру прототипних варіантів CISC – комп’ютера. Крім того курсовий проект допоможе зрозуміти інструкції простої асемблерної мови та як транслювати програми в машину мову.
Курсова роботи складається з трьох частин. В першій частині розробляється програма, яка перетворює вхідну асемблерну мову у відповідний код на мові машинних інструкцій. В другій частині розробляється поведінковий стимулятор результуючого машинного коду. В третій частині розробляється невеличка програма на асемблерній мові.
Зміст
Вступ………………….. …………………………………………………………...4
Конкретизовані та розширені вихідні дані на проектування………………….. 7
ТЕОРЕТИЧНА ЧАСТИНА……………………………………………………….9
Способи адресації…………………………………………………………..9
Стекова адресація………………………………………………………….10
Система команд…………………………………………………………....11
Функціональна схема модифікованого комп’ютера…………………….14
Асемблерна мова та асемблер…………………………………………….17
Поведінкова симуляція……………………………………………………19
Формати інструкцій………………………………………………………. 20
ПРАКТИЧНА ЧАСТИНА………………………………………………………..24
Результати роботи………………………………………………………………...24
Тест №1……………………………………………………………………..25
Тест №2……………………………………………………………………..26
Тест №3……………………………………………………………………..27
Тест №4……………………………………………………………………..29
Тест №5……………………………………………………………………..30
Висновок………………………………………………………………………..... 31
Список використаної літератури………………………………………………...32
Додаток А – Лістинг програми asol.c …………………………………………...33
Додаток Б – Лістинг програми ssol.c …………………………………………....42
Вступ
В ході виконання даного курсового проекту передбачає ознайомлення та опанування архітектуру CISC – комп’ютера. Основні принципи даної архітектури, які запропонував Джон фон Нейман:
1. Інформація кодується в двійковому представленні.
2. Інформація в комп’ютері ділиться на команди і дані.
3. Різнотипні за змістом слова розрізняються за способом застосування, а не по способу кодування.
4. Слова інформації розміщаються в комірках пам’яті та ідентифікуються номерами комірок – адресами слів.
5. Пам’ять є лінійною.
6. Пам’ять має довільну адресацію.
7. Команди і дані зберігаються в одній пам’яті.
8. Алгоритми представляються у вигляді послідовності керуючих слів, як називаються командами. Команда визначається найменуванням операції та слів інформації, які в ній приймають участь. Алгоритм записаний у вигляді послідовності команд, називається програмою.
9. Весь набір виконуваних комп’ютером команд називається системою команд комп’ютера.
10. Виконання обчислень, які визначені алгоритмом, являють собою послідовне виконання команд в порядку визначеному програмою. Для виконання задачі на комп’ютері необхідно:
- забезпечити вибірку команди програми із його пам’яті в заданій послідовності, організувати звернення до неї за відповідними адресами;
- забезпечити розпізнавання типів виконуваних операцій;
- організувати звернення до пам’яті за відповідними адресами для вибірки необхідних для виконання кожної команди даних;
- організувати виконання над даними операцій відповідно до вказівок команд;
- запам’ятати результат обчислень.
Комп'ютер виконує кожну команду як послідовність простих операцій:
1. Вибірка чергової команди із основної пам'яті.
2. Визначення типу вибраної команди, тобто її дешифрування.
3. Визначення адрес даних, необхідних для виконання цієї команди.
4. Виконання операцій пересилання даних (зчитування даних із пам'яті в регістри процесора).
5. Виконання операції відповідно до її коду в полі коду операції команди.
6. Визначення адрес, за якими запам'ятовуються результати.
7. Запам'ятовування результатів.
8. Підготовка до виконання наступної команди, тобто обчислення її адреси. Для процесора комп'ютера із складною системою команд характерні наступні особливості:
- виконання команди за багато тактів, оскільки для цього потрібно здійснити багаторазові операції звернення до основної пам'яті та до програмно-доступних регістрів процесора;
- орієнтація АЛП на виконання великої кількості операцій, що пов'язано з розширеним складом системи команд;
- складна система розпізнавання команди, що пов'язано з великою кількістю методів адресації та великою кількістю форматів команд різної розрядності;
- програмне дешифрування команд з метою зменшення затрат обладнання;
- складна організація конвеєризації виконання команд, що пов'язано, в першу чергу, різнотипністю їх виконання;
- орієнтація структури на виконання команд типу регістр-пам'ять та пам'ять-пам'ять.
Основні елементи процесора - арифметико-логічний пристрій, пристрій керування і регістрова пам'ять або, як її ще називають, надоперативний запам'ятовуючий пристрій. До складу регістрової пам'яті, в свою чергу, входять наступні вузли - програмний лічильник, регістри: адреси, команди, даних, слова стану програми, а також регістровий файл, який складається з програмно доступних регістрів. Структура регістрової (надоперативної) пам'яті процесора складається з регістрів спеціального та зального призначення. До регістрів спеціального призначення належать:
- регістри адреси (РгА);
- регістри команд (РгК);
- програмний лічильник(ПЛ)
- регістри даних (РгД).
РгА зберігає адресу даного або команди при зверненні до основної пам'яті. РгД зберігає операнд при його запису або зчитуванні з основної пам'яті. В ролі операнда може бути дане, команда або адреса. РгК зберігає команду після її зчитування з основної пам'яті. ПЛ підраховує команди та зберігає адресу поточної команди. Комп'ютер з архітектурою Джона фон Неймана має один програмний лічильник. Більшість комп'ютерів мають в складі процесора тригери для зберігання бітів стану процесора, або, як їх іще називають, прапорців. Кожен прапорець має спеціальне призначення. Частина прапорців вказує на результати арифметичних і логічних операцій: додатній результат (Р), від'ємний результат (N), нульовий результат (Z), перенос (С), арифметичне переповнення (V), і т. д. В системі команд комп'ютера є команди, які вказують процесору коли встановити чи скинути ці тригери. Інша частина прапорців вказує режими захисту пам'яті. Існують також прапорці, які вказують пріоритети виконуваних програм. В деяких процесорах додаткові тригери служать для зберігання кодів умов, формуючи регістр кодів умов. Взяті разом описані прапорці формують слово стану програми (ССП), а відповідні тригери - регістр ССП. Регістри загального призначення (РЗП) є програмно доступними. Зазвичай 'їх називають регістровим файлом. Вони можуть використовуватись програмістом в якості регістрів для зберігання вхідних та вихідних даних, а також проміжних результатів обчислень, в якості адресних та індексних регістрів при виконанні операцій модифікації адрес.
КОНКРЕТИЗОВАНІ ТА РОЗШИРЕНІ ВИХІДНІ ДАНІ НА ПРОЕКТУВАННЯ
У курсовій роботі, згідно варіанту, необхідно:
Визначити формати команд згідно розрядності шини даних, розміру пам’яті та регістрового файлу.
№
Розрядність шини даних
Розмір пам’яті
Байт
Розмір регістрового файлу(к-сть регістрів)
3
32
65536
16
Реалізація додаткових команд. Необхідно реалізувати 8 додаткових команд. Серед них 3 арифметичні, 3 логічні та 2 команди керування згідно варіанту. Команди не мають повторюватися.
Арифметичні:
№
Мнемонічний код
Зміст
3
DIV regA regB destReg
Беззнакове ділення destReg=regA/regB
5
IMUL regA regB destReg
Знакове множення destReg=regA*regB
9
XIDIV regA regB destReg
Знакове ділення і обмін операндів місцями destReg=regA/regB
Логічні:
№
Мнемонічний код
Зміст
1
AND regA regB destReg
Побітове логічне І: destReg=regA & regB
2
XOR regA regB destReg
Додавання по модулю 2: destReg=regA # regB
17
CMPGE regA regB destReg
Порівняти regA regB destReg= regA >= regB
Керування. Умовні переходи:
№
Мнемонічний код
Зміст
2
JMAE regA regB offSet
Беззнакове більше/рівно if (regA>= regB) PC=PC+1+offSet
10
JMNAE regA regB offSet
Беззнакове не більше/рівно if (regA!>= regB) PC=PC+1+offSet
Реалізувати додатковий спосіб адресації. Передбачити, що не менше як 3 команди мають підтримувати інший вид адресації згідно варіанту.
Примітка: безадресний варіант передбачає створення стеку та реалізацію 2 додаткових команд, наведених в таблиці.
№
Адресція
1
Безадресна – реалізація стеку. Максимальна глибина 32 слова по 32 розряди.
Безадресні команди:
Мнемонічний код
Зміст
Push
Зчитати з стеку в 1 регістр
Pop
Записати в стек з 1 регістру
Регістри стану: регістр ознаки нуля 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
5
JNE offSet
Перейти, якщо більше чи рівно, if(ZF!=0)PC=offset
ТЕОРЕТИЧНА ЧАСТИНА
Способи адресації
Варіанти інтерпретації бітів (розрядів) поля адреси з метою знаходження операнда називаються способами адресації. Коли команда вказує на операнд, він може знаходитись в самій команді, в основній або зовнішній пам'яті чи в регістровій пам'яті процесора. Зароки існування комп'ютерів була створена своєрідна технологія адресації, яка передбачає реалізацію різних способів адресації, чому послужило ряд причин:
забезпечення ефективного використання розрядної сітки команди;
забезпечення ефективної апаратної підтримки роботи з масивами даних;
забезпечення задання параметрів операндів;
можливість генерації великих адрес на основі малих.
Пряма – в цьому випадку адресне поле зберігає адресу операнда. Її різновидом є пряма регістрова адресація, яка адресує не комірку пам’яті а номер регістру.
Безпосередня – в поле адреси команди поміщається не адреса, а сам операнд.
Непряма – в полі адреси команди зберігається адреса комірки пам’яті в якій знаходиться адреса операнда. Такій спосіб дозволяє оперувати з адресами як з даними. Різновид непряма-регістрова адресація, адреса адреси зберігається в регістрі загального призначення.
Відносна – адреса формується, як сума з двох доданків: бази, яка зберігається в спеціальному регістрі чи в одному з регістрів спеціального призначення, та зміщення, яке задається в полі адреси команди. Різновид індексна та базова індексна. При індексній замість базового регістра є індексний, який автоматично модифікується (зазвичай збільшується на 1). Базова-індексна адресація формується адреса як сума трьох доданків: бази, індексу та зміщення.
В даній курсовій роботі використовується безадресна – поле адреси в команді відсутнє. Адреса операнда, або немає змісту або є по замовчуванню (наприклад дії на спеціальним регістром - акумулятором). Безадресні команди неможливо використати для інших регістрів чи комірок пам’яті. Одним з різновидів безадресної адресації є використання стеку.
Стекова адресація
Зменшення довжини команди скорочує час виконання і економить пам’ять. Межею зменшення є безадресні команди, які можливі при використанні стекової адресації. Стекова адресація використовується в безадресних командах при роботі з масивами даних. Широко використовується в мікропроцесорах і мікрокомп’ютерах. Принципи організації стекової адресації зображені на рис
Рис.1 Стекова адресація
Стек - це, набір комірок пам'яті або регістрів, в яких дані масиву розміщуються в заданому порядку, а саме відповідно до правила організації пам'яті з послідовним до ступом типу FILO. Місце розміщення першого даного масиву називається дном стека, а останнього - вершиною стека. Для запису та читання даних передбачено дві операції: push (вштовхування даних в стек) та pop (виштовхування даних зі стеку). Операції зовнішнього запису та читання можливі тільки з вершиною стека. На її номер вказує вміст вказівника стека. При запису всі дані в стеку зміщуються на одну позицію вниз, а при зчитуванні зміщуються на одну позицію вверх. На рисунку 2 показано функціонування стека при запису та зчитуванні даних при виконанні двомісної операції множення числа 50 на число 10 в арифметико-логічному пристрої із записом результату в стек.
Рис.2 Виконання двомісної операції з використанням стека
Система команд
Різноманітність типів даних, форм представлення та опрацювання, необхідні дії для обробки та керування ходом виконання обчислень призводить до необхідності використання різноманітних команд – набора команд. Кожен процесор має власний набір команд, який називається системою команд процесора.
Система команд характеризується трьома аспектами:
- формат,
- способи адресації,
- система операцій.
Форматом команди – є довжина команди, кількість, розмір, положення, призначення та спосіб кодування полів. Команди мають включати наступні види інформації:
- тип операції, яку необхідно реалізувати в даній команді (поле команду операції - КОП)
- місце в пам’яті звідки треба взяти перший операнд (А1);
- місце в пам’яті звідки треба взяти другий операнд (А2);
- місце в пам’яті куди треба помістити результат (А3).
Кожному з цих видів інформації відповідає своя частина двійкового слова – поле. Реальна система команд зазвичай має команди декількох форматів, тип формату визначає КОП. Команда в комп'ютері зберігається в двійковій формі. Вона вказує тип операції, яка має бути виконаною, адреси операндів, над якими виконується операція, та адреси розміщення результатів виконання операції. Відповідно до цього команда складається з двох частин, коду операції та адресної частини. КОП займає k розрядів. Ним може бути закодовано до N = 2k різних операцій. Кількість двійкових розрядів, які відводяться під код операції, вибирається таким чином, щоб ними можна було закодувати всі виконувані в даному комп'ютері операції. Якщо деякий комп'ютер може виконувати Nc різних операцій, то мінімальна розрядність поля коду операції k визначається наступним чином: k = [log Nc], де вираз в дужках означає заокруглення до більшого цілого.
Поле адреси (адресна частина) займає m розрядів. В ньому знаходяться адреси операндів. Кожна адреса займає mi розрядів, де і - номер адреси (і=1,2,...1), 1 – кількість адресних полів. Кожною адресою можна адресувати пам'ять ємністю 2ті слів.
Розмір команди k + m повинен бути узгодженим з розміром даних, тобто бути з ним однаковим або кратним цілому числу, що спрощує організацію роботи з пам'яттю. Як правило, розмір команди рівний 8, 16, 32 біти. При написанні програми крім двійкової можуть використовуватись й інші форми представлення команд: вісімкова, шістнадцяткова, символьна (мнемонічна). Використання вісімкового і шістнадцяткового кодування дозволяє скоротити записи і спростити роботу програміста.
Мнемонічне кодування спрощує процес написання, читання і відлагодження програми. Основний принцип такого кодування - кожна команда представляється 3-х або 4-х буквеним символом, який показує назву команди. Деякі приклади мнемонічного кодування:
ADD - додати (add),
SUB - відняти (subtract),
MPY - перемножити (multiply),
DIV - поділити (divide),
Операнди також представляються символічно. Наприклад команда ADD R Y означає додавання вмісту комірки пам'яті Y до вмісту регістра R. Зауважимо, що операція виконується над вмістом, а не над адресою комірки пам'яті та регістра. Таким чином, з'являється можливість написання машинних програм в символічній формі. Повний набір символічних назв і правила їх використання утворюють мову програмування, відому як асемблерна мова. Символічні імена називаються мнемонічними, а правила їх використання для створення команд і програм називаються синтаксисом мови. Програма, яка переводить із мнемонічного коду асемблерної мови в машинний, називається асемблером.
Функціональна схема модифікованого комп’ютера і принцип роботи його
У ході виконання курсової роботи було розроблено схему модифікованого комп’ютера зі складною системою команд.
Рис.3 Схема модифікованого комп’ютера
На цій схемі лініями відділені блоки процесора, показані на рис.1 , які виконують відповідну фазу командного циклу потокового графа алгоритму виконання команди. Перший оператор IF виконується на наступних елементах: програмному лічильнику PC (Program Counter), суматорі Adder та двох регістрах NPC і IR. Вміст програмного лічильника PC визначає адресу команди в основній пам'яті. Комбінаційний суматор Adder обраховує адресу наступної за чергою виконання команди. При цьому враховано, що впорядкована послідовність команд (програма) складається з чотирибайтових команд (усі команди мають формати довжиною 32 біти), які розміщено в основній пам'яті за послідовними адресами 0,4, 8, С і т. д. Через це константа зсуву адреси (пересування покажчика на наступну за чергою команду) дорівнює +4. Визначене за допомогою суматора значення адреси вибирання наступної команди зберігається у регістрі NPC (next PC). Зчитаний з основної пам'яті код поточної команди записується до регістра команди IR.
Поля щойно вибраної команди містять адреси програмно-доступних регістрів регістрового файла процесора. Вміст зазначених полів формату команди в рамках оператора ID надсилається на адресні входи регістрової пам'яті Regs, а відповідні надісланим адресам коди операндів завантажуються до внутрішніх, програмно-недосяжних, тобто службових, регістрів А і В.
Існує ще один тип операнда з назвою "безпосередній" (Imm). Його задають прямо у форматі команди. Як правило, довжина безпосереднього операнда не перевищує половини довжини формату команди. В комп'ютері DLX безпосередній операнд має довжину 32/2 = 16 бітів. У той самий час бажано зафіксувати довжину формату даних такою, що дорівнює довжині формату команди, адже різноманіть довжин форматів суттєво пригальмовує комп'ютер. Якщо усі формати даних, як і формати команд, матимуть довжину 32 біти, тоді безпосередньому операнду не вистачатиме ще 16 бітів, аби бути стандартним за довжиною. Тому тут використаний комбінаційний вузол Sign Extend, який виконує знакове розширення 16-бітового безпосереднього операнда до 32-х бітів. Результат знакового розширення тимчасово зберігають у службовому регістрі Imm.
В цілому можна нарахувати чотири можливі операнди на вході арифметико логічного пристрою ALU процесора: з регістрів А, В, Imm та вміст регістра адреси наступної для виконання команди NPC, над якими виконується функціональний оператор ЕХ. Наперед зазначимо, що операнд-адреса NPC опрацьовується в ALU при виконанні команд умовного переходу, коли на додаток до наступної потрібна ще одна адреса, що утворена додаванням до вмісту NPC деякої константи переходу. Вибирання двох операндів на вхід ALU із чотирьох можливих виконується за допомогою мультиплексорів операндів mux, розташованих на його входах.
Результат операції з ALU тимчасово запам'ятовується у проміжному службовому регістрі ALUout. Якщо результатом операції є число, тоді воно заноситься до комірки регістрового файла. Якщо результатом операції є адреса, тоді ця адреса надсилається до (верхнього на рисунку) мультиплексора вибору адреси mux. За допомогою зазначеного мультиплексора вибирають адресу переходу (чергова чи перехід), яка і надсилається до програмного лічильника PC, щоб коректно продовжити виконання програми.
Керування мультиплексором вибору адреси наступної команди покладено на вузол Zero, де вміст службового регістра А порівнюється із нулем (дорівнює нулю, більше нуля, менше нуля і т. д., залежно від виду виконуваної у поточний час операції умовного переходу). Результат порівняння є бінарним логічним значенням (так або ні). Саме цей бінарний результат керує роботою мультиплексора вибирання адреси наступної команди.
При виконанні фази MEM результат-адреса з виходу ALU надсилається до основної пам'яті як отримана адреса комірки цієї пам'яті (для команд збереження/завантаження).
Результатом на виході правого на рисунку мультиплексора може бути або вміст основної пам'яті (при виконанні команди завантаження LW слова з основної пам'яті до регістра регістрового файла), або результат виконання арифметичної, зсувної, логічної чи іншої операції в ALU (наприклад, при виконанні команд ADD, SUB і т. д.). Такий результат в рамках виконання фази WB засобами мікропрограмування зберігають в регістрі регістрового файла. Отже, зазначений мультиплексор, керований регістром поточної команди, комутує на вхід регістрового файла потрібну інформацію
Таким чином, апаратно відобразивши потоковий граф алгоритму виконання команди, вдалося забезпечити вимогу, щоб вона виконувалася за один такт. Як видно з вище приведеного опису роботи процесора, для спрощення пояснення тут були використані проміжні регістри для запису операндів, які можуть бути видалені. Порівняно з процесором комп'ютера із складною системою команд виконання команди в приведеній структурі процесора суттєво спростилося. Далі розглянемо це детальніше, але спочатку проведемо аналіз взаємодії процесора з основною пам'яттю.
Асемблерна мова та асемблер
В першій частині даного курсового проекту необхідно написати програму, яка перетворює вхідну програму на мові асемблер в мову машинних кодів. Програма має перетворити асемблерні імена команд в числові еквіваленти, наприклад асемблерну команду beq в 100, також перетворити символьні імена адрес в числові значення. Результуючий файл має складатися з послідовності 32 бітних інструкцій (біти 31-25 інструкції завжди рівні 0).
Формат лінійки асемблерного коду наступний (<пробіл> означає послідовність табуляцій і/або пробілів):
мітка <пробіл> інструкція<пробіл>поле№1<пробіл> поле№2<пробіл> поле№3<пробіл>коментар
Крайнє ліве поле лінійки асемблерного коду – поле мітки. Коректна мітка має складатися максимуму з 6 символів, символами можуть бути літери або цифри, але починатися з букви. Поле мітки є необов’язковим, проте пробіл після даного поля є обов’язковим. Мітки дозволяють значно спростити процес написання асемблер них програм, в іншому випадку прийшлось би модифікувати всі адресні частини кожен раз коли додавався рядок коду!
Після не обов’язкової мітки іде обов’язковий пробіл. Далі іде поле назви інструкції, в якому може бути ім’я будь якої асемблерної інструкції зазначені вище в таблиці. Після пробілів ідуть відповідні поля. Всі поля можуть зберігати або десяткові значення або мітки. Кількість полів залежить від інструкції, поля які не використовуються ігноруються.
Інструкції r-типу (add, nand) потребують наявності 3 полів: поле№1 – regA, поле№2 regB поле№3 destReg.
Інструкції і-типу (lw,sw,beq) вимагають 3 полів: поле№1 – regA, поле№2 regB поле№3 – числове значення зміщення чи символьна адреса. Числове значення може бути як додатнім так і від’ємним. Символьні адреси описані нижче.
Інструкція J-типу (jalr) вимагає 2 полів: поле№1 – regA, поле№2 regB
Інструкція 0-типу (noop, halt) не вимагає жодного.
Символьні адреси посилаються на відповідні мітки. Для інструкцій lw та sw асемблер має згенерувати зміщення, яке дорівнює адресі мітки. Вона може використовуватися з 0 регістром, тоді буде посилання на мітку, або може використовуватися з не нульовим базовим регістром у якості індексу масиву, який починається з мітки. Для інструкції beq, асемблер має перетворити мітку в числове зміщення куди має відбуватися перехід.
Після останнього поля має йти пробіл за яким може розміщуватися коментар. Коментар закінчується з кінцем лінії асемблерної програми. Коментарі дуже важливі для отримання зрозумілої асемблерної програми, тому що інструкції самі по собі мало зрозумілі.
Крім інструкцій СК, асемблерна програма може містити директиви для асемблера. В даному курсовому проекті для асемблера використовується лише одна директива - .fill (зверніть увагу на точку попереду). Директива . fill повідомляє компілятору про те, що він має зберегти число за адресою відповідно де дана інструкція знаходиться. Директива .fill використовує одне поле, в якому може бути як число так і символьна адреса. Наприклад «.fill 32» означає зберегти число 32 за адресою де дана інструкція знаходиться. (Оскільки в нас кожен рядок програми відповідає адресі починаючи з 0, то відповідно адреса буде дорівнювати номеру рядка - 1). Директива . fill з символьною адресою збереже адресу даної мітки.
Асемблер має виконувати два проходи через асемблерну програму. На першому проході, асемблер має вирахувати адреси кожної символьної мітки. Виходячи з того, що перша інструкція знаходить по нульовій адресі. На другому проході, асемблер має генерувати машинні інструкції (у вигляді десткових чисел) для кожного рядку асемблерної мови. Зауважимо, що програмі імена файлів мають передаватися у якості аргументів командного рядка. Асемблер має зберігати в результуючому файлі лише машинні команди у вигляді десяткових чисел, одну команду в одному рядку. Порушення даного формату призведе до того, що вихідний файл не можна буде виконати. Інший вивід (наприклад для відладки ) програма може виконувати у консоль.
Асемблер має визначати наступні помилки в асемблер ній програмі: використання не визначених міток, використання однакових міток, використання змішення яке перевищує 16 біт, не визначені команди. Асемблер має повертати 1, якщо він визначив помилку та 0 у випадку успішного виходу з програми. Асемблер не має визначати помилки виконання програми, тобто помилки які виникають під час виконання програми.
Одною з частин виконання даного курсової роботи створити множину тестів для того щоб протестувати роботу асемблера. Створення набору тестів є розповсюдженою практикою при розробці ПЗ. Це дозволяє впевнитися в правильності виконання програми при її модифікаціях. Створення всебічних тестів дозволить глибше зрозуміти специфіку проекту та вашої програми, та допоможе налагодити програму. Множиною тестів буде набір невеличких асемблер них програм в якості вхідних еталонів. Важливо створити тести для перевірки можливості асемблера визначити помилки в коді.
Поведінкова симуляція
Другою частино даної курсової роботи є створення програми, яка може від симулювати роботу любого вірного машинного коду СК. Вхідним має бути файл з машинним кодом програми, якій має створити асемблер. Наприклад, якщо назва програми simulate та машинний код зберігається в файлі program.mc, програма має запускатися наступним чином:
simulate program.mc > output
При цьому весь вивід буде виконуватися в файл "output".
Симулятор має розпочинати роботи з ініціалізації вмісту всіх регістрів
Симулятор має виконувати програму доти не зустріне команду halt.
Симулятор має виводити вивід стану комп’ютера перед виконанням кожної інструкції та один раз перед виходом з програми. Вивід стану має включати вивід вмісту всіх регістрів, ПЛ, пам’яті. Пам’ять має виводитися лише для комірок визначених в файлі з машинними кодами (наприклад у наведеному вище прикладі це адреси від 0 до 9).
Так само як і для асемблера, необхідно написати набір тестів і для перевірки роботи симулятора СК. Набір тестів для симулятора є простою задачею адже вже буде набір тестів для асемблера. Отже необхідно лише відібрати коректні програми, в якості вхідних тестових файлів для симулятора. При захисті необхідно буде представити набір тестів і для симулятора.
Формати інструкцій
Для виконання даного курсового проекту необхідно володіти знаннями про набір інструкцій та формат інструкцій СК.
В спрощеному комп'ютері (СК) в пам'яті зберігаються, як дані так і інструкції. Кожна інструкція закодована числом. Це число складається з декількох полів: поле назви команди чи код операції (КОП) та полів операндів. В СК є два види пам'яті: загальна пам'ять, та регістрова пам'ять. В загальній пам'яті зберігаються інструкції програми та дані над якими оперують інструкції. В регістровий пам'яті зберігаються дані над якими виконуються інструкції. У реальних комп'ютерах регістрова пам'ять є малою за розмірами та швидкою, працює на швидкості ядра процесора, загальна пам'ять є великою за розміром, але набагато повільніша за ядро процесора. Регістрова пам'ять підтримує лише пряму адресацію, загальна пам'ять підтримує декілька типів адресації.
У СК є 8 регістрів по 32 розряди, пам'ять складається з 65536 слів по 32 розряди. Також є спеціальний регістр BR, який використовується для відносної адресації.
Отже, СК є 32 розрядним комп'ютером. Він підтримує 20 інструкцій, кожна з яких розписана нижче. У СК є спеціальний регістр лічильник команд (ЛК). Крім вищезазначеного СК містить регістр ознак, який використовується для певних операцій.
За прийнятою домовленістю 0-ий регістр завжди містить 0 (це не обмовлено апаратними вимогами проте асемблерна програма ніколи не має змінювати значення 0ого регістра, який ініціалізуються 0 ).
СК підтримує 5 форматів інструкцій. Біти 31-26 не використовує жодна інструкція тому вони завжди мають дорівнювати 0.
Інструкції R-типу
31-26
25-22
21-19
18-16
15-3
2-0
unused
opcode
rega
regb
unused
destreg
Інструкції I-типу
31-26
25-22
21-19
18-16
15-0
unused
opcode
rega
regb
offset
Інструкції J-типу
31-26
25-22
21-19
18-16
15-0
unused
opcode
rega
regb
unused
Інструкції D-типу
31-26
25-22
21-19
18-0
unused
opcode
rega
unused
Інструкції O-типу
31-26
25-22
21-0
unused
opcode
unused
Повний перелік множини інструкцій надано таблицею
Таблиця 1
№пп
Код інструкції
2-ве
Сутність інструкцій машини
R-типу
1
add regA regB destReg
00000
Додає вміст регістру regA до вмісту regB, та зберігає в destReg
2
nand regA regB destReg
00001
Виконує логічне побітове І-НЕ вмісту regA з вмістом regB, та зберігає в destReg
3
idiv regA regB destReg
01001
Знакове ділення destReg=regA/regB
4
imul regA regB destReg
01010
Знакове множення destReg=regA*regB
5
and regA regB destReg
01011
Побітове логічне І: destReg=regA & regB
6
xor regA regB destReg
01100
Додавання по модулю 2: destReg=regA # regB
7
shr regA regB destReg
01101
Логічний зсув вправо destReg=regA >> regB
8
adc regA regB destReg
10101
Додавання з переносом: destReg=regA - regB - CF
9
sbb regA regB destReg
10110
Віднімання з переносом: destReg=regA - regB - CF
I-типу
10
lw regA regB offset
01010
Завантажує regB з пам'яті. Адреса пам'яті формується додаванням зміщення до вмісту regA.
11
sw regA regB offset
01011
Зберігає вміст регістру regB в пам'ять. Адреса пам'яті формується додаванням зміщення до вмісту regA.
12
beq regA regB offset
01100
Якщо вміст регістрів regA та regB однаковий, виконується перехід на адресу програмний лічильник(ПЛ) + 1+зміщення, в ПЛ зберігається адреса поточної тобто beq інструкції.
13
jma regA regB offset
01110
if (regA > regB) PC=PC+1+offset
14
jmbe regA regB offset
01111
if (regA <= regB) PC=PC+1+offset
15
idivi regA value destReg
10000
destReg=regA/value
16
imuli regA value destReg
10001
destReg=regA*value
17
andi regA value destReg
10010
destReg=regA & value
18
xori regA value destReg
10011
destReg=regA#value
19
shri regA value destReg
10100
destReg=regA>>value
J-типу
20
jalr regB offset
01111
Спочатку зберігає ПЛ+1 в regB, в ПЛ адреса поточної (jalr) інструкції. Виконує перехід на адресу, яка зберігається в regA. Якщо в якості regA regB задано один і той самий регістр, то спочатку в цей регістр запишеться ПЛ+1, а потім виконається перехід до ПЛ+1.
21
cmp regA regB
10111
Порівнює regA і regB CF = 1 якщо regA < regB, інакше CF = 0
D-типу
22
inc regA
01000
Інкремент regA = regA + 1
O-типу
23
Halt
10101
Збільшує значення ПЛ на 1, потім припиняє виконання, стимулятор має повідомляти, що виконано зупинку.
24
halt
10110
Нічого не виконує.
ПРАКТИЧНА ЧАСТИНА
Результати виконання
Для тестування курсового проекту необхідно написати тест, який дасть змогу перевірити правильності роботи програми, а саме:
1) У текстовому редакторі набираємо послідовність інструкцій та зберігаємо з розширенням *.as
2) Потім необхідно перевести набраний код програми в машині коди. Для цього використаємо програмою asol.exe. Вона отримує параметри через
командний рядок
Файл prog.mc міститиме послідовність кодів.
3) Використовуємо симулятор ssol, щоб виконати дану програму.
Для цього в командному рядку прописуємо ssol prog.mc>res.txt
Результат виконаної програми буде знаходитись у файлі res.txt.
Рис.4 Процес компіляції програми
Тест№1 Перевірка роботи команд DIV, IMUL, XIDIV
У даній програмі перевіряється правильність роботи команд DIV, IMUL, XIDIV. Найперше завантажуються в пам’ять числа за 10 і 5 допомогою команди lw. Далі відбувається беззнакове ділення і запис результату в регістр 5. Далі відбувається беззнакове ділення і обмін операндами і запис результату в регістр 6. Як видно на рисунку, результат такий самий як при виконанні операції DIV, тільки тепер в регістрі 1 знаходиться число 5, а в регістрі 2 – число 10.
Після цього відбувається завантаження операндів з регістра 3 і 4. За допомогою команди IMUL відбувається знакове множення чисел і запис результату в регістр 7.
Рис.5 Код програми та результат виконання
Тест№2 Перевірка роботи команд cmpge, and
У даній програмі перевіряється правильність роботи команд cmpge і and.
Найперше відбувається завантаження трьох операндів 10, 5, 1 відповідно. Після цього виконується команда cmpge, яка порівнює їх. Тоді два останні операнди завантажуються знову, і за допомогою команди and відбувається логічне множення і запис результату в регістр 4.
Рис.6 Код програми та результат виконання
Тест№3 Перевірка роботи команд jmae, jmnae