Курсовая работа: Проектування комп`ютера
біти 24-22: код операції
біти 21-0: не використовуються (=0)
|
Роз'яснення та аналіз основних принципів побудови комп'ютерів на прикладі визначених на реалізацію інструкцій
Структура СК після модифікації:
Рис 1. Функціональна схема СК після модифікації
В СК було додано 13 інструкцій, внаслідок чого поле КОП збільшилося на 2 біти до 5 біт (максимально 32 інструкції з яких використано 21). Решта частина коду операції не зазнала зміни. Був доданий стек глибиною 32 слова по 32 біти, покажчик вершини стеку, прапорець стану ZF.
Перевірка правильності роботи реалізованих команд у прикладах
1. div: 45/5=9.
Програма:
lw 0 1 num1
lw 0 2 num2
div 1 2 3
done halt
num1 .fill 45
num2 .fill 5
Машинний код:
8454148
8519685
34209795
25165824
45
5
Кінцевий стан:
@@@
state:
pc 4
ZF = 0
stack:
memory:
mem[ 0 ] 8454148
mem[ 1 ] 8519685
mem[ 2 ] 34209795
mem[ 3 ] 25165824
mem[ 4 ] 45
mem[ 5 ] 5
registers:
reg[ 0 ] 0
reg[ 1 ] 45
reg[ 2 ] 5
reg[ 3 ] 9
reg[ 4 ] 0
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
end state
2. imul: 3*(-4)=-12.
Програма:
lw 0 1 num1
lw 0 2 num2
imul 1 2 3
done halt
num1 .fill 3
num2 .fill -4
Машинний код:
8454148
8519685
34209795
25165824
3
-4
Кінцевий стан:
@@@
state:
pc 4
ZF = 0
stack:
memory:
mem[ 0 ] 8454148
mem[ 1 ] 8519685
mem[ 2 ] 38404099
mem[ 3 ] 25165824
mem[ 4 ] 3
mem[ 5 ] -4
registers:
reg[ 0 ] 0
reg[ 1 ] 3
reg[ 2 ] -4
reg[ 3 ] -12
reg[ 4 ] 0
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
end state
3. xidiv: 30/(-5)=-6, обміняти операнди місцями.
Програма:
lw 0 1 num1
lw 0 2 num2
xidiv 1 2 3
done halt
num1 .fill 30
num2 .fill -5
Машинний код:
8454148
8519685
42598403
25165824
30
-5
Кінцевий стан:
@@@
state:
pc 4
ZF = 0
stack:
memory:
mem[ 0 ] 8454148
mem[ 1 ] 8519685
mem[ 2 ] 42598403
mem[ 3 ] 25165824
mem[ 4 ] 30
mem[ 5 ] -5
registers:
reg[ 0 ] 0
reg[ 1 ] -5
reg[ 2 ] 30
reg[ 3 ] -6
reg[ 4 ] 0
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
end state
4.and: 5&3=1
0101
&
0011
0001
Програма:
lw 0 1 num1
lw 0 2 num2
andf 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
xor: 5#3=6
0101
#
0011
0110
Програма:
lw 0 1 num1
lw 0 2 num2
xorf 1 2 3
done halt
num1 .fill 3
num2 .fill 5
Машинний код:
8454148
8519685
50987011
25165824
3
5
Кінцевий стан:
@@@
state:
pc 4
ZF = 0
stack:
memory:
mem[ 0 ] 8454148
mem[ 1 ] 8519685
mem[ 2 ] 50987011
mem[ 3 ] 25165824
mem[ 4 ] 3
mem[ 5 ] 5
registers:
reg[ 0 ] 0
reg[ 1 ] 3
reg[ 2 ] 5
reg[ 3 ] 6
reg[ 4 ] 0
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
end state
6. cmpge: 1= 5>=3
Програма:
@@@
state:
pc 4
ZF = 0
stack:
memory:
mem[ 0 ] 8454148
mem[ 1 ] 8519685
mem[ 2 ] 55181315
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
7. jma: if (7>=4) reg[4]=7; else reg[5]=4, reg[4]=7.
Програма:
lw 0 1 num1
lw 0 2 num2
jmae 1 2 1
lw 0 5 num2
lw 0 4 num1
done halt
num1 .fill 7
num2 .fill 4
Машинний код:
8454150
8519687
59375617
8716295
8650758
25165824
7
3
Кінцевий стан:
@@@
state:
pc 6
ZF = 0
stack:
memory:
mem[ 0 ] 8454150
mem[ 1 ] 8519687
mem[ 2 ] 59375617
mem[ 3 ] 8716295
mem[ 4 ] 8650758
mem[ 5 ] 25165824
mem[ 6 ] 7
mem[ 7 ] 4
registers:
reg[ 0 ] 0
reg[ 1 ] 7
reg[ 2 ] 4
reg[ 3 ] 0
reg[ 4 ] 7
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
end state
8. jmnae: if (5!>=6) reg[4]=6; else reg[4]=5, reg[5]=6.
Програма:
lw 0 1 num1
lw 0 2 num2
jmnae 1 2 1
lw 0 5 num2
lw 0 4 num1
done halt
num1 .fill 5
num2 .fill 6
Машинний код:
8454150
8519687
63569921
8716295
8650758
25165824
5
6
Кінцевий стан:
@@@
state
pc 6
ZF = 0
stack:
memory:
mem[ 0 ] 8454150
mem[ 1 ] 8519687
mem[ 2 ] 63569921
mem[ 3 ] 8716295
mem[ 4 ] 8650758
mem[ 5 ] 25165824
mem[ 6 ] 5
mem[ 7 ] 6
registers:
reg[ 0 ] 0
reg[ 1 ] 5
reg[ 2 ] 6
reg[ 3 ] 0
reg[ 4 ] 5
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
end state
9. bsr: if (16=1000) “1” – в позиції 4.
Програма:
lw 0 1 num1
bsr 1 2
done halt
num1 .fill 16
Машинний код:
8454150
8519687
25165824
16
Кінцевий стан:
@@@
state:
pc 3
ZF = 1
stack:
memory:
mem[ 0 ] 8454147
mem[ 1 ] 71958528
mem[ 2 ] 25165824
mem[ 3 ] 16
registers:
reg[ 0 ] 0
reg[ 1 ] -2147483648
reg[ 2 ] 4
reg[ 3 ] 0
reg[ 4 ] 0
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
end state
10. bsf: 8 (1000) – «1» в позиції 3.
Програма:
lw 0 1 num1
bsf 1 2
done halt
num1 .fill 8
Машинний код:
8454147
71958528
25165824
8
Кінцевий стан:
@@@
@@@
state:
pc 3
ZF = 1
stack:
memory:
mem[ 0 ] 8454147
mem[ 1 ] 67764224
mem[ 2 ] 25165824
mem[ 3 ] 8
registers:
reg[ 0 ] 0
reg[ 1 ] 1
reg[ 2 ] 3
reg[ 3 ] 0
reg[ 4 ] 0
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
end state
11. jne: if (16=1000) “1” – в позиції 4, ZF=1: Робота програми завершується, else reg[4]=8.
Програма:
lw 0 1 num1
bsr 1 0 3
jne 0 0 4
lw 0 4 num1
done halt
num1 .fill 8
Машинний код:
8454150
8519687
67764224
8454147
25165824
8
Кінцевий стан:
@@@
state:
@@@
state:
pc 5
ZF = 1
stack:
memory:
mem[ 0 ] 8454149
mem[ 1 ] 71827456
mem[ 2 ] 75497476
mem[ 3 ] 8650757
mem[ 4 ] 25165824
mem[ 5 ] 8
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
12. push, pop: push 2, push 3, pop, pop.
Програма:
lw 0 1 num1
push
lw 0 1 num2
push
pop
pop
done halt
num1 .fill 2
num2 .fill 3
Машинний код:
8454150
79691776
8454151
79691776
83886080
83886080
25165824
2
3
Проміжний стан, після двох push:
@@@
state:
pc 4
ZF = 0
stack:
stk[ 0 ] 2
stk[ 1 ] 3
memory:
mem[ 0 ] 8454151
mem[ 1 ] 79691776
mem[ 2 ] 8454152
mem[ 3 ] 79691776
mem[ 4 ] 83886080
mem[ 5 ] 83886080
mem[ 6 ] 25165824
mem[ 7 ] 2
mem[ 8 ] 3
registers:
reg[ 0 ] 0
reg[ 1 ] 3
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 ] 2
mem[ 8 ] 3
registers:
reg[ 0 ] 0
reg[ 1 ] 2
reg[ 2 ] 0
reg[ 3 ] 0
reg[ 4 ] 0
reg[ 5 ] 0
reg[ 6 ] 0
reg[ 7 ] 0
end state
Висновок
При виконанні даного курсового проекту було реалізовано прототипний CISC - комп’ютер згідно із поставленим завданням. Створений комп’ютер пройшов тестування на коректність виконуваних операцій та на відловлювання помилок у вхідному асемблерному коді при синтаксичному та семантичному аналізі. Засвоєно принципи дії та архітектуру прототипних варіантів CISC - комп’ютера. Було внесено зміни в структуру існуючого симулятора CISC - комп’ютера, а саме, доповнена система команд заданими інструкціями, змінено формат усіх команд в частині КОП. До існуючих типів адресації CISC - комп’ютера було добавлено безадресний тип адресації, що в свою чергу призвело до створення стеку всередині структури комп’ютера. Було проведено аналіз роботи команд усіх типів та написано тести з поданням результату роботи симулятора у вигляді виведеного стану машини.
Література
1. Мельник А.О. Архітектура комп’ютера. Наукове видання. - Луцьк: Волинська обласна друкарня, 2008. - 470 с.
2. Жмакин А.П. Архитектура ЭВМ. - СПб.: БХВ-Петербург, 2006. - 320 с.
3. Таненбаум Э. Архитектура компьютера.5-е изд. (+CD). - СПб.: Питер, 2007. - 844 с.
4. Patterson D., and Hennessy J.computer Architecture. A quantitative Approach. Second Edition. - Morgan Kaufmann Publishers, Inc., San Francisco, California, 1996. - 760 p.
Додатки
Доаток I (код програми-асемблера):
/* Assembler for LC */
#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