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

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

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

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

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

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

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА” / КАФЕДРА ЕЛЕКТРОННИХ ОБЧИСЛЮВАЛЬНИХ МАШИН Пояснювальна записка до курсової роботи з дисципліни “Архітектура комп’ютерів” на тему: “Проектування комп’ютера” Анотація Курсовий проект з дисципліни "Архітектура комп’ютера" являє собою підсумок у вивченні предмету "Архітектура комп’ютерів ч.1". Під час його виконання необхідно засвоїти знання про принципи дії та архітектуру прототипних варіантів CISC-комп’ютера. Також під час виконання курсової роботи необхідно зрозуміти та опанувати інструкції асемблерної мови і принцип трансляції асемблерної програми у машинний код. Даний курсовий проект складається з трьох частин : Розробка програми-асемблера, яка перетворює вхідний асемблерний код програми у відповідний код на мові машинних інструкцій. Розробка поведінкового симулятора результуючого машинного коду. Розробка тестової програми на асемблерній мові. Також до записки з курсової роботи входять додатки, з вихідними кодами програми-асемблера, симулятора і кодом тестової програми з результатами її виконання. ЗМІСТ Вихідні дані на проектування Варіант №17 № Розрядність Арифметичні Логічні Керування Прапорці Адресація    1 2 3 4 5 6 7 8  1 2 3   17 3 3 5 9 1 2 17 1 4 ZF 2 3 5 1   Визначити формати команд згідно розрядності шини даних, розміру пам’яті та регістрового файлу. № Розрядність шини даних Розмір пам’яті (Байт) Розмір регістрового файлу(к-сть регістрів)  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   Реалізувати додатковий спосіб адресації. № Адресція  1 Безадресна – реалізація стеку. Максимальна глибина 32 слова по 32 розряди.  Примітка: безадресний варіант передбачає створення стеку та реалізацію 2 додатковий команд наведених в таблиці. Безадресні команди. Мнемонічнй код Зміст  POP Зчитати з стеку в 1 регістр  PUSH Записати в стек з 1 регістру   Регістри стану: ZF – Регістр ознаки нуля. № Мнемонічний код Зміст  Регістр ознаки нуля (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   + додаткова команда CMP для встановлення прапорця № Мнемонічний код Зміст  4 CMP regA regB  ZF  regA < regB 0  regA = regB 1  regA > regB 0  Порівняти regA regB і встановити прапорець  Вступ Архітектура рівня множинних інструкцій (Instruction Set Architecture, ISA) є межею поміж апаратним та програмним забезпеченням комп’ютера. Саме на цей рівень архітектури спирається системний програміст в розробці програмного забезпечення для прикладного програміста, а саме, ОС, утиліт, драйверів, бібліотек, компіляторів тощо. Вже відомо, що двома основними архітектурами множини інструкцій є CISC i RISC. CISC – Complex Instruction Set Computer - архітектура з повною множиною інструкцій (або архітектура із складною системою команд ). Фундатором CISC архітектури вважають фірму IBM з її базовою архітектурою 360, ядро якої використовують з 1964 року і до сьогодні, (наприклад, в таких сучасних мейнфеймах як IBM ES/9000). Лідером в розробці мікропроцесорів на основі архітектури СISC є компанія Intel зі своїми серіями х86 і Pentium. Ця архітектура де-факто є стандартом для ринку мікроком’ютерів. Для архітектури CISC характерне порівняно невелике число регістрів загального призначення; велика кількість машинних команд, деякі з яких семантично навантажені аналогічно операторам мов програмування високого рівня і виконуються за багато тактів; велика кількість методів адресації; велика кількість методів адресації; велика кількість форматів команд різної розрядності; переважання двоадресного формату команд; наявність команд типу регістр пам’ять. Більшість сучасних процесорів для персональних комп'ютерів побудована за архітектурою CISC. Останнім часом з'явилися гібридні процесори, що мають систему команд CISC, однак усередині перетворюють їх на ланцюжки RISC-команд, які й виконуються ядром процесора. Поступове ускладнення CISC-процесорів відбувається в напрямку більш досконалого управління машинними ресурсами, а також у напрямку зближення машинних мов із мовами високого рівня. Основні принципи архітектури комп’ютерів Архітектурні принципи В ході виконання даного курсового проекту студент має ознайомитись та опанувати архітектуру CISC–комп’ютера. Приведемо основні принципи даної архітектури, які запропонував Джон фон Нейман: Інформація кодується в двійковому представленні. Інформація в комп’ютері ділиться на команди і дані. Різнотипні за змістом слова розрізняються за способом застосування, а не по способу кодування. Слова інформації розміщаються в комірках пам’яті та ідентифікуються номерами комірок – адресами слів. Пам’ять є лінійною. Пам’ять має довільну адресацію. Команди і дані зберігаються в одній пам’яті. Алгоритми представляються у вигляді послідовності керуючих слів, як називаються командами. Команда визначається найменуванням операції та слів інформації, які в ній приймають участь. Алгоритм записаний у вигляді послідовності команд, називається програмою. Весь набір виконуваних комп’ютером команд називається системою команд комп’ютера. Виконання обчислень, які визначені алгоритмом, являють собою послідовне виконання команд в порядку визначеному програмою. Для виконання задачі на комп’ютері необхідно: забезпечити вибірку команди програми із його пам’яті в заданій послідовності, організувати звернення до неї за відповідними адресами; забезпечити розпізнавання типів виконуваних операцій; організувати звернення до пам’яті за відповідними адресами для вибірки необхідних для виконання кожної команди даних; організувати виконання над даними операцій відповідно до вказівок команд; запам’ятати результат обчислень. Комп'ютер виконує кожну команду як послідовність простих операцій: Вибірка чергової команди із основної пам'яті. Визначення типу вибраної команди, тобто її дешифрування. Визначення адрес даних, необхідних для виконання цієї команди. Виконання операцій пересилання даних (зчитування даних із пам'яті в регістри процесора). Виконання операції відповідно до її коду в полі коду операції команди. Визначення адрес, за якими запам'ятовуються результати. Запам'ятовування результатів. Підготовка до виконання наступної команди, тобто обчислення її адреси. Для процесора комп'ютера із складною системою команд характерні наступні особливості: виконання команди за багато тактів, оскільки для цього потрібно здійснити багаторазові операції звернення до основної пам'яті та до програмно-доступних регістрів процесора; орієнтація АЛП на виконання великої кількості операцій, що пов'язано з розширеним складом системи команд; складна система розпізнавання команди, що пов'язано з великою кількістю методів адресації та великою кількістю форматів команд різної розрядності; програмне дешифрування команд з метою зменшення затрат обладнання; складна організація конвеєризації виконання команд, що пов'язано, в першу чергу, з різнотипністю їх виконання; орієнтація структури на виконання команд типу регістр-пам'ять та пам'ять-пам'ять. Основні елементи процесора - арифметико-логічний пристрій, пристрій керування і регістрова пам'ять або, як її ще називають, надоперативний запам'ятовуючий пристрій. До складу регістрової пам'яті, в свою чергу, входять наступні вузли - програмний лічильник, регістри: адреси, команди, даних, слова стану програми, а також регістровий файл, який складається з програмно доступних регістрів. Структура регістрової (надоперативної) пам'яті процесора складається з регістрів спеціального та зального призначення. До регістрів спеціального призначення належать: регістри адреси (РгА); регістри команд (РгК); програмний лічильник(ПЛ) регістри даних (РгД). РгА зберігає адресу даного або команди при зверненні до основної пам'яті. РгД зберігає операнд при його запису або зчитуванні з основної пам'яті. В ролі операнда може бути дане, команда або адреса. РгК зберігає команду після її зчитування з основної пам'яті. ПЛ підраховує команди та зберігає адресу поточної команди. Комп'ютер з архітектурою Джона фон Неймана має один програмний лічильник. Більшість комп'ютерів мають в складі процесора тригери для зберігання бітів стану процесора, або, як їх іще називають, прапорців. Кожен прапорець має спеціальне призначення. Частина прапорців вказує на результати арифметичних і логічних операцій: додатній результат (Р), від'ємний результат (N), нульовий результат (Z), перенос (С), арифметичне переповнення (V), і т. д. В системі команд комп'ютера є команди, які вказують процесору коли встановити чи скинути ці тригери. Інша частина прапорців вказує режими захисту пам'яті. Існують також прапорці, які вказують пріоритети виконуваних програм. В деяких процесорах додаткові тригери служать для зберігання кодів умов, формуючи регістр кодів умов. Взяті разом описані прапорці формують слово стану програми (ССП), а відповідні тригери - регістр ССП. Регістри загального призначення (РЗП) є програмно доступними. Зазвичай їх називають регістровим файлом. Вони можуть використовуватись програмістом в якості регістрів для зберігання вхідних та вихідних даних, а також проміжних результатів обчислень, в якості адресних та індексних регістрів при виконанні операцій модифікації адрес. Система команд Різноманітність типів даних, форм представлення та опрацювання, необхідні дії для обробки та керування ходом виконання обчислень призводить до необхідності використання різноманітних команд – набора команд. Кожен процесор має власний набір команд, який називається системою команд процесора. Система команд характеризується трьома аспектами: формат; способи адресації; система операцій. Форматом команди – є довжина команди, кількість, розмір, положення, призначення та спосіб кодування полів. Команди мають включати наступні види інформації: тип операції, яку необхідно реалізувати в даній команді (поле команду операції - КОП); місце в пам’яті звідки треба взяти перший операнд (А1); місце в пам’яті звідки треба взяти другий операнд (А2); місце в пам’яті куди треба помістити результат (А3). Кожному з цих видів інформації відповідає своя частина двійкового слова – поле. Реальна система команд зазвичай має команди декількох форматів, тип формату визначає КОП. Команда в комп'ютері зберігається в двійковій формі. Вона вказує тип операції, яка має бути виконаною, адреси операндів, над якими виконується операція, та адреси розміщення результатів виконання операції. Відповідно до цього команда складається з двох частин, коду операції та адресної частини. КОП займає k розрядів. Ним може бути закодовано до N = 2k різних операцій. Кількість двійкових розрядів, які відводяться під код операції, вибирається таким чином, щоб ними можна було закодувати всі виконувані в даному комп'ютері операції. Якщо деякий комп'ютер може виконувати Nc різних операцій, то мінімальна розрядність поля коду операції k визначається наступним чином: k = [log Nc], де вираз в дужках означає заокруглення до більшого цілого. Поле адреси (адресна частина) займає m розрядів. В ньому знаходяться адреси операндів. Кожна адреса займає mi розрядів, де і - номер адреси (і=1,2,...n), n - кількість адресних полів. Кожною адресою можна адресувати пам'ять ємністю 2nі слів. Розмір команди 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. Функціональна схема СК до модифікації / Рис 2. Функціональна схема СК після модифікації В СК було додано 14 інструкцій, внаслідок чого поле КОП збільшилося на 2 біти – до 5 біт (можна кодувати до 32 інструкцій, з яких використано 21). Розмір регістрового файлу (кількість регістрів загального призначення) було збільшено до 16 – відповідно поля Reg A, Reg B та DestReg збільшилися до 4 біт (24 = 16). Був доданий регістр (прапорець) ознаки нуля – ZF Інструкції R-типу (add, nand, div, imul, xidiv, xor, cmpge) Біти Призначення  31-29 не використовуються  28-24 код операції  23-20 reg A  19-16 reg B  15-4 не використовуються  3-0 destReg   / Інструкції I-типу (lw, sw, beq, jmae, jmnae) Біти Призначення  31-29 не використовуються  28-24 код операції  23-20 reg A  19-16 reg B  15-0 зміщення (16 біт, значення від -32768 до 32767)   / Інструкції J-типу (jarl, lg10, cmp, bsr, bsf) Біти Призначення  31-29 не використовуються  28-24 код операції  23-20 reg A  19-16 reg B  15-0 не використовуються   / Інструкції O-типу (halt, push, pop) Біти Призначення  31-29 не використовуються  28-24 код операції  23-0 не використовуються  / Окремо слід відзначити інструкцію jne – її не можна віднести до існуючих типів інструкції, оскільки вона містить інформацію тільки про код операції та зміщення Біти Призначення  31-29 не використовуються  28-24 код операції  23-8 зміщення (16 біт, значення від -32768 до 32767)  7-0 не використовуються   / Потактове виконання інструкції R - типу xidiv 1 2 3: PC ← addr xidiv memAddr ← PC, aluRes ← PC + 1 memData ← mem[memAddr], PC ← aluRes instrReg ← memData instrReg[26-22] decoding MUX ← regA(instrReg[21-19]) aluOp ← regFile[regA] MUX ← regB(instrReg[18-16]) aluRes ← aluOp(regA) / regFile[regB] MUX ← destReg(instrReg[2-0]) regFile[destReg] ← aluRes aluRes ← aluOp(regA) + 0, MUX ← regB(instrReg[18-16]) aluOp ← regFile[RegB] regFile[regB] ← aluRes(regA) MUX ← regA(instrReg[21-19]) aluRes ← aluOp + 0 regFile[regA] ← aluOP(regB) Потактове виконання інструкції I - типу jmae 4 3 loop: PC ← addr jmae memAddr ← PC, aluRes ← PC + 1 memData ← mem[memAddr], PC ← aluRes instrReg ← memData instrReg[26-22] decoding MUX ← regA(instrReg[21-19]) aluOp ← regFile[regA]; MUX ← regB(instrReg[18-16]) if (aluOp(regA) >= regFile[regB]), aluOp ← PC aluRes ← PC + offset(instrReg[15-0]) Потактове виконання інструкції J - типу cmpge 1 2: PC ← addr cmpge memAddr ← PC, aluRes ← PC + 1 memData ← mem[memAddr], PC ← aluRes instrReg ← memData instrReg[26-22] decoding MUX ← regA(instrReg[21-19]) aluOp ← regFile[regA]; MUX ← regB(instrReg[18-16]) ALU ← regFile[regB] if (aluOp(regA) >= regFile[regB]), aluRes ← 1 MUX ← destReg(instrReg[2-0]) regFile[destReg] ← aluRes Висновок: При виконанні даного курсового проекту було реалізовано прототипний CISC – комп’ютер згідно із поставленим завданням. Створений комп’ютер пройшов тестування на коректність виконуваних операцій та на відловлювання помилок у вхідному асемблерному коді при синтаксичному та семантичному аналізі. Засвоєно принципи дії та архітектуру прототипних варіантів CISC – комп’ютера. Було внесено зміни в структуру існуючого симулятора CISC – комп’ютера, а саме, доповнена система команд заданими інструкціями, змінено формат усіх команд в частині КОП. До існуючих типів адресації CISC – комп’ютера було добавлено базово-індексний тип адресації, що в свою чергу призвело до створення 2 додаткових регістрів в структурі комп’ютера. ЛІТЕРАТУРА Мельник А. О. Архітектура комп’ютера. Наукове видання. – Луцьк: Волинська обласна друкарня, 2008. Мельник А. О., Троценко В. В. Проектування комп’ютера. Методичні вказівки. Жмакин А.П. Архитектура ЭВМ. - СПб.: БХВ-Петербург, 2006. - 320 с. Таненбаум Э. Архитектура компьютера.5-е изд. (+CD). - СПб.: Питер, 2007. - 844 с. Patterson D. and Hennessy J. Computer Architecture. A quantitative Approach. Second Edition. - Morgan Kaufmann Publishers, Inc., San Francisco, California, 1996. - 760 p. Додаток 1 Тестові програми Арифметичні команди Код програми: lw 0 1 r1 lw 0 2 r2 lw 0 3 r3 lw 0 4 r4 lw 0 5 r5 lw 0 6 r6 lw 0 7 r7 lw 0 8 r8 lw 0 9 r9 div 1 2 3 imul 4 5 6 xidiv 7 8 9 halt r1 .fill 24 r2 .fill 4 r3 .fill 0 r4 .fill -5 r5 .fill 10 r6 .fill 0 r7 .fill -36 r8 .fill 4 r9 .fill 0 Результати виконання: memory: mem[ 0 ] 33619981 mem[ 1 ] 33685518 mem[ 2 ] 33751055 mem[ 3 ] 33816592 mem[ 4 ] 33882129 mem[ 5 ] 33947666 mem[ 6 ] 34013203 mem[ 7 ] 34078740 mem[ 8 ] 34144277 mem[ 9 ] 135397379 mem[ 10 ] 155516934 mem[ 11 ] 175636489 mem[ 12 ] 100663296 mem[ 13 ] 24 mem[ 14 ] 4 mem[ 15 ] 0 mem[ 16 ] -5 mem[ 17 ] 10 mem[ 18 ] 0 mem[ 19 ] -36 mem[ 20 ] 4 mem[ 21 ] 0 registers: reg[ 0 ] 0 reg[ 1 ] 24 reg[ 2 ] 4 reg[ 3 ] 6 reg[ 4 ] -5 reg[ 5 ] 10 reg[ 6 ] -50 reg[ 7 ] 4 reg[ 8 ] -36 reg[ 9 ] -9 reg[ 10 ] 0 reg[ 11 ] 0 reg[ 12 ] 0 reg[ 13 ] 0 reg[ 14 ] 0 reg[ 15 ] 0 flags: ZF=-1 Логічні команди Код програми: lw 0 1 r1 lw 0 2 r2 lw 0 3 r3 lw 0 4 r4 lw 0 5 r5 lw 0 6 r6 lw 0 7 r7 lw 0 8 r8 lw 0 9 r9 and 1 2 3 xor 4 5 6 cmpge 7 8 9 halt r1 .fill 8 r2 .fill 10 r3 .fill 0 r4 .fill 8 r5 .fill 10 r6 .fill 0 r7 .fill 2 r8 .fill 10 r9 .fill 0 Результати виконання: memory: mem[ 0 ] 33619981 mem[ 1 ] 33685518 mem[ 2 ] 33751055 mem[ 3 ] 33816592 mem[ 4 ] 33882129 mem[ 5 ] 33947666 mem[ 6 ] 34013203 mem[ 7 ] 34078740 mem[ 8 ] 34144277 mem[ 9 ] 185729027 mem[ 10 ] 205848582 mem[ 11 ] 225968137 mem[ 12 ] 100663296 mem[ 13 ] 8 mem[ 14 ] 10 mem[ 15 ] 0 mem[ 16 ] 8 mem[ 17 ] 10 mem[ 18 ] 0 mem[ 19 ] 2 mem[ 20 ] 10 mem[ 21 ] 0 registers: reg[ 0 ] 0 reg[ 1 ] 8 reg[ 2 ] 10 reg[ 3 ] 8 reg[ 4 ] 8 reg[ 5 ] 10 reg[ 6 ] 2 reg[ 7 ] 2 reg[ 8 ] 10 reg[ 9 ] 10 reg[ 10 ] 0 reg[ 11 ] 0 reg[ 12 ] 0 reg[ 13 ] 0 reg[ 14 ] 0 reg[ 15 ] 0 flags: ZF=-1 Умовні переходи Код програми: lw 0 1 r1 lw 0 2 r2 lw 0 3 r3 lw 0 4 r4 lw 0 5 r5 jmae 1 2 loop1 add 1 2 3 loop1 xor 4 5 5 halt r1 .fill 220 r2 .fill 200 r3 .fill 0 r4 .fill 4 r5 .fill 8 Результати виконання: registers: reg[ 0 ] 0 reg[ 1 ] 220 reg[ 2 ] 200 reg[ 3 ] 0 reg[ 4 ] 4 reg[ 5 ] 12 reg[ 6 ] 2000 reg[ 7 ] 220 reg[ 8 ] 360 reg[ 9 ] 6 reg[ 10 ] 0 reg[ 11 ] 9 reg[ 12 ] 12 reg[ 13 ] 0 reg[ 14 ] 2 reg[ 15 ] 2 flags: ZF=-1 Регістр ознаки нуля – ZF Код програми: lw 0 1 r1 lw 0 2 r2 lw 0 3 r3 cmp 1 2 halt r1 .fill 22 r2 .fill 22 r3 .fill 0 Результати виконання: reg[ 0 ] 0 reg[ 1 ] 22 reg[ 2 ] 22 reg[ 3 ] 0 … reg[ 15 ] 0 flags: ZF=1 Код програми: lw 0 1 r1 lw 0 2 r2 bsf 1 2 halt r1 .fill 8 r2 .fill 0 Результати виконання: reg[ 0 ] 0 reg[ 1 ] 8 reg[ 2 ] 3 reg[ 3 ] 0 flags: ZF=1 Додаток 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 LG10 7 #define DIV 8 #define IMUL 9 #define XIDIV 10 #define AND 11 #define XOR 12 #define CMPGE 13 #define JMAE 14 #define JMNAE 15 #define BSR 16 #define BSF 17 #define JNE 18 #define CMP 19 #define PUSH 20 #define POP 21 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
Антиботан аватар за замовчуванням

14.05.2013 23:05-

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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