ПРОЕКТУВАННЯ КОМП’ЮТЕРА

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

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

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

Рік:
2013
Тип роботи:
Інші
Предмет:
Архітектура комп'ютерів

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

МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» КАФЕДРА «ЕЛЕКТРОННІ ОБЧИСЛЮВАЛЬНІ МАШИНИ» / Пояснювальна записка до курсової роботи з дисципліни «Архітектура комп’ютерів» на тему : «ПРОЕКТУВАННЯ КОМП’ЮТЕРА» Варіант №29 ВИХІДНІ ДАНІ НА ПРОЕКТУВАННЯ Варіант №29 № Розряд- ність Арифметичні Логічні Керування Прапорці    1 2 3 4 5 6 7 8  1 2 3  29 1 3 7 10 2 4 15 4 7 SF 1 2 3   Реалізація додаткових команд:Необхідно реалізувати 8 додаткових команд. Серед них 3 арифметичні, 3 логічні та 2 команди керування згідно варіанту. Команди не мають повторюватися. Арифметичні № Мнемонічнй код Зміст  3 DIV regA regB destReg Беззнакове ділення destReg=regA/regB  7 SUB regA regB destReg Віднімання : destReg=regA-regB  10 XIMUL regA regB destReg Знакове множення і обмін операндів місцями destReg=regA*regB   Логічні № Мнемонічнй код Зміст  2 XOR regA regB destReg Додавання по модулю 2: destReg=regA # regB  4 SHR regA regB destReg Логічний зсув вправо destReg=regA >> regB  15 CMPL regA regB destReg Порівняти regA regB destReg= regA < regB   Керування. Умовні переходи. № Мнемонічнй код Зміст  4 JMBE regA regB offSet Беззнакове менше/рівно if (regA<= regB) PC=PC+1+offSet  7 JML regA regB offSet Знакове менше if (regA< regB) PC=PC+1+offSet   Регістри стану: CF –регістр переносу, SF – регістр знаку, ZF – регістр 0. № Мнемонічнй код Зміст  1 CMP regA regB Порівняти regA regB і встановити прапорці СF SF ZF  regA < regB 1 1 0  regA = regB 0 0 1  regA > regB 0 0 0    2 JL offSet Перейти, якщо менше, if(SF==1)PC=offset  3 JGE offSet Перейти, якщо більше чи рівно, if(SF==0)PC=offset   АНОТАЦІЯ В даному курсовому проекті розглянено принцип дії та архітектуру прототипних варіантів CISCкомп’ютера. В цій курсовій роботі я розробив програму, яка перетворює асемблерну програму у код на мові машинних інструкцій, також розробив поведінковий симулятор результуючого машинного коду.Під час виконання курсової роботи було продемонстровано архітектуру спрощеного комп’ютера, набір і формат його інструкцій. Також до записки з курсової роботи входять додатки, з вихідними кодами програми-асемблера, симулятора і кодом тестової програми з результатами її виконання ANNOTATION In this course project viewed the principle of operation and architecture of the prototypal options CISCkomp'yutera. In this term paper I have developed a program that converts assembly language program into machine code in the instructions also developed behavioral simulator resulting machine kodu.Pid time the course work has been shown simplified architecture of a computer set and format of its instructions. It also notes with course work includes applications with source code program assembler, simulator and test program code with the results of its implementation ЗМІСТ Вступ..…………………………………………………………………...…6 Короткі теоретичні відомості………………………….………………....7 Архітектурні принципи…………………………..………………......7 Система команд…….………………………………………………….9 Способи адресації…………………………………………………......10 Аналіз принципів побудови спрощеного комп’ютера..………………...12 2.1. Структура СК до модифікації………………………………………..12 2.2. Структура СК після модифікації…………………………………….16 Фрагменти кодів програм…………………………………………………20 3.1. Фрагменти кодів Асемблера………………………………………….20 3.2. Фрагменти кодів Симулятора………………………………………...23 3.3 Результати роботи програм……...…………………………….……...27 Висновок……………..……………………………………………………..38 Список використаної літератури.………………………………………....39 Додаток І (текст програми асемблера)……………………………………40 Додаток ІІ (текст програми симулятора)……………….………………...46 ВСТУП CISC (англ. ComplexInstructionSetComputer — комп'ютер зі складним набором команд) — це архітектура системи команд, в якій більшість команд є комплексними, тобто реалізують певний набір простіших інструкцій процесора або шляхом зіставлення з кожною CISC-командою певної мікропрограми, або принаймні можуть бути зведені до набору таких простих інструкцій. Приведемо основні принципи даної архітектури, які запропонував Джон фон Нейман: Інформація кодується в двійковому представленні. Інформація в комп’ютері ділиться на команди і дані. Різнотипні за змістом слова розрізняються за способом застосування, а не по способу кодування. Слова інформації розміщаються в комірках пам’яті та ідентифікуються номерами комірок - адресами слів. Пам’ять є лінійною. Пам’ять має довільну адресацію. Команди і дані зберігаються в одній пам’яті. Алгоритми представляються у вигляді послідовності керуючих слів, як називаються командами. Команда визначається найменуванням операції та слів інформації, які в ній приймають участь. Алгоритм записаний у вигляді послідовності команд, називається програмою. Весь набір виконуваних комп’ютером команд називається системою команд комп’ютера. Виконання обчислень, які визначені алгоритмом, являють собою послідовне виконання команд в порядку визначеному програмою. Короткі теоретичні відомості Архітектурні принципи В ході виконання даного курсового проекту студент має ознайомитись та опанувати архітектуру CISC – комп’ютера. Приведемо основні принципи даної архітектури, які запропонував Джон фон Нейман: Інформація кодується в двійковому представленні. Інформація в комп’ютері ділиться на команди і дані. Різнотипні за змістом слова розрізняються за способом застосування, а не по способу кодування. Слова інформації розміщаються в комірках пам’яті та ідентифікуються номерами комірок – адресами слів. Пам’ять є лінійною. Пам’ять має довільну адресацію. Команди і дані зберігаються в одній пам’яті. Алгоритми представляються у вигляді послідовності керуючих слів, як називаються командами. Команда визначається найменуванням операції та слів інформації, які в ній приймають участь. Алгоритм записаний у вигляді послідовності команд, називається програмою. Весь набір виконуваних комп’ютером команд називається системою команд комп’ютера. Виконання обчислень, які визначені алгоритмом, являють собою послідовне виконання команд в порядку визначеному програмою. Для виконання задачі на комп’ютері необхідно: забезпечити вибірку команди програми із його пам’яті в заданій послідовності, організувати звернення до неї за відповідними адресами; забезпечити розпізнавання типів виконуваних операцій; організувати звернення до пам’яті за відповідними адресами для вибірки необхідних для виконання кожної команди даних; організувати виконання над даними операцій відповідно до вказівок команд; запам’ятати результат обчислень. Комп'ютер виконує кожну команду як послідовність простих операцій: Вибірка чергової команди із основної пам'яті. Визначення типу вибраної команди, тобто її дешифрування. Визначення адрес даних, необхідних для виконання цієї команди. Виконання операцій пересилання даних (зчитування даних із пам'яті в регістри процесора). Виконання операції відповідно до її коду в полі коду операції команди. Визначення адрес, за якими запам'ятовуються результати. Запам'ятовування результатів. Підготовка до виконання наступної команди, тобто обчислення її адреси. Для процесора комп'ютера із складною системою команд характерні наступні особливості: виконання команди за багато тактів, оскільки для цього потрібно здійснити багаторазові операції звернення до основної пам'яті та до програмно-доступних регістрів процесора; орієнтація АЛП на виконання великої кількості операцій, що пов'язано з розширеним складом системи команд; складна система розпізнавання команди, що пов'язано з великою кількістю методів адресації та великою кількістю форматів команд різної розрядності; програмне дешифрування команд з метою зменшення затрат обладнання; складна організація конвеєризації виконання команд, що пов'язано, в першу чергу, з різнотипністю їх виконання; орієнтація структури на виконання команд типу регістр-пам'ять та пам'ять-пам'ять. Основні елементи процесора - арифметико-логічний пристрій, пристрій керування і регістрова пам'ять або, як її ще називають, надоперативний запам'ятовуючий пристрій. До складу регістрової пам'яті, в свою чергу, входять наступні вузли - програмний лічильник, регістри: адреси, команди, даних, слова стану програми, а також регістровий файл, який складається з програмно доступних регістрів. Структура регістрової (надоперативної) пам'яті процесора складається з регістрів спеціального та зального призначення. До регістрів спеціального призначення належать: регістри адреси (РгА); регістри команд (РгК); програмний лічильник(ПЛ) регістри даних (РгД). РгА зберігає адресу даного або команди при зверненні до основної пам'яті. РгД зберігає операнд при його запису або зчитуванні з основної пам'яті. В ролі операнда може бути дане, команда або адреса. РгК зберігає команду після її зчитування з основної пам'яті. ПЛ підраховує команди та зберігає адресу поточної команди. Комп'ютер з архітектурою Джона фон Неймана має один програмний лічильник. 1.2 СИСТЕМА КОМАНД Різноманітність типів даних, форм представлення та опрацювання, необхідні дії для обробки та керування ходом виконання обчислень призводить до необхідності використання різноманітних команд – набора команд. Кожен процесор має власний набір команд, який називається системою команд процесора. Система команд характеризується трьома аспектами: формат, способи адресації, система операцій. Форматом команди – є довжина команди, кількість, розмір, положення, призначення та спосіб кодування полів. Команди мають включати наступні види інформації: тип операції, яку необхідно реалізувати в даній команді (поле команду операції - КОП); місце в пам’яті звідки треба взяти перший операнд (А1); місце в пам’яті звідки треба взяти другий операнд (А2); місце в пам’яті куди треба помістити результат (А3). Кожному з цих видів інформації відповідає своя частина двійкового слова – поле. Реальна система команд зазвичай має команди декількох форматів, тип формату визначає КОП. Команда в комп'ютері зберігається в двійковій формі. Вона вказує тип операції, яка має бути виконаною, адреси операндів, над якими виконується операція, та адреси розміщення результатів виконання операції. Відповідно до цього команда складається з двох частин, коду операції та адресної частини. 1.3 СПОСОБИ АДРЕСАЦІЇ Варіанти інтерпретації бітів (розрядів) поля адреси з метою знаходження операнда називаються способами адресації. Коли команда вказує на операнд, він може знаходитись в самій команді, в основній або зовнішній пам'яті чи в регістровій пам'яті процесора. За роки існування комп'ютерів була створена своєрідна технологія адресації, яка передбачає реалізацію різних способів адресації, чому послужило ряд причин: забезпечення ефективного використання розрядної сітки команди; забезпечення ефективної апаратної підтримки роботи з масивами даних; забезпечення задання параметрів операндів; можливість генерації великих адрес на основі малих. Існує велика кількість способів адресації. Розглянемо п’ять основних способів адресації операндів в командах. Пряма – в цьому випадку адресне поле зберігає адресу операнда. Її різновидом є пряма регістрова адресація, яка адресує не комірку пам’яті а номер регістру. Безпосередня – в поле адреси команди поміщається не адреса, а сам операнд. Непряма – в полі адреси команди зберігається адреса комірки пам’яті в якій знаходиться адреса операнда. Такій спосіб дозволяє оперувати з адресами як з даними. Різновид непряма-регістрова адресація, адреса адреси зберігається в регістрі загального призначення. Відносна – адреса формується, як сума з двох доданків: бази, яка зберігається в спеціальному регістрі чи в одному з регістрів спеціального призначення, та зміщення, яке задається в полі адреси команди. Різновид індексна та базова індексна. При індексній замість базового регістра є індексний, який автоматично модифікується (зазвичай збільшується на 1). Базова-індексна адресація формується адреса як сума трьох доданків: бази, індексу та зміщення. Безадресна – поле адреси в команді відсутнє. Адреса операнда, або немає змісту або є по замовчуванню(наприклад дії на спеціальним регістром - акумулятором). Безадресні команди неможливо використати для інших регістрів чи комірок пам’яті. Одним з різновидів безадресної адресації є використання стеку. В команду вводяться спеціальні ознаки з тим, щоб пристрій керування міг розпізнати використаний спосіб. Це можуть бути додаткові розряди в команді, або для різних типів команд закріплюватись різні способи адресації. Аналіз принципів побудови спрощеного компютера 2.1 Структура СК до модифікації  Рис. 2.1 – Функціональна схема СК до модифікації В спрощеному комп’ютері (СК) в пам’яті зберігаються, як дані так і інструкції. Кожна інструкція закодована числом. Це число складається з декількох полів: поле назви команди чи код операції (КОП) та полів операндів. В СК є два види пам’яті: загальна пам’ять, та регістрова пам’ять. В загальній пам’яті зберігаються інструкції програми та дані над якими оперують інструкції. В регістровий пам’яті зберігаються дані над якими виконуються інструкції. У реальних комп’ютерах регістрова пам’ять є малою зарозмірами та швидкою, працює на швидкості ядра процесора, загальна пам’ять є великою за розміром, але набагато повільніша за ядро процесора. Регістрова пам’ять підтримує лише пряму адресацію, загальна пам’ять підтримує декілька типів адресації. У СК є 8 регістрів по 32 розряди, пам’ять складається з 65536 слів по 32 розряди. Отже СК є 32 розрядним комп’ютером. Він підтримує 8 інструкцій, кожна з яких розписана нижче. У СК є спеціальний регістр лічільник команд (ЛК). За прийнятою домовленістю 0вий регістр завжди містить 0 (це не обмовлено апаратними вимогами проте асемблерна програма ніколи не має змінювати значення 0ого регістра, який ініціалізуються 0 ). Формати інструкцій: СК підтримує 4 формати інструкцій. Біти 31-25 не використовує жодна інструкція тому вони завжди мають дорівнювати 0. Табл. 2.1 Інструкції R- типу до модифікації Інструкції R-типу (add, nand)  Біти Призначення  24-22 код операції  21-19 reg A  18-16 reg B  15-3 не використовуються (=0)  2-0 destReg   25-31 22-24 19-21  16-18 3-15 0-2  unused opcode regA regB unused destR  R- тип інструкції; така інструкція отримує пару операндів із джерельних регістрів (Registers) регістрового файлу процесора і повертає результат знов таки до регістру призначення з цього файлу. Add – Додає вміст регістру regA до вмістуregB, та зберігає в destReg Nand – Виконує логічне побітове І-НЕ вмісту regA з вмістом regB, та зберігає в destReg Табл. 2.2 Інструкції І-типу до модифікації Інструкції I-типу (lw, sw, beq)  Біти Призначення  24-22 код операції  21-19 reg A  18-16 reg B  15-0 зміщення (16 біт, значення від -32768 до 32767)  25-31 22-24 19-21 16-18 0-15  unused opcode regA regB offset   I-тип інструкції опрацювання, що використовують безпосередній операнд (Immediate ). Immediate- це 16-ти бітове поле, що містить безпосередній операнд; при цьому найлівіший розряд immediate розглядають як знаковий; при використанні безпосередній операнд попередньо знаково розширюють вліво (як доповняльний код) до 32-х бітів. Lw - Завантажує regB з пам’яті. Адреса пам’яті формується додаванням зміщення до вмісту regA. Sw - Зберігає вміст регістру regB в пам’ять. Адреса пам’яті формується додаванням зміщення до вмісту regA. Beq - Якщо вміст регістрів regA та regB однаковий, виконується перехід на адресу програмний лічильник(ПЛ) + 1+зміщення, в ПЛ зберігається адреса поточної тобто beq інструкції. Табл. 2.3 Інструкції J-типу Інструкції J-типу (jarl)  Біти Призначення  24-22 код операції  21-19 reg A  18-16 reg B  15-0 не використовуються (=0)  25-31 22-24 19-21  16-18 0-15  unused opcode regA regB unused  J– тип є інструкцією безумовного переходу (jump). Jarl – Спочатку зберігає ПЛ+1 вreg B, в ПЛ адреса поточної (jalr) інструкції. Виконує перехід на адресу, яка зберігається в regA. Якщо в якості regAregB задано один і той самий регістр, то спочатку в цей регістр запишеться ПЛ+1, а потім виконається перехід до ПЛ+1. Табл. 2.4 Інструкції О-типу Інструкції O-типу (halt, noop)  Біти Призначення  24-22 код операції  21-0 не використовуються (=0)   25-31 22-24 0-21  unused opcode unused   Halt - ЗбільшуєзначенняПЛна 1, потімприпиняєвиконання, стимулятормаєповідомляти, щовиконанозупинку. Noop - Нічого не виконується 2.2 Структура СК після модифікації / Рис.2.2– Функціональна схема СК після модифікації Прапорець переносу CF (англ. Carry flag) - в електронних арифметичних пристроях – це спеціальний прапорець, який встановлюється в результаті арифметичного переносу або зсуву зі старшого значущого біта. Для арифметичної операції може розглядатися як прапорець переповнення. На мові асемблера для 8086-процесорів позначається як «CF». Приклад використання для восьмибітної архітектури: 0111 11112 + 0000 00012 = (0) 1000 0000 (прапорець не встановлено) 1111 11112 + 0000 00012 = (1) 0000 0000 (прапорець встановлено) Таким чином, при операції арифметичного додавання прапорець можна розглядати як дев'ятий біт результату. В процесорах 8086 прапор «CF» також використовується для відображення операції порівняння і індикації результату множення (спільно з прапором переповнення «OF»). Прапорець нуля ZF(англ. Carry Flag) - встановлюється, якщо результат нуль. Прапорець знаку SF(англ. Sign Flag) - встановлюється рівним найбільш значущому біту результату, який є бітом знаку в знакових цілих. 0 - вказує на додатнє значення, 1 - від'ємне. Instruction Register – це регістр команд (IR), є частиною блоку управління процесором, який зберігає в даний час виконувану інструкцію. У простих процесорів кожна інструкція для виконання завантажуються в регістр команд яка тримає його, поки він декодується, підготовлений і виконаний в кінцевому рахунку, яка може зайняти декілька етапів. Комп'ю́терна па́м'ять (англ. memory, storage) — функціональна частина ЕОМ, призначена для прийому, зберігання та видачі даних. Комп'ютерна пам'ять — частина ЕОМ, фізичний пристрій або середовище для зберігання даних протягом певного часу. В основі роботи запам'ятовуючих пристроїв може лежати будь-який фізичний ефект, що забезпечує приведення системи до двох або кількох стійких станів. У сучасній комп'ютерній техніці часто використовуються фізичні властивості напівпровідників, коли проходження струму через напівпровідник або його відсутність трактується як наявність логічних сигналів 0 або 1. Стійкі стани, що визначаються напрямком намагніченості, дозволяють використовувати для зберігання даних різноманітні магнітні матеріали. Наявність або відсутність заряду в конденсаторі також може бути покладена в основу системи зберігання інформації. Регістровий файл (Register File) - модуль мікропроцесора (CPU), що містить в собі реалізацію регістрів процесора. Система команд мікропроцесора (архітектура) практично завжди визначає набір регістрів, які будуть зберігати дані для обробки функціональними пристроями чіпа. У найпростіших процесорах такі архітектурні регістри відображаються один-в-один у фізичний регістровий файл. У більш складних ЦПУ використовується перейменування регістрів (register renaming), яке дозволяє динамічно змінювати відповідність між апаратними та архітектурними регістрами під час виконання. Нижче приведено інструкції після модифікації Табл. 2.5 Інструкції R-типу після модифікації Інструкції R-типу (add, nand,div,sub, ximul,xor,shr,cmpl,cmp )  Біти Призначення  28 біт адресації  26-22 код операції  21-19 reg A  18-16 reg B  15-3 не використовуються (=0)  2-0 destReg  DIV – ділить вмістиме регістра regA на вмістиме регістру regB і записує результат в destReg. SUB – віднімає від вмістимого регістра regA вмістиме регістру regB і записує результат в destReg. Ximul – перемножує вмістиме регістра regA з вмістимим регістру regB і записує результат в destReg і обмінює операнди місцями. Xor –виконується додавання за модулем двох регістрів regA i regB і результат записується в destReg. Shr – логічний зсув праворуч Cmpl – порівняти два регістра regA i regB, і при умові, що regA менше , присвоїти значення регістра regA у destReg Cmp – порівняти регістри regAiregB і встановити відповідні значення 29-31 28 27 22-26 19-21 16-18 3-15 0-2  unused adr unused opcode regA regB unused destR   Табл. 2.6 Інструкції I-типу після модифікації Інструкції I-типу (lw, sw,jml,jmbe,jl,jge)  Біти Призначення  28 біт адресації  26-22 код операції  21-19 reg A  18-16 reg B  15-0 зміщення (16 біт, значення від -32768 до 32767)  Jml – порівняти regA i regB, і якщо regA<regB, то присвоїти програмному лічильнику суму 1 + програмний лічильни + offset Jmbe- порівняти regA i regB, і якщо regA<=regB, то присвоїти програмному лічильнику суму 1 + програмний лічильни + offset Jl- Перейти, якщо менше, if(SF==1)PC=offset JGE- Перейти, якщо більше чи рівно, if(SF==0)PC=offset 29-31 28 27 22-26 19-21 16-18 0-15  unused adr unused opcode regA regB Offset   Табл. 2.7 Інструкції J-типу після модифікації Інструкції J-типу (jalr)  Біти Призначення  28 біт адресації  26-22 код операції  21-19 reg A  18-16 reg B  0-15 не використовуються (=0)   29-31 28 27 22-26 19-21 16-18 0-15  unused adr unused opcode regA regB unused   Табл. 2.8 Інструкції O-типу після модифікації Інструкції O-типу (halt, noop)  Біти Призначення  26-22 код операції  21-0 не використовуються (=0)   29-31 28 27 22-26 0-21  unused adr unused opcode unused   3. Фрагменти кодів програм 3.1 Фрагменти коду програми Асемблера Оголошення команд які будуть реалізовуватися #define DIV 0 // Беззнакове ділення #define SUB 1 // Віднімання #define XIMUL 2 // множення і обмін операндів місцями #define XOR 3 // Додавання по модулю 2 #define SHR 4 // Логічний зсув вправо #define CMPL 5 #define JMBE 6 #define JML 7 #define CMP 8 #define JL 9 #define JGE 10 #define LW 11 // завантажує регістр з пам’яті #define SW 12 //зберігає вміст регістру в пам’ять #define HALT 13 // Збільшує значення програмного лічильника на 1 і після цього закінчується #define NOOP 14 //виконання #define ADD 15 #define NAND 16 #define BEQ 17 #define JALR 18 Перевірка на правильність запису коду операції В даному фрагменті програми здійснюється лексикографічна перевірка на правильність запису коду операції, тобто перевіряє чи правильно записаний КОП і чи в записі не присутні недопустимі символи if (strcmp(opcode, "add") && strcmp(opcode, "nand") && strcmp(opcode, "div") && strcmp(opcode, "ximul") && strcmp(opcode, "sub") && strcmp(opcode, "beq") && strcmp(opcode, "jalr") && strcmp(opcode, "xor") && strcmp(opcode, "shr") && strcmp(opcode, "cmpl") && strcmp(opcode, "cmp") && strcmp(opcode, "jl") && strcmp(opcode, "jge") && strcmp(opcode, "jmbe") && strcmp(opcode, "jml") && strcmp(opcode, "lw") && strcmp(opcode, "sw") && strcmp(opcode, "halt") && strcmp(opcode, "noop") && strcmp(opcode, ".fill")) {printf("error: unrecognized opcode %s at address %d\n", opcode, address); exit(1); Перевірка полів регістрів В даному фрагменті програми здійснюється перевірка на правильність запису регістрів, тобто чи там присутні букви або інші недопустимі символи, а також перевіряється кількість переданих аргументів. if (!strcmp(opcode, "add") || !strcmp(opcode, "nand") || !strcmp(opcode, "div") || !strcmp(opcode, "ximul") || !strcmp(opcode, "sub") || !strcmp(opcode, "xor") || !strcmp(opcode, "shr") || !strcmp(opcode, "cmpl") || !strcmp(opcode, "cmp") || !strcmp(opcode, "jl") || !strcmp(opcode, "jge") || !strcmp(opcode, "jmbe") || !strcmp(opcode, "jml") || !strcmp(opcode, "beq") || !strcmp(opcode, "jalr") || !strcmp(opcode, "lw") || !strcmp(opcode, "sw")) { testRegArg(arg0); testRegArg(arg1); } if (!strcmp(opcode, "add") || !strcmp(opcode, "nand") || !strcmp(opcode, "div") || !strcmp(opcode, "ximul") || !strcmp(opcode, "sub") || !strcmp(opcode, "xor") || !strcmp(opcode, "shr") || !strcmp(opcode, "cmpl") || !strcmp(opcode, "cmp") || !strcmp(opcode, "jl") || !strcmp(opcode, "jge")) { testRegArg(arg2); } Перевірка адресних полів if (!strcmp(opcode, "beq") || !strcmp(opcode, "lw") || !strcmp(opcode, "sw") || !strcmp(opcode, "jmbe") || !strcmp(opcode, "jml")) { testAddrArg(arg2); } if (!strcmp(opcode, ".fill")) { testAddrArg(arg0); } Друк машинного коду з символьними полями в якості адреси В даному фрагменті коду визначається адреса для кожної інструкції та її операндів КОП – адреса для неї визначається зі зміщення 22 від початку; regА(1 операнд) – адреса для нього визначається зі зміщенням 19; regB(2 операнд) – адреса для нього визначається зі зміщенням 16; destReg(регістр в якій заноситься результат) – відповідно адреса для нього визначається від початку; if (!isNumber(arg2)) { addressField = translateSymbol(labelArray, labelAddress, numLabels, arg2); if (!strcmp(opcode, "beq") || !strcmp(opcode, "jmbe") || !strcmp(opcode, "jml")) { addressField = addressField-address-1; } } else { addressField = atoi(arg2); } if (addressField < -32768 || addressField > 32767) { printf("error: offset %d out of range\n", addressField); exit(1); } addressField = addressField & 0xFFFF; if (!strcmp(opcode, "beq") || !strcmp(opcode, "jmbe")) { num = (JMBE << 22) | (atoi(arg0) << 19) | (atoi(arg1) << 16) | addressField; } else if (!strcmp(opcode, "JML")) { num = (JML << 22) | (atoi(arg0) << 19) | (atoi(arg1) << 16) | addressField; } else { if (!strcmp(opcode, "lw")) { num = (LW << 22) | (atoi(arg0) << 19) | (atoi(arg1) << 16) | addressField; } else { num = (SW << 22) | (atoi(arg0) << 19) | (atoi(arg1) << 16) | addressField; } } } else if (!strcmp(opcode, ".fill")) { if (!isNumber(arg0)) { num = translateSymbol(labelArray, labelAddress, numLabels, arg0); } else { num = atoi(arg0); } } fprintf(outFilePtr, "%d\n", num); } exit(0); } int readAndParse(FILE *inFilePtr, char *label, char *opcode, char *arg0, char *arg1, char *arg2) { char line[MAXLINELENGTH]; char *ptr = line; label[0] = opcode[0] = arg0[0] = arg1[0] = arg2[0] = '\0'; if (fgets(line, MAXLINELENGTH, inFilePtr) == NULL) { return(0); } if (strlen(line) == MAXLINELENGTH-1) { printf("error: line too long\n"); exit(1); } ptr = line; if (sscanf(ptr, "%[^\t\n ]", label)) { ptr += strlen(label); } sscanf(ptr, "%*[\t\n\r ]%[^\t\n\r ]%*[\t\n\r ]%[^\t\n\r ]%*[\t\n\r ]%[^\t\n\r ]%*[\t\n\r ]%[^\t\n\r ]", opcode, arg0, arg1, arg2); return(1); } int translateSymbol(char labelArray[MAXNUMLABELS][MAXLABELLENGTH], int labelAddress[MAXNUMLABELS], int numLabels, char *symbol) { int i; for (i=0; i<numLabels && strcmp(symbol, labelArray[i]); i++) { } if (i>=numLabels) { printf("error: missing label %s\n", symbol); exit(1); } return(labelAddress[i]); } int isNumber(char *string) { int i; return( (sscanf(string, "%d", &i)) == 1); } void testRegArg(char *arg) { int num; char c; if (atoi(arg) < 0 || atoi(arg) > 7) { printf("error: register out of range\n"); exit(2); } if (sscanf(arg, "%d%c", &num, &c) != 1) { printf("bad character in register argument\n"); exit(2); } } void testAddrArg(char *arg) { int num; char c; if (isNumber(arg)) { if (sscanf(arg, "%d%c", &num, &c) != 1) { printf("bad character in addressField\n"); exit(2); } } } 3.2 Фрагменти коду Симулятора Оголошення команд які будуть реалізовуватися #define DIV 0 #define SUB 1 #define XIMUL 2 #define XOR 3 #define SHR 4 #define CMPL 5 #define JMBE 6 #define JML 7 #define CMP 8 #define JL 9 #define JGE 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 Реалізація команд typedef struct stateStruct { int pc; int mem[NUMMEMORY]; int reg[NUMREGS]; int numMemory; int CF; int SF; int ZF; } stateType; void printState(stateType *); void run(stateType); int convertNum(int); int main(int argc, char *argv[]) { int i; char line[MAXLINELENGTH]; stateType state; FILE *filePtr; if (argc != 2) { printf("error: usage: %s <machine-code file>\n", argv[0]); exit(1); } for (i=0; i<NUMMEMORY; i++) { state.mem[i] = 0;
Антиботан аватар за замовчуванням

20.05.2013 22:05-

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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