Курсовая работа: Проектування комп'ютера
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
#define div 8
#define imul 9
#define xidiv 10
#define andf 11
#define xorf 12
#define cmpge 13
#define jmae 14
#define jmnae 15
#define bsf 16
#define bsr 17
#define jne 18
#define push 19
#define pop 20
int readandfParse
(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; readandfParse
(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") &&
strcmp (opcode,
"beq") && strcmp (opcode, "jalr") &&
strcmp (opcode,
"halt") && strcmp (opcode, "noop") &&
strcmp (opcode,".
fill") && strcmp (opcode, "div") &&
strcmp (opcode,
"imul") && strcmp (opcode, "xidiv") &&
strcmp (opcode,
"andf") && strcmp (opcode, "xorf") &&
strcmp (opcode,
"cmpge") && strcmp (opcode, "jmae") &&
strcmp (opcode,
"jmnae") && strcmp (opcode, "bsr") &&
strcmp (opcode,
"jne") && strcmp (opcode, "bsf") &&
strcmp (opcode,
"push") && strcmp (opcode, "pop"))
{
printf ("error:
unrecognized opcode %s at address %d\n", opcode,
address);
exit (1);
}
/* check register fields
*/
if (! strcmp (opcode,
"add") ||! strcmp (opcode, "nand") ||
Страницы: 1, 2, 3, 4, 5, 6, 7, 8 |