Проектування компютерів

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

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

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

Рік:
2018
Тип роботи:
Курсова робота
Предмет:
Архітектура комп’ютерів та комп’ютерних систем
Варіант:
17 17 9

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

Міністерство освіти і науки Національний університет „Львівська політехніка” / Пояснювальна записка до курсової роботи з дисципліни: “Архітектура комп’ютерів” на тему: “Проектування комп’ютера” Анотація Курсовий проект з дисципліни "Архітектура комп’ютера являє собою підсумок у вивченні предмету "Архітектура комп’ютерів ч.1". Протягом його виконання необхідно засвоїти знання про принципи дії та архітектуру прототипних варіантів CISC - комп’ютера. Також під час виконання курсової роботи необхідно зрозуміти та опанувати інструкції асемблерної мови і принцип трансляції асемблерної програми у машинний код. Даний курсовий проект складається з трьох частин: Розробка програми-асемблера, яка перетворює вхідний код програми у відповідний код на мові машинних інструкцій. Розробка поведінкового симулятора результуючого машинного коду. Розробка тестової програми на асемблерній мові. Також до записки з курсової роботи входять додатки з вихідними кодами програми-асемблера, симулятора і кодом тестової програми з результатами її виконання. Зміст Зміст................................................................................................................................................3 Конкретизовані та розширені вихідні дані на проектування....................................................4 Теоретечна частина.......................................................................................................................5 Алгоритми роботи розробленого емулятора та асемблера.....................................................11 Опис виконання кожного типу розроблених інструкцій у потактовому режимі..................13 Функціональна схема комп’ютера до модификації...............................................16 Функціональна схема комп’ютера після модификації...........................................17 Опис розроблених форматів команд.........................................................................................18 Висновок......................................................................................................................................19 Джерела........................................................................................................................................20 Додатки.........................................................................................................................................21  Конкретизовані та розширені вихідні дані на проектування Варіант 17  № Розрядність Арифметичні Логічні Керування Прапорці Адресація Затримка    1 2 3 4 5 6 7 8  1 2 3    17 3 3 5 9 1 2 17 2 10 ZF 2 3 5 1 2  1. Розрядність шини, розмір пам’яті та регістрового файлу. № Розрядність шини даних Розмір пам’яті (Байт) Розмір регістрового файлу (к-сть регістрів)  3 32 65536 16  2. Додаткові команди, які необхідно реалізувати. Арифметичні № Мнемонічний код Зміст  3 DIV Беззнакове ділення destReg=regA/regB  5 IMUL Знакове множення destReg=regA*regB  9 XIDIV Знакове ділення і обмін операндів місцями  Логічні № Мнемонічний код Зміст  1 AND Побітове логічне I: destReg=regA&regB  2 XOR Додавання по модулю 2: destReg=regA#regB  17 CMPGE Порівняти regA і regB, destReg=regA>=regB  Керування та умовні переходи № Мнемонічний код Зміст  2 JMAE Беззнакове більше/рівно, PC=PC+1+offSet  10 JNMAE Беззнакове не більше/рівно, PC=PC+1+offSet  3. Додатковий спосіб адресації. № Адресація  1 Безадресна – реалізація стеку  4. Регістри стану. № Мнемонічний код Зміст  2 BSF Побітове сканування в прямому (від молодших до старших) напрямку regA в пошуках біта з 1, повертає номер позиції в destReg. Якщо 1 знайдено ZF=1.  3 BSR Побітове сканування в зворотньому напрямку (від старших до молодших) regA в пошуках біта з 1, повертає номер позиції в destReg. Якщо 1 знайдено ZF=1.  5 JNE Перейти, якщо більше чи рівно, if (ZF!=0) PC=offset   Теоретечна частина В ході виконання даного курсового проекту студент має ознайомитись та опанувати архітектуру CISC - комп’ютера. Приведемо основні принципи даної архітектури, які запропонував Джон фон Нейман: Інформація кодується в двійковому представленні. Інформація в комп’ютері ділиться на команди і дані. Різнотипні за змістом слова розрізняються за способом застосування, а не по способу кодування. Слова інформації розміщаються в комірках пам’яті та ідентифікуються номерами комірок - адресами слів. Пам’ять є лінійною. Пам’ять має довільну адресацію. Команди і дані зберігаються в одній пам’яті. Алгоритми представляються у вигляді послідовності керуючих слів, як називаються командами. Команда визначається найменуванням операції та слів інформації, які в ній приймають участь. Алгоритм записаний у вигляді послідовності команд, називається програмою. Весь набір виконуваних комп’ютером команд називається системою команд комп’ютера. Виконання обчислень, які визначені алгоритмом, являють собою послідовне виконання команд в порядку визначеному програмою. Для виконання задачі на комп’ютері необхідно: забезпечити вибірку команди програми із його пам’яті в заданій послідовності, організувати звернення до неї за відповідними адресами; забезпечити розпізнавання типів виконуваних операцій; організувати звернення до пам’яті за відповідними адресами для вибірки необхідних для виконання кожної команди даних; організувати виконання над даними операцій відповідно до вказівок команд; запам’ятати результат обчислень. Комп'ютер виконує кожну команду як послідовність простих операцій: Вибірка чергової команди із основної пам'яті. Визначення типу вибраної команди, тобто її дешифрування. Визначення адрес даних, необхідних для виконання цієї команди. Виконання операцій пересилання даних (зчитування даних із пам'яті в регістри процесора). Виконання операції відповідно до її коду в полі коду операції команди. Визначення адрес, за якими запам'ятовуються результати. Запам'ятовування результатів. Підготовка до виконання наступної команди, тобто обчислення її адреси. Для процесора комп'ютера із складною системою команд характерні наступні особливості: виконання команди за багато тактів, оскільки для цього потрібно здійснити багаторазові операції звернення до основної пам'яті та до програмно-доступних регістрів процесора; орієнтація АЛП на виконання великої кількості операцій, що пов'язано з розширеним складом системи команд; складна система розпізнавання команди, що пов'язано з великою кількістю методів адресації та великою кількістю форматів команд різної розрядності; програмне дешифрування команд з метою зменшення затрат обладнання; складна організація конвеєризації виконання команд, що пов'язано, в першу чергу, з різнотипністю їх виконання; орієнтація структури на виконання команд типу регістр-пам'ять та пам'ять-пам'ять. Основні елементи процесора - арифметико-логічний пристрій, пристрій керування і регістрова пам'ять або, як її ще називають, надоперативний запам’ятовуючий пристрій. До складу регістрової пам’яті, в свою чергу, входять наступні вузли - програмний лічильник, регістри: адреси, команди, даних, слова стану програми, а також регістровий файл, який складається з програмно доступних регістрів. Регістрова (надоперативна) пам'ять процесора складається з регістрів спеціального та зального призначення. До регістрів спеціального призначення належать: регістри адреси (РгА); регістри команд (РгК); програмний лічильник(ПЛ) регістри даних (РгД). РгА зберігає адресу даного або команди при зверненні до основної пам'яті. РгД зберігає операнд при його запису або зчитуванні з основної пам'яті. В ролі операнда може бути дане, команда або адреса. РгК зберігає команду після її зчитування з основної пам'яті. ПЛ підраховує команди та зберігає адресу поточної команди. Комп'ютер з архітектурою Джона фон Неймана має один програмний лічильник. Більшість комп'ютерів мають в складі процесора тригери для зберігання бітів стану процесора, або, як їх іще називають, прапорців. Кожен прапорець має спеціальне призначення. Частина прапорців вказує на результати арифметичних і логічних операцій: додатній результат (Р), від'ємний результат (N), нульовий результат (Z), перенос (С), арифметичне переповнення (V), і т. д. В системі команд комп'ютера є команди, які вказують процесору коли встановити чи скинути ці тригери. Інша частина прапорців вказує режими захисту пам'яті. Існують також прапорці, які вказують пріоритети виконуваних програм. В деяких процесорах додаткові тригери служать для зберігання кодів умов, формуючи регістр кодів умов. Взяті разом описані прапорці формують слово стану програми (ССП), а відповідні тригери - регістр ССП. Регістри загального призначення (РЗП) є програмно доступними. Зазвичай 'їх називають регістровим файлом. Вони можуть використовуватись програмістом в якості регістрів для зберігання вхідних та вихідних даних, а також проміжних результатів обчислень, в якості адресних та індексних регістрів при виконанні операцій модифікації адрес. Система команд Різноманітність типів даних, форм представлення та опрацювання, необхідні дії для обробки та керування ходом виконання обчислень призводить до необхідності використання різноманітних команд – набора команд. Кожен процесор має власний набір команд, який називається системою команд комп’ютера. Система команд характеризується трьома аспектами: формат, способи адресації, система операцій. Форматом команди є довжина команди, кількість, розмір, положення, призначення та спосіб кодування полів. Команди мають включати наступні види інформації: тип операції, яку необхідно реалізувати в даній команді (поле команду операції - КОП) місце в пам’яті звідки треба взяти перший операнд (А1); місце в пам’яті звідки треба взяти другий операнд (А2); місце в пам’яті куди треба помістити результат (А3). Кожному з цих видів інформації відповідає своя частина двійкового слова (поле команди). Реальна система команд зазвичай має команди декількох форматів, тип формату визначає КОП. Команда в комп'ютері зберігається в двійковій формі. Вона вказує тип операції, яка має бути виконаною, адреси операндів, над якими виконується операція, та адреси розміщення результатів виконання операції. Відповідно до цього команда складається з двох частин, коду операції та адресної частини. КОП займає k розрядів. Ним може бути закодовано до N = 2k різних операцій. Кількість двійкових розрядів, які відводяться під код операції, вибирається таким чином, щоб ними можна було закодувати всі виконувані в даному комп'ютері операції. Якщо деякий комп'ютер може виконувати Nc різних операцій, то мінімальна розрядність поля коду операції k визначається наступним чином: k = [log Nc], де вираз в дужках означає заокруглення до більшого цілого. Поле адреси (адресна частина) займає m розрядів. В ньому знаходяться адреси операндів. Кожна адреса займає mi розрядів, де і - номер адреси (і=1,2,...m), 1 - кількість адресних полів. Кожною адресою можна адресувати пам'ять ємністю 2ті слів. Розмір команди k + m повинен бути узгодженим з розміром даних, тобто бути з ним однаковим або кратним цілому числу, що спрощує організацію роботи з пам'яттю. Як правило, розмір команди рівний 8, 16, 32 біти. При написанні програми крім двійкової можуть використовуватись й інші форми представлення команд: вісімкова, шістнадцяткова, символьна (мнемонічна). Використання вісімкового і шістнадцяткового кодування дозволяє скоротити записи і спростити роботу програміста. Як відомо 3 двійкових розряди (тріада) замінюються на 1 вісімковий, а 4 двійкових розряди (тетрада) - на 1 шістнадцятковий. Приклад: (000011111111)2= (0377)8= (0FF)16; Мнемонічне кодування спрощує процес написання, читання і відлагодження програми. Основний принцип такого кодування - кожна команда представляється 3-х або 4-х буквеним символом, який показує назву команди. Деякі приклади мнемонічного кодування: ADD - додати (add), SUB - відняти (subtract), MPY - перемножити (multiply), DIV - поділити (divide), Операнди також представляються символічно. Наприклад команда ADD R Y означає додавання вмісту комірки пам'яті Y до вмісту регістра R. Зауважимо, що операція виконується над вмістом, а не над адресою комірки пам'яті та регістра. Таким чином, з'являється можливість написання машинних програм в символічній формі. Повний набір символічних назв і правила їх використання утворюють мову програмування, відому як асемблерна мова. Символічні імена називаються мнемонічними, а правила їх використання для створення команд і програм називаються синтаксисом мови. Програму, яка переводить із мнемонічного коду асемблерної мови в машинний, називають асемблером. Команди, які використовуються для переводу вихідної програми в асемблерну, називають командами асемблера. Ці команди вказують як інтерпретувати назви, де розмістити програму в пам'яті, яка кількість комірок пам'яті необхідна для зберігання даних. Способи адресації Варіанти інтерпретації бітів (розрядів) поля адреси з метою знаходження операнда називають способами адресації. Коли команда вказує на операнд, він може знаходитись в самій команді, в основній або зовнішній пам'яті чи в регістровій пам'яті процесора. За роки існування комп'ютерів була створена своєрідна технологія адресації, яка передбачає реалізацію різних способів адресації, чому послужило ряд причин: забезпечення ефективного використання розрядної сітки команди; забезпечення ефективної апаратної підтримки роботи з масивами даних; забезпечення задання параметрів операндів; можливість генерації великих адрес на основі малих. Існує велика кількість способів адресації. Розглянемо п’ять основних способів адресації опрандів в командах. Пряма – в цьому випадку адресне поле зберігає адресу операнда. Її різновидом є пряма регістрова адресація, яка адресує не комірку пам’яті а номер регістру. Безпосередня – в поле адреси команди поміщається не адреса, а сам операнд. Непряма – в полі адреси команди зберігається адреса комірки пам’яті в якій знаходиться адреса операнда. Такій спосіб дозволяє оперувати з адресами як з даними. Різновид непряма-регістрова адресація, адреса адреси зберігається в регістрі загального призначення. Відносна – адреса формується, як сума з двох доданків: бази, яка зберігається в спеціальному регістрі чи в одному з регістрів спеціального призначення, та зміщення, яке задається в полі адреси команди. Різновид індексна та базова індексна. При індексній замість базового регістра є індексний, який автоматично модифікується (зазвичай збільшується на 1). Базова-індексна адресація формується адреса як сума трьох доданків: бази, індексу та зміщення. Безадресна – поле адреси в команді відсутнє. Адреса операнда, або немає змісту або є по замовчуванню(наприклад дії на спеціальним регістром - акумулятором). Безадресні команди неможливо використати для інших регістрів чи комірок пам’яті. Одним з різновидів безадресної адресації є використання стеку. Практично у всіх існуючих комп'ютерах використовується один або декілька з цих способів адресації. Тому в команду потрібно вводити спеціальні ознаки з тим, щоб пристрій керування міг розпізнати використаний спосіб. Це можуть бути додаткові розряди в команді, або для різних типів команд закріплюватись різні способи адресації. Алгоритми роботи розробленого емулятора та асемблера / Рис. 1. Схема роботи асемблера Загальна схема роботи асемблера (рис. 1) складається з 2 проходів. На першому проході асемблер перевіряє коректність синтаксису команд. На другому виконується генерування відповідних машинних команд, тобто числового представлення асемблерної команди. Функція readAndParse виконує зчитування рядку асемблерної програми і декодування на відповідні поля: мітка, код операції, операнди. Отримана таким чином і декодована інструкція перевіряється на коректність: існування команди, відповідна кількість аргументів, існування міток та т. п. Функція testRegArg перевіряє коректність використання назви регістра. Функція testAddrArg перевіряє коректність використання адреси. Функція labelArray перетворює відповідну мітку у адресу. Program.as та program.mc – відповідно вхідний та вихідний файли. / Рис. 2 Функціональна схема симулятора Симулятор починає свою роботу ініціалізацією пам’яті та регістрів 0 значеннями (рис. 2.). Наступним кроком відбувається заванаження програми у машинних кодах в пам’ять. Далі відбувається покрокове виконання інструкцій та вивід стану на зовнішній пристрій (чи на екран консолі чи у файл). У stateStruct зберігається стан машини – значення регістрів, пам’яті та програмний лічільник. stateStruct Функція Run виконує обробку інструкцій з пам’яті, функція printState виводить поточний стан машини, а функція convertNum виконує перетворення числа у доповняльний код Опис виконання кожного типу розроблених інструкцій у потактовому режимі Інструкції R-типу 31 27 26 22 21 19 18 16 15 3 2 0 unused opcode regA regB unused destR   Розберем процесс виконання інструкцій R-типу у потактовому режимі. Для прикладу розглянемо інструкцію ADD, що додає два числа (regA та regB) і зберігає результат до destReg. Фаза Мнемонічний запис Опис  1 PC → MEM_ADDRESS Вибірка команди з пам’яті до регістру інструкцій.  2 MEMORY[MEM_ADDRESS] → MEM_DATA   3 MEM_DATA → INSTRUCT_REG   4 PC ← PC + 6 Інкрементація лічильнику.  5 REGISTER_FILE[INSTRUCT_REG[35-30]] → ALU_OP Вибірка regA з регістрового файлу і занесення операду до ALU_OP.  6 REGISTER_FILE[INSTRUCT_REG[29-24]] → ALU Вибірка regB з регістрового файлу і передача операнду до ALU.  7 ALU ←CONTROL UNIT [INSTRUCT_REG[40-36]] Визначення коду операції та подача сигналу на виконання.  8 ALU → ALU_RESULT Запис результату обчислення до ALU_RESULT.  9 REGISTER_FILE[INSTRUCT_REG[5-0]] ← ALU_RESULT Вибірка destReg з регістрового файлу та запис результату обчислення до destReg.  Табл. 1 Виконання інструкцій R-типу у потактовому режимі Інструкції I-типу 31 27 26 22 21 19 18 16 15 0 unused opcode regA regB offset  Розберем процесс виконання інструкцій I-типу у потактовому режимі. Для прикладу розглянемо інструкцію LW, що завантажує число з памя’ті до регістру. Фаза Мнемонічний запис Опис  1 PC → MEM_ADDRESS Вибірка команди з пам’яті до регістру інструкцій.  2 MEMORY[MEM_ADDRESS] → MEM_DATA   3 MEM_DATA → INSTRUCT_REG   4 PC ← PC + 6 Інкрементація лічильнику.  5 REGISTER_FILE[INSTRUCT_REG[35-30]] → ALU_OP Занесення операндів до АЛП. Визначення коду операції та подача сигналу на виконання. Занесення результату обчислень до ALU_RESULT. Запис кінцевої адреси до MEM_ADDRESS.  6 MEM[INSTRUCT_REG[23-0]] → ALU   7 ALU ←CONTROL UNIT [INSTRUCT_REG[40-36]]   8 ALU → ALU_RESULT   9 ALU_RESULT → MEM_ADDRESS   10 MEMORY[MEM_ADDRESS] → MEM_DATA Вибірка значення з пам’яті і його занесення до MEM_DATA.  11 MEM_DATA →REGISTER_FILE[INSTRUCT_REG[29-24]] Вибірка регістру з регістрового файлу та запис значення, що було взято з пам’яті, до вибраного регістру.  Табл. 2 Виконання інструкцій I-типу у потактовому режимі Інструкції J-типу 31 27 26 22 21 19 18 16 15 0 unused opcode regA regB offset  Розберем процесс виконання інструкцій J-типу у потактовому режимі. Для прикладу розглянемо інструкцію JALR. Фаза Мнемонічний запис Опис  1 PC → MEM_ADDRESS Вибірка команди з пам’яті до регістру інструкцій.  2 MEMORY[MEM_ADDRESS] → MEM_DATA   3 MEM_DATA → INSTRUCT_REG   4 PC ← PC + 6 Інкрементація лічильнику.  5 INSTRUCT_REG[INSTRUCT_REG[29-24]] ← PC Збереження PC + 1 до регістру regB.  6 REGISTER_FILE[INSTRUCT_REG[35-30]] → PC Перехід до адреси, що збережена у regA.  Інструкції O-типу 31 27 26 22 21 0 unused opcode Unused  Розберемо процес пивконання інструкції О-типу у потактовому режимі. Для прикладу розглянемо інструкцію HALT, що зупиняє роботу машини. Фаза Мнемонічний запис Опис  1 PC → MEM_ADDRESS Вибірка команди з пам’яті до регістру інструкцій.  2 MEMORY[MEM_ADDRESS] → MEM_DATA   3 MEM_DATA→ INSTRUCT_REG   4 PC ← PC + 6 Інкрементація лічильнику.  5 ALU ←CONTROL UNIT [INSTRUCT_REG[40-36]] Визначення коду операції та подача сигналу на виконання.  6 HALT | STC Зупинити роботу машини | Встановити CF = 1  Табл. 4 Виконання інструкцій O-типу у потактовому режимі Функціональна схема комп’ютера до модификації До модифікації функціональна схема комп’ютера мала наступний вигляд: / Рис. 10 Функціональна схема комп’ютера до модификації Функціональна схема комп’ютера після модификації Після модифікації функціональна схема комп’ютера мала наступний вигляд: / Рис. 11 Функціональна схема комп’ютера після модификаці Опис розроблених форматів команд № Код інструкції Двійкове значення Зміст Тип  1 ADD 00000 Додавання destReg=regA+regB R  2 DIV 01000 Беззнакове ділення destReg=regA/regB R  3 IMUL 01001 Знакове множення destReg=regA*regB R  4 XIDIV 01010 Знакове ділення і обмін операндів місцями R  5 AND 01011 Побітове логічне I: destReg=regA&regB R  6 NAND 00001 Виконує логічне побітове І-НЕ вмісту regA з вмістом regB, та зберігає в destRe R  7 XOR 01100 Додавання по модулю 2: destReg=regA#regB R  8 CMPGE 01101 Порівняти regA і regB, destReg=regA>=regB R  9 LW 00010 Завантажує regB з пам’яті. Адреса пам’яті формується додаванням зміщення до вмісту regA. I  10 SW 00011 Зберігає вміст регістру regB в пам’ять. Адреса пам’яті формується додаванням зміщення до вмісту regA. I  11 BEQ 00100 Якщо вміст регістрів regA та regB однаковий, виконується перехід на адресу програмний лічильник(ПЛ) + 1+зміщення. I  12 JMAE 01110 Беззнакове більше/рівно, PC=PC+1+offSet I  13 JNMAE 01111 Беззнакове не більше/рівно, PC=PC+1+offSet I  14 JNE 10010 Перейти, якщо більше чи рівно, if (ZF!=0) PC=offset I  15 JALR 00101 Зберігає ПЛ+1 в regB, в ПЛ адреса поточної (jalr) команди. Виконує перехід на адресу, яка зберігається в regA. Якщо в якості regA regB задано один і той самий регістр, то спочатку в цей регістр запишеться ПЛ+1, а потім виконається перехід до ПЛ+1. J  16 BSF 10000 Побітове сканування в прямому (від молодших до старших) напрямку regA в пошуках біта з 1, повертає номер позиції в destReg. Якщо 1 знайдено ZF=1. J  17 BSR 10001 Побітове сканування в зворотньому напрямку (від старших до молодших) regA в пошуках біта з 1, повертає номер позиції в destReg. Якщо 1 знайдено ZF=1. J  18 HALT 00110 Збільшує значення ПЛ на 1, потім припиняє виконання, симулятор має повідомляти, що виконано зупинку. O  19 NOOP 00111 Нічого не виконується. O  20 PUSH 10011 Записати в стек з 1 регістру O  21 POP 10100 Зчитати з стеку в 1 регістр O   Висновок Під час виконання курсової роботи я опанував та закріпив на практиці знання про принципи дії та архітектуру прототипних варіантів CISC комп’ютера. Крім того курсовий проект допоміг зрозуміти інструкції простої асемблерної мови та як транслювати програми в машинну мову. Джерела 1. Мельник А. О. Архітектура комп’ютера, Луцьк – 2008 2. Каган Б. М. Электронные вычислительные машины и системы, М.: Радио и связь - 1990 3. Угрюмов Е. П. Цифровая схемотехника – Санкт-Петербург - 2000 4. Мельник А. О. Програмовані процесори обробки сигналів, Львів - 2000 5. Tanenbaum, Andrew. Structured Computer Organization, NJ: Prentice Hall – 1999 Додаток 1 Перевірка правильності реалізованих команд у прикладах div: 30/5=6 Програма: lw 0 1 num1 lw 0 2 num2 div 1 2 3 done halt num1 .fill 30 num2 .fill 5 Машинний код: 8454148 8519685 34209795 25165824 30 5 Кінцевий стан: @@@ state: pc 4 ZF = 0 stack: memory: mem [0] 8454148 mem [1] 8519685 mem [2] 34209795 mem [3] 25165824 mem [4] 30 mem [5] 5 registers: reg [0] 0 reg [1] 30 reg [2] 5 reg [3] 6 reg [4] 0 reg [5] 0 reg [6] 0 reg [7] 0 end state and: 5&3=1 Програма: lw 0 1 num1 lw 0 2 num2 and 1 2 3 done halt num1 .fill 5 num2 .fill 3 Машинний код: 8454148 8519685 46792707 25165824 5 3 Кінцевий стан: @@@ state: pc 4 ZF = 0 stack: memory: mem [0] 8454148 mem [1] 8519685 mem [2] 46792707 mem [3] 25165824 mem [4] 5 mem [5] 3 registers: reg [0] 0 reg [1] 5 reg [2] 3 reg [3] 1 reg [4] 0 reg [5] 0 reg [6] 0 reg [7] 0 end state jmae: if(3>=2) => reg[4]=2; else reg[5]=3; reg[4]=2; Програма: lw 0 1 num1 lw 0 2 num2 jmae 1 2 3 lw 0 5 num1 lw 0 4 num2 done halt num1 .fill 3 num2 .fill 2 Машинний код: 8454148 8519685 59375617 8716294 8650759 25165824 7 4 Кінцевий стан: @@@ state: pc 6 ZF = 0 stack: memory: mem [0] 8454150 mem [1] 8519687 mem [2] 59375617 mem [3] 8716294 mem [4] 8650759 mem [5] 25165824 mem [6] 3 mem [7] 2 registers: reg [0] 0 reg [1] 3 reg [2] 2 reg [3] 0 reg [4] 2 reg [5] 0 reg [6] 0 reg [7] 0 end state jne: if(ZF != 0) end of program; else reg[4]=16; Програма: lw 0 1 num1 bsr 1 0 3 jne 0 0 4 lw 0 4 num1 done halt num1 .fill 16 Машинний код: 8454149 71827456 75497476 8454149 25165824 16 Кінцевий стан: @@@ state: pc 5 ZF = 1 stack: memory: mem [0] 8454149 mem [1] 71827456 mem [2] 75497476 mem [3] 8454149 mem [4] 25165824 mem [5] 16 registers: reg [0] 0 reg [1] -2147483648 reg [2] 0 reg [3] 0 reg [4] 0 reg [5] 0 reg [6] 0 reg [7] 0 end state push, pop: push 8; push 4; pop; pop; Програма: lw 0 1 num1 push lw 0 1 num2 push pop pop done halt num1 .fill 8 num2 .fill 4 Машинний код: 8454151 79691776 8454152 79691776 83886080 83886080 25165824 8 4 Проміжний стан після двох операцій push: @@@ state: pc 4 ZF = 0 stack: stack [0] 8 stack [1] 4 memory: mem [0] 8454151 mem [1] 79691776 mem [2] 8454152 mem [3] 79691776 mem [4] 83886080 mem [5] 83886080 mem [6] 25165824 mem [7] 8 mem [8] 4 registers: reg [0] 0 reg [1] 4 reg [2] 0 reg [3] 0 reg [4] 0 reg [5] 0 reg [6] 0 reg [7] 0 end state Кінцевий стан: @@@ state: pc 7 ZF = 0 stack: memory: mem [0] 8454151 mem [1] 79691776 mem [2] 8454152 mem [3] 79691776 mem [4] 83886080 mem [5] 83886080 mem [6] 25165824 mem [7] 8 mem [8] 4 registers: reg [0] 0 reg [1] 8 reg [2] 0 reg [3] 0 reg [4] 0 reg [5] 0 reg [6] 0 reg [7] 0 end state Додаток 2 Код програми асемблера #include <stdlib.h> #include <stdio.h> #include <string.h> #define MAXLINELENGTH 1000 #define MAXNUMLABELS 65536 #define MAXLABELLENGTH 7 /* includes the null character termination */ #define ADD 0 #define NAND 1 #define LW 2 #define SW 3 #define BEQ 4 #define JALR 5 #define HALT 6 #define NOOP 7 #define DIV 8 #define IMUL 9 #define XIDIV 10 #define AND 11 #define XOR 12 #define CMPGE 13 #define JMAE 14 #define JNMAE 15 #define JNE 18 #define BSF 16 #define BSR 17 #define PUSH 19 #define POP 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++) { /* printf("%d: label=%s, opcode=%s, arg0=%s, arg1=%s, arg2=%s\n", address, label, opcode, arg0, arg1, arg2); */ /* check for illegal opcode */ if (strcmp(opcode, "add") && strcmp(opcode, "nand") && strcmp(opcode, "lw") && strcmp(opcode, "sw") &&
Антиботан аватар за замовчуванням

12.12.2019 21:12-

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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