МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
/
Курсова робота
На тему: “ПРОЕКТУВАННЯ КОМП'ЮТЕРА”
з дисципліни
«Архітектура комп’ютера»
Анотація
В ході виконання даного курсового проекту передбачає ознайомлення та опанування архітектуру CISC – комп’ютера.
Проект складається з трьох частин. В першій частині розробляється програма, яка перетворює вхідну асемблерну програму у відповідний код на мові машинних інструкцій. В другій частини розробляється поведінковий стимулятор результуючого машинного коду. В третій частині розробляється невеличка програма на асемблерній мові.
CISC (англ.ComplexInstructionSetComputer — комп'ютер зі складним набором команд) — це архітектура системи команд, в якій більшість команд є комплексними, тобто реалізують певний набір простіших інструкцій процесора або шляхом зіставлення з кожною CISC-командою певної мікропрограми, або принаймні можуть бути зведені до набору таких простих інструкцій. Крім того, ознаками CISC-архітектури можна вважати також наявність великої кількості методів адресації пам'яті з можливістю безпосередньої роботи з операндами в основній пам'яті комп'ютера. Тобто, CISC-архітектури відносяться, як правило, до класу двохадресних.
Основні принципи даної архітектури, які запропонував Джон фон Нейман:
1. Інформація кодується в двійковому представленні.
2. Інформація в комп’ютері ділиться на команди і дані.
3. Різнотипні за змістом слова розрізняються за способом застосування, а не по способу кодування.
4. Слова інформації розміщаються в комірках пам’яті та ідентифікуються номерами комірок – адресами слів.
5. Пам’ять є лінійною.
6. Пам’ять має довільну адресацію.
7. Команди і дані зберігаються в одній пам’яті.
8. Алгоритми представляються у вигляді послідовності керуючих слів, як називаються командами. Команда визначається найменуванням операції та слів інформації, які в ній приймають участь. Алгоритм записаний у вигляді послідовності команд, називається програмою.
9. Весь набір виконуваних комп’ютером команд називається системою команд комп’ютера.
Зміст
Вихідні дані на проектування
Аналітичний розділ
Алгоритми роботи розробленого емулятора та ассемблера
Виконання кожного типу розроблених інструкцій
Функціональна схема комп’ютера до модифікації
Функціональна схема після модифікації
Опис розроблених форматів команд
Основні результати роботи (висновок)
Література
Додатки
Вихідні дані на проектування
Реалізація додаткових команд. Необхідно реалізувати 8 додаткових команд. Серед них 3 арифметичні, 3 логічні та 2 команди керування згідно варіанту. Команди не мають повторюватися.
Розрядність
Розрядність шини даних : 32
Розмір пам’яті (Байт) : 65536
Розмір регістрового файлу(к-сть регістрів) : 16
Арифметичні
DIV regAregBdestReg
Беззнакове діленняdestReg=regA/regB
XIMUL regAregBdestReg
Знакове множення і обмін операндів місцями
destReg=regA*regB
XSUB regAregBdestReg
Віднімання і обмін операндів місцями: destReg=regAregB
Логічні
SHR regAregBdestReg
Логічний зсув вправо destReg=regA>>regB
ROL regAregBdestReg
Циклічний зсув вправо destReg=regA<<regB
NOT regAdestReg
Логічне побітове НЕ destReg=~regA
Умовні переходи
JMA regAregBoffSet
Беззнакове більше if (regA>regB) PC=PC+1+offSet
JMNL regAregBoffSet
Знакове не менше if (regA!<regB) PC=PC+1+offSet
Регістр ознаки нуля ZF
CMP regAregB
Порівняти regAregB і встановити прапорці/
BSR regAdestReg
Побітове сканування в зворотньому
напрямку(від старших до молодших) regA в пошуках
біта з 1 , повертає номер позиції в destReg. Якщо 1
знайдено ZF=1, інакше ZF=0
JNE offSet
Перейти, якщо більше чи рівно, if(ZF!
=0)PC=offset
Адресація
Безпосередня
Реалізовані додаткові команди
Мнемонічнй код
Зміст
BDIV
Ділення, реалізоване безпосередньою адресацією
BSUB
Віднімання, реалізоване безпосередньою адресацією
BADD
Додавання, реалізоване безпосередньою адресацією
Аналітичний розділ
В першій частині даного курсового проекту необхідно написати програму, якаперетворює вхідну програму на мові асемблер в мову машинних кодів. Програма маєперетворити асемблерні імена команд в числові еквіваленти, наприклад асемблернукоманду beq в 100, також перетворити символьні імена адрес в числові значення.Результуючий файл має складатися з послідовності 32 бітних інструкцій (біти 31-25інструкції завжди рівні 0).
Формат лінійки асемблерного коду наступний (<пробіл> означає послідовністьтабуляцій і/або пробілів):
мітка <пробіл>інструкція<пробіл>поле№1<пробіл>поле№2<пробіл>поле№3<пробіл>коментар
Крайнє ліве поле лінійки асемблерного коду – поле мітки. Коректна мітка маєскладатися максимуму з 6 символів, символами можуть бути літери або цифри, алепочинатися з букви. Поле мітки є необов’язковим, проте пробіл після даного поля єобов’язковим. Мітки дозволяють значно спростити процес написання асемблернихпрограм, в іншому випадку прийшлось би модифікувати всі адресні частини кожен разколи додавався рядок коду!
Після не обов’язкової мітки іде обов’язковий пробіл. Далі іде поле назви інструкції,в якому може бути ім’я будь якої асемблерної інструкції зазначені вище в таблиці. Післяпробілів ідуть відповідні поля. Всі поля можуть зберігати або десяткові значення абомітки. Кількість полів залежить від інструкції, поля які не використовуються ігноруються.
Після останнього поля має йти пробіл за яким може розміщуватися коментар.Коментар закінчується з кінцем лінії асемблерної програми. Коментарі дуже важливі дляотримання зрозумілої асемблерної програми, тому що інструкції самі по собі малозрозумілі.
Крім інструкцій СК, асемблерна програма може містити директиви для асемблера.В даному курсовому проекті для асемблера використовується лише одна директива - .fill(зверніть увагу на точку попереду). Директива . fill повідомляє компілятору про те, що вінмає зберегти число за адресою відповідно де дана інструкція знаходиться. Директива .fillвикористовує одне поле, в якому може бути як число так і символьна адреса. Наприклад«.fill 32» означає зберегти число 32 за адресою де дана інструкція знаходиться. (Оскількив нас кожен рядок програми відповідає адресі починаючи з 0, то відповідно адреса будедорівнювати номеру рядка - 1). Директива . fill з символьною адресою збереже адресуданої мітки.
Асемблер має виконувати два проходи через асемблерну програму. На першомупроході, асемблер має вирахувати адреси кожної символьної мітки. Виходячи з того, щоперша інструкція знаходить по нульовій адресі. На другому проході, асемблер маєгенерувати машинні інструкції (у вигляді десткових чисел) для кожного рядкуасемблерної мови. Зауважимо, що програмі імена файлів мають передаватися у якості аргументівкомандного рядка. Асемблер має зберігати в результуючому файлі лише машинні командиу вигляді десяткових чисел, одну команду в одному рядку. Порушення даного форматупризведе до того, що вихідний файл не можна буде виконати. Інший вивід (наприклад длявідладки ) програма може виконувати у консоль.
Асемблер має визначати наступні помилки в асемблер ній програмі: використанняне визначених міток, використання однакових міток, використання змішення якеперевищує 16 біт, не визначені команди. Асемблер має повертати 1, якщо він визначивпомилку та 0 у випадку успішного виходу з програми. Асемблер не має визначати помилки виконання програми, тобто помилки які виникають під час виконання програми.
Поведінкова симуляція.
Другою частино даної курсової роботи є створення програми, яка може відсимулювати роботу любого вірного машинного коду СК. Вхідним має бути файл змашинним кодом програми, якій має створити асемблер. Наприклад, якщо назва програмиsimulateта машинний код зберігається в файлі program.mc, програма має запускатисянаступнимчином:
simulateprogram.mc>output
При цьому весь вивід буде виконуватися в файл "output".
Симулятор має розпочинати роботи з ініціалізації вмісту всіх регістрів
Симулятор має виконувати програму доти не зустріне команду halt.
Симулятор має виводити вивід стану комп’ютера перед виконанням кожноїінструкції та один раз перед виходом з програми. Вивід стану має включати вивід вмістувсіх регістрів, ПЛ, пам’яті. Пам’ять має виводитися лише для комірок визначених в файліз машинними кодами (наприклад у наведеному вище прикладі це адреси від 0 до 9).
Алгоритми роботи розробленого емулятора та ассемблера
Алгоритм роботи програми ассемблер:
Зчитати перший рядок вхідного файлу
Розбити його на лексеми (мітка,команда,операнд 1,операнд 2,операнд 3)
Перевірка, чи дійсна команда(чи така існує)
Перевірка полів регістрів для команд операндами яких є регістри
Перевірка полів адрес для команд операндами яких є адреса
Перевірка на наявність інших операндів
Перевірка на правильність мітки (чи назадовга, чи починається з букви,складається з букв і цифр)
Кодування команди в машинний код і запис у вихідний файл
Повторювати алгоритм циклічно до кінця вхідного файлу
Алгоритм роботи програми емулятора:
Ініціалізація пам’яті, регістрів та стеку
Зчитується машинний код
Декодування машинного коду
Виконання заданих команд
Запис стану після виконання однієї команди у вихідний файл
Повторювати циклічно до появи команди виходу
Виконання кожного типу розроблених інструкцій
Інструкції r-типу (add, nand,div,ximul,xsub,shr,rol) потребують наявності 3 полів: поле№1 – regA, поле№2 regB, поле№3 destReg.
Декодування машинного коду, отримання команди і трьох операндів (номерів регістрів)
Виконнання заданої команди(завантаження 1-го операнду в AluOperand,виконання операції, запис результату в AluResult, завантаження в регістр даних з AluResult)
Інструкції і-типу (jma,jmnl) вимагають 3 полів: поле№1 – regA, поле№2 regB
поле№3 – числове значення зміщення чи символьна адреса. Числове значення може бути
як додатнім так і відємним
Декодування машинного коду, отримання команди і трьох операндів (номерів регістрів та адреси переходу)
Виконання заданої команди(завантаження 1-го операнду в AluOperand, виконання порівняння, якщо порівняння виконується, то до РС додається зміщення що зберігається в регістрі)
Інструкції J-типу (not,bsr,cmp) вимагає 2 полів: поле№1 – regA, поле№2 regB
Декодування машинного коду, отримання команди і двох операндів(номерів регістрів)
завантаження першого операнду з данного регістру а АЛП, виконання операції, позицію знайденої 1 записується в AluResult, а після чого з AluResult в регістр,встановлення ZF = 1(якщо знайдено,якщо ні то 0)
Операції BADD, BSUB, BDIV потребують наявності 3 полів: поле№1 – регістр в який записується результат , поле№2- регістр даних, поле№3- константа яка використовується для виконання заданої операції.
Операція JNE поле№3 – числове значення зміщення чи символьна адреса
PC = PC + offsetякщо ZF =1
Функціональна схема комп’ютера до модифікації
/
Рис 1. Функціональна схема Спрощеного Комп’ютера.
Функціональна схема після модифікації
/
Рис. 2 Функціональна схема СК після модифікації
Опис розроблених форматів команд
ADD 1 2 3
31 30 29 24 23 20 19 16 15 4 3 0
unused
opcode
Reg A
Reg B
unused
destReg
Інструкції R-типу (add, nand,div,ximul,xsub,shr,rol):
біти 29-24: код операції
біти 23-20: reg A
біти 19-16: reg B
біти 15-4: не використовуються ( =0)
біти 3-0: destReg
Біти 31-30 не використовує жодна інструкція
тому вони завжди мають дорівнювати 0.
JMNL 1 2 offset
31 30 29 24 23 20 19 16 15 0
unused
opcode
Reg A
Reg B
Offset
СК підтримує 4 формати інструкцій. Біти 31-30 не використовує жодна інструкція
тому вони завжди мають дорівнювати 0.
Інструкції І-типу (lw, sw, beq, jma, jmnl)
біти 29-24: код операції
біти 23-20: reg A
біти 19-16: reg B
біти 15-0 : адреса переходу
Біти 31-30 не використовує жодна інструкція
тому вони завжди мають дорівнювати 0.
Інструкції J-типу (jalr,bsr, cmp, not):
біти 29-24: код операції
біти 23-20: reg A
біти 19-16: reg B
біти 15-0: не використовуються ( =0)
Біти 31-30 не використовує жодна інструкція
тому вони завжди мають дорівнювати 0.
Інструкції 0-типу (noop, halt)
біти 29-24: код операції
біти 23-0: не використовуються ( =0)
Біти 31-30 не використовує жодна інструкція
тому вони завжди мають дорівнювати 0.
Інструкції К-типу (jne)
біти 29-24: код операції
біти 23-20: reg A
біти 19-0: не використовуються ( =0)
Висновок:
Розроблені програми – асемблер та симулятор працюють вірно. Тести для всіх функцій пройшли перевірку. Виконуючи цю курсову роботу я засвоїв методи розробки архітектури спрощеного комп’ютера. Також я засвоїв написання коду різних функцій для СК а також засвоїв різні типи адресації інструкцій комп’ютера.
Також була досягнута головна мета – розроблена модель архітектури спрощеного комп’ютера (СП). Дана модель побудована на основі CISC архітектури і забезпечила виконання всіх основних принципів описаних фон Нейманом:
Вся інформація ділиться на команди і дані
Команди і дані розміщуються в одній пам’яті, доспуп до них можна отримати по адресі комірки
Пам’ять є лінійною
Пам’ять має довільну адресацію
Алгоритми представляються у послідовності команд
Та інші.
Одже дана модель відповідає всім поставленим вимог і є простим прикладом комп’ютера з CISC архітектурою.
Додатки:
Текст набраної програми для перевірки операції ADD
lw 0 1 op1
lw 0 2 op2
lw 0 3 op3
add 1 2 3
donehalt
op1 .fill 10
op2 .fill 2
op3 .fill 0
Машинні коди цієї програми :
33619973
33685510
33751047
1179651
100663296
10
2
0
Результат:
Register[1] = 10
Register[2] = 2
Register[3] = 12
Текст набраної програми для перевірки операції BADD
lw 0 1 a
badd 3 1 10
donehalt
a .fill 100
Машинні коди цієї програми :
33619971
355532810
100663296
100
Результат:
Register[1] = 100
Register[2] = 0
Register[3] = 110
Текст набраної програми для перевірки операції BDIV
lw 0 1 a
bdiv 3 1 1000
donehalt
a .fill 10000
Машинні коди цієї програми :
33619971
321979368
100663296
10000
Результат:
Register[1] = 10000
Register[2] = 0
Register[3] = 10
Текст набраної програми для перевірки операції BSR
lw 0 1 op1
lw 0 2 op2
bsr 1 2
donehalt
op1 .fill 32
op2 .fill 0
Машинні коди цієї програми :
33619972
33685509
286392320
100663296
32
0
Результат:
Register[1] = 32
Register[2] = 6
Register[3] = 0
Текст набраної програми для перевірки операції BSUB
lw 0 1 a
bxsub 3 1 10
donehalt
a .fill 100
Машинні коди цієї програми :
33619971
338755594
100663296
100
Результат:
Register[1] = 100
Register[2] = 0
Register[3] = 90
Текст набраної програми для перевірки операції CMP
lw 0 1 op1
lw 0 2 op2
lw 0 3 op3
cmp 1 2
donehalt
op1 .fill 10
op2 .fill 10
op3 .fill 0
Машинні коди цієї програми :
33619973
33685510
33751047
269615104
100663296
10
10
0
Результат:
Register[1] = 10
Register[2] = 10
Register[3] = 0
CF=0
SF=0
ZF=1
Текст набраної програми для перевірки операції DIV
lw 0 1 op1
lw 0 2 op2
lw 0 3 op3
div 1 2 3
donehalt
op1 .fill 10
op2 .fill 2
op3 .fill 0
Машинні коди цієї програми :
33619973
33685510
33751047
135397379
100663296
10
2
0
Результат:
Register[1] = 10
Register[2] = 2
Register[3] = 5
Текст набраної програми для перевірки операції JMA
lw 0 1 op1
lw 0 2 op2
lw 0 3 op3
jma 1 2 e
jma 2 1 l
e xsub 1 2 3
endhalt
l add 1 2 3
donehalt
op1 .fill 10
op2 .fill 5
op3 .fill 0
Машинні коди цієї програми :
33619977
33685514
33751051
236060673
237043714
168951811
100663296
1179651
100663296
10
5
0
Результат:
Register[1] = 5
Register[2] = 10
Register[3] = 5
Текст набраної програми для перевірки операції JMNL
lw 0 1 op1
lw 0 2 op2
lw 0 3 op3
jmnl 1 2 e
jmnl 2 1 l
e xsub 1 2 3
endhalt
l add 1 2 3
donehalt
op1 .fill 10
op2 .fill 50
op3 .fill 0
Машинні коди цієї програми :
33619977
33685514
33751051
252837889
253820930
168951811
100663296
1179651
100663296
10
50
0
Результат:
Register[1] = 10
Register[2] = 50
Register[3] = 60
Текст набраної програми для перевірки операції NOT
33619972
33685509
219152386
100663296
10
1
Машинні коди цієї програми :
33619971
286392320
100663296
4
Результат:
Register[1] = 10
Register[2] = -11
Текст набраної програми для перевірки операції ROL
lw 0 1 op1
lw 0 2 op2
lw 0 3 op3
rol 1 2 3
donehalt
op1 .fill -1
op2 .fill 1
op3 .fill 0
Машинні коди цієї програми :
33619973
33685510
33751047
202506243
100663296
4294967295
1
0
Результат:
Register[1] = -1
Register[2] = 1
Register[3] = -1
Текст набраної програми для перевірки операції SHR
lw 0 1 op1
lw 0 2 op2
lw 0 3 op3
shr 1 2 3
donehalt
op1 .fill 12
op2 .fill 2
op3 .fill 0
Машинні коди цієї програми :
33619973
33685510
33751047
185729027
100663296
12
2
0
Результат:
Register[1] = 12
Register[2] = 2
Register[3] =3
Текст набраної програми для перевірки операції XIMUL
lw 0 1 op1
lw 0 2 op2
lw 0 3 op3
ximul 1 2 3
donehalt
op1 .fill 100
op2 .fill -2
op3 .fill 0
Машинні коди цієї програми :
33619973
33685510
33751047
152174595
100663296
100
4294967294
0
Результат:
Register[1] = -2
Register[2] = 100
Register[3] =-200
Текст набраної програми для перевірки операції XSUB
lw 0 1 op1
lw 0 2 op2
lw 0 3 op3
xsub 1 2 3
donehalt
op1 .fill -10
op2 .fill 4
op3 .fill 0
Машинні коди цієї програми :
33619973
33685510
33751047
168951811
100663296
4294967286
4
0
Результат:
Register[1] = 4
Register[2] = -10
Register[3] =14