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

#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") ||

! strcmp (opcode, "lw") ||! strcmp (opcode, "sw") ||

! strcmp (opcode, "beq") ||! strcmp (opcode, "jalr") ||

! strcmp (opcode, "div") ||! strcmp (opcode, "imul") ||

! strcmp (opcode, "xidiv") ||! strcmp (opcode, "andf") ||

! strcmp (opcode, "xorf") ||! strcmp (opcode, "cmpge") ||

! strcmp (opcode, "bsf") ||! strcmp (opcode, "bsr"))

{

testRegArg (arg0);

testRegArg (arg1);

}

if (! strcmp (opcode, "nand") ||! strcmp (opcode, "add") ||

! strcmp (opcode, "div") ||! strcmp (opcode, "imul") ||

! strcmp (opcode, "xidiv") ||! strcmp (opcode, "andf") ||

! strcmp (opcode, "xorf") ||! strcmp (opcode, "cmpge"))

{

testRegArg (arg2);

}

/* check addressField */

if (! strcmp (opcode, "lw") ||! strcmp (opcode, "sw") ||

! strcmp (opcode, "beq") ||! strcmp (opcode, "jmae") ||

! strcmp (opcode, "jmnae") ||! strcmp (opcode, "jne"))

{

testAddrArg (arg2);

}

if (! strcmp (opcode,". fill"))

{

testAddrArg (arg0);

}

/* check for enough arguments */

if ( (strcmp (opcode, "halt") && strcmp (opcode, "noop") &&

strcmp (opcode,". fill") && strcmp (opcode, "jalr") &&

strcmp (opcode, "bsf") && strcmp (opcode, "bsr") &&

strcmp (opcode, "pop") && strcmp (opcode, "push") &&

strcmp (opcode, "je") && arg2 [0] =='\0') ||

(! strcmp (opcode, "jalr") && arg1 [0] =='\0') ||

(! strcmp (opcode,". fill") && arg0 [0] =='\0'))

{

printf ("error at address %d: not enough arguments\n", address);

exit (2);

}

if (label [0]! = '\0') {

/* check for labels that are too long */

if (strlen (label) >= MAXLABELLENGTH) {

printf ("label too long\n");

exit (2);

}

/* make sure label starts with letter */

if (! sscanf (label, "% [a-zA-Z]", argTmp)) {

printf ("label doesn't start with letter\n");

exit (2);

}

/* make sure label consists of only letters andf numbers */

sscanf (label, "% [a-zA-Z0-9]", argTmp);

if (strcmp (argTmp, label)) {

printf ("label has character other than letters andf numbers\n");

exit (2);

}

/* look for duplicate label */

for (i=0; i<numLabels; i++) {

if (! strcmp (label, labelArray [i])) {

printf ("error: duplicate label %s at address %d\n",

label, address);

exit (1);

}

}

/* see if there are too many labels */

if (numLabels >= MAXNUMLABELS) {

printf ("error: too many labels (label=%s) \n", label);

exit (2);

}

strcpy (labelArray [numLabels], label);

labelAddress [numLabels++] = address;

}

}

for (i=0; i<numLabels; i++) {

/* printf ("%s = %d\n", labelArray [i], labelAddress [i]); */

}

/* now do second pass (print machine code, with symbols filled in as

addresses) */

rewind (inFilePtr);

for (address=0; readandfParse (inFilePtr, label, opcode, arg0, arg1, arg2);

address++) {

if (! strcmp (opcode, "add")) {

num = (ADD << 22) | (atoi (arg0) << 19) | (atoi (arg1) << 16) | atoi (arg2);

} else if (! strcmp (opcode, "nand")) {

num = (NAND << 22) | (atoi (arg0) << 19) | (atoi (arg1) << 16) | atoi (arg2);

} else if (! strcmp (opcode, "div")) {

num = (div << 22) | (atoi (arg0) << 19) | (atoi (arg1) << 16) | atoi (arg2);

} else if (! strcmp (opcode, "imul")) {

num = (imul << 22) | (atoi (arg0) << 19) | (atoi (arg1) << 16) | atoi (arg2);

} else if (! strcmp (opcode, "xidiv")) {

num = (xidiv << 22) | (atoi (arg0) << 19) | (atoi (arg1) << 16) | atoi (arg2);

} else if (! strcmp (opcode, "andf")) {

num = (andf << 22) | (atoi (arg0) << 19) | (atoi (arg1) << 16) | atoi (arg2);

} else if (! strcmp (opcode, "xorf")) {

num = (xorf << 22) | (atoi (arg0) << 19) | (atoi (arg1) << 16) | atoi (arg2);

} else if (! strcmp (opcode, "cmpge")) {

num = (cmpge << 22) | (atoi (arg0) << 19) | (atoi (arg1) << 16) | atoi (arg2);

} else if (! strcmp (opcode, "jalr")) {

num = (JALR << 22) | (atoi (arg0) << 19) | (atoi (arg1) << 16);

} else if (! strcmp (opcode, "bsf")) {

num = (bsf << 22) | (atoi (arg0) << 19) | (atoi (arg1) << 16);

} else if (! strcmp (opcode, "push")) {

num = (push << 22);

} else if (! strcmp (opcode, "pop")) {

num = (pop << 22);

} else if (! strcmp (opcode, "halt")) {

num = (HALT << 22);

} else if (! strcmp (opcode, "noop")) {

num = (NOOP << 22);

} else if (! strcmp (opcode, "bsr")) {

num = (bsr << 22) | (atoi (arg0) << 19) | (atoi (arg1) << 16);

} else if (! strcmp (opcode, "lw") ||! strcmp (opcode, "sw") ||

! strcmp (opcode, "beq") ||! strcmp (opcode, "jmae") ||

! strcmp (opcode, "jmnae") ||! strcmp (opcode, "jne")) {

/* if arg2 is symbolic, then translate into an address */

if (! isNumber (arg2)) {

addressField = translateSymbol (labelArray, labelAddress,

numLabels, arg2);

/*

printf ("%s being translated into %d\n", arg2, addressField);

*/

if (! strcmp (opcode, "beq") ||! strcmp (opcode, "jmae") ||! strcmp (opcode, "jmnae")) {

addressField = addressField-address-1;

}

} else {

addressField = atoi (arg2);

}

if (addressField < - 32768 || addressField > 32767) {

printf ("error: offset %d out of range\n", addressField);

exit (1);

}

/* truncate the offset field, in case it's negative */

addressField = addressField & 0xFFFF;

if (! strcmp (opcode, "beq")) {

num = (BEQ << 22) | (atoi (arg0) << 19) | (atoi (arg1) << 16)

| addressField;

} else if (! strcmp (opcode, "jmae")) {

num = (jmae << 22) | (atoi (arg0) << 19) | (atoi (arg1) << 16)

| (addressField);

} else if (! strcmp (opcode, "jmnae")) {

num = (jmnae << 22) | (atoi (arg0) << 19) | (atoi (arg1) << 16)

| (addressField);

} else if (! strcmp (opcode, "jne")) {

num = (jne << 22) | (addressField);

} else {

/* lw or sw */

if (! strcmp (opcode, "lw")) {

num = (LW << 22) | (atoi (arg0) << 19) |

(atoi (arg1) << 16) | addressField;

} else {

num = (SW << 22) | (atoi (arg0) << 19) |

(atoi (arg1) << 16) | addressField;

}

}

} else if (! strcmp (opcode,". fill")) {

if (! isNumber (arg0)) {

num = translateSymbol (labelArray, labelAddress, numLabels,

arg0);

} else {

num = atoi (arg0);

}

}

/* printf (" (address %d): %d (hex 0x%x) \n", address, num, num); */

fprintf (outFilePtr, "%d\n", num);

}

exit (0);

}

/*

* Read andf parse a line of the assembly-language file. Fields are returned

* in label, opcode, arg0, arg1, arg2 (these strings must have memory already

* allocated to them).

*

* Return values:

* 0 if reached end of file

* 1 if all went well

*

* exit (1) if line is too long.

*/

int readandfParse (FILE *inFilePtr, char *label, char *opcode, char *arg0,char *arg1, char *arg2)

{

char line [MAXLINELENGTH];

char *ptr = line;

/* delete prior values */

label [0] = opcode [0] = arg0 [0] = arg1 [0] = arg2 [0] = '\0';

/* read the line from the assembly-language file */

if (fgets (line, MAXLINELENGTH, inFilePtr) == NULL) {

/* reached end of file */

return (0);

}

/* check for line too long */

if (strlen (line) == MAXLINELENGTH-1) {

printf ("error: line too long\n");

exit (1);

}

/* is there a label? */

ptr = line;

if (sscanf (ptr, "% [^\t\n]", label)) {

/* successfully read label; advance pointer over the label */

ptr += strlen (label);

}

/*

* Parse the rest of the line. Would be nice to have real regular

* expressions, but scanf will suffice.

*/

sscanf (ptr, "%* [\t\n\r] % [^\t\n\r] %* [\t\n\r] % [^\t\n\r] %* [\t\n\r] % [^\t\n\r] %* [\t\n\r] % [^\t\n\r] ",

opcode, arg0, arg1, arg2);

return (1);

}

int translateSymbol (char labelArray [MAXNUMLABELS] [MAXLABELLENGTH],

int labelAddress [MAXNUMLABELS], int numLabels, char *symbol)

{

int i;

/* search through address label table */

for (i=0; i<numLabels && strcmp (symbol, labelArray [i]); i++) {

}

if (i>=numLabels) {

printf ("error: missing label %s\n", symbol);

exit (1);

}

return (labelAddress [i]);

}

int isNumber (char *string)

{

/* return 1 if string is a number */

int i;

return ( (sscanf (string, "%d", &i)) == 1);

}

/* Test register argument; make sure it's in range andf has no bad characters. */

void testRegArg (char *arg)

{

int num;

char c;

if (atoi (arg) < 0 || atoi (arg) > 7) {

printf ("error: register out of range\n");

exit (2);

}

if (sscanf (arg, "%d%c", &num, &c)! = 1) {

printf ("bad character in register argument\n");

exit (2);

}

}

/* Test addressField argument. */

void testAddrArg (char *arg)

{

int num;

char c;

/* test numeric addressField */

if (isNumber (arg)) {

if (sscanf (arg, "%d%c", &num, &c)! = 1) {

printf ("bad character in addressField\n");

exit (2);

}

}

}
Додаток II (код симулятора)

/*Instruction-level simulator for the LC */

#include <stdio. h>

#include <stdlib. h>

#include <string>

#include <math. h>

#include <vector>

using namespace std;

#define NUMMEMORY 65536 /* maximum number of words in memory */

#define NUMREGS 8 /* number of machine registers */

#define MAXLINELENGTH 1000

#define STACKDEPTH 32

#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

typedef struct stateStruct {

int pc;

int mem [NUMMEMORY];

int reg [NUMREGS];

int numMemory;

vector <int> sStack;

int ZF;

} stateType;

void printState (stateType *);

void run (stateType);

int convertNum (int);

int main (int argc, char *argv [])

{

int i;

char line [MAXLINELENGTH];

stateType state;

FILE *filePtr;

if (argc! = 2) {

printf ("error: usage: %s <machine-code file>\n", argv [0]);

exit (1);

}

/* initialize memories and registers */

for (i=0; i<NUMMEMORY; i++) {

state. mem [i] = 0;

}

for (i=0; i<NUMREGS; i++) {

state. reg [i] = 0;

}

state. ZF=0;

state. pc=0;

/* read machine-code file into instruction/data memory (starting at

address 0) */

filePtr = fopen (argv [1], "r");

if (filePtr == NULL) {

printf ("error: can't open file %s\n", argv [1]);

perror ("fopen");

exit (1);

}

for (state. numMemory=0; fgets (line, MAXLINELENGTH, filePtr)! = NULL;

state. numMemory++) {

if (state. numMemory >= NUMMEMORY) {

printf ("exceeded memory size\n");

exit (1);

}

if (sscanf (line, "%d", state. mem+state. numMemory)! = 1) {

printf ("error in reading address %d\n", state. numMemory);

exit (1);

}

printf ("memory [%d] =%d\n", state. numMemory, state. mem [state. numMemory]);

}

printf ("\n");

/* run never returns */

run (state);

return (0);

}

void run (stateType state)

{

int i;

int arg0, arg1, arg2, addressField;

int instructions=0;

int opcode;

int maxMem=-1; /* highest memory address touched during run */

for (; 1; instructions++) { /* infinite loop, exits when it executes halt */

printState (&state);

if (state. pc < 0 || state. pc >= NUMMEMORY) {

printf ("pc went out of the memory range\n");

exit (1);

}

maxMem = (state. pc > maxMem)? state. pc: maxMem;

/* this is to make the following code easier to read */

opcode = state. mem [state. pc] >> 22;

arg0 = (state. mem [state. pc] >> 19) & 0x7;

arg1 = (state. mem [state. pc] >> 16) & 0x7;

arg2 = state. mem [state. pc] & 0x7; /* only for add, nand */

addressField = convertNum (state. mem [state. pc] & 0xFFFF); /* for beq,

lw, sw */

state. pc++;

if (opcode == ADD) {

state. reg [arg2] = state. reg [arg0] + state. reg [arg1];

} else if (opcode == NAND) {

state. reg [arg2] = ~ (state. reg [arg0] & state. reg [arg1]);

} else if (opcode == LW) {

if (state. reg [arg0] + addressField < 0 ||

state. reg [arg0] + addressField >= NUMMEMORY) {

printf ("address out of bounds\n");

exit (1);

}

state. reg [arg1] = state. mem [state. reg [arg0] + addressField];

if (state. reg [arg0] + addressField > maxMem) {

maxMem = state. reg [arg0] + addressField;

}

} else if (opcode == SW) {

if (state. reg [arg0] + addressField < 0 ||

state. reg [arg0] + addressField >= NUMMEMORY) {

printf ("address out of bounds\n");

exit (1);

}

state. mem [state. reg [arg0] + addressField] = state. reg [arg1];

if (state. reg [arg0] + addressField > maxMem) {

maxMem = state. reg [arg0] + addressField;

}

} else if (opcode == BEQ) {

if (state. reg [arg0] == state. reg [arg1]) {

state. pc += addressField;

}

} else if (opcode == JALR) {

state. reg [arg1] = state. pc;

if (arg0! = 0)

state. pc = state. reg [arg0];

else

state. pc = 0;

} else if (opcode == NOOP) {

} else if (opcode == HALT) {

printf ("machine halted\n");

printf ("total of %d instructions executed\n", instructions+1);

printf ("final state of machine: \n");

printState (&state);

exit (0);

} else if (opcode == xidiv) {

state. reg [arg2] = state. reg [arg0] / state. reg [arg1];

state. reg [arg0] ^=state. reg [arg1] ^=state. reg [arg0] ^=state. reg [arg1];

} else if (opcode == div) {

state. reg [arg2] = (unsigned) state. reg [arg0] / (unsigned) state. reg [arg1];

} else if (opcode == imul) {

state. reg [arg2] = state. reg [arg0] * state. reg [arg1];

} else if (opcode == andf) {

state. reg [arg2] = state. reg [arg0] & state. reg [arg1];

} else if (opcode == xorf) {

state. reg [arg2] = state. reg [arg0] xor state. reg [arg1];

} else if (opcode == cmpge) {

state. reg [arg2] = state. reg [arg0] >= state. reg [arg1];

} else if (opcode == jmae) {

if ( (unsigned) state. reg [arg0] >= (unsigned) state. reg [arg1])

state. pc += addressField;

} else if (opcode == jmnae) {

if ( (unsigned) state. reg [arg0] < (unsigned) state. reg [arg1])

state. pc += addressField;

} else if (opcode == bsf) {

state. ZF=0;

for (i=0; i<31; i++) {

if (state. reg [arg0] %2==1) {

state. ZF=1;

state. reg [arg1] =i;

break;

}

else {

state. reg [arg0] =state. reg [arg0] >>1;

}

}

} else if (opcode == bsr) {

state. ZF=0;

for (i=31; i>0; i--) {

if (state. reg [arg0] /0x80000000==1) {

state. ZF=1;

state. reg [arg1] =i;

break;

}

else {

state. reg [arg0] =state. reg [arg0] <<1;

}

}

} else if (opcode == jne) {

if (state. ZF! =0) state. pc = addressField;

} else if (opcode == push) {

if (state. sStack. size () > STACKDEPTH - 1)

{

printf ("\nerror: stack overflow! 0x%x\n", opcode);

printf ("total of %d instructions executed\n", instructions+1);

printf ("final state of machine: \n");

printState (&state);

exit (1);

}

else state. sStack. push_back (state. reg [1]);

} else if (opcode == pop) {

if (state. sStack. empty ())

{

printf ("\nerror: stack underflow! 0x%x\n", opcode);

printf ("total of %d instructions executed\n", instructions+1);

printf ("final state of machine: \n");

printState (&state);

exit (1);

}

else

{

state. reg [1] = state. sStack. back ();

state. sStack. pop_back ();

}

} else {

printf ("error: illegal opcode 0x%x\n", opcode);

exit (1);

}

state. reg [0] = 0;

}

}

void

printState (stateType *statePtr)

{

int i;

printf ("\n@@@\nstate: \n");

printf ("\tpc %d\n", statePtr->pc);

printf ("\t\tZF = %d\n",statePtr->ZF);

vector <int>:: iterator stackiter;

printf ("\tstack: \n");

for (stackiter = statePtr->sStack. begin (), i = 0; stackiter < statePtr->sStack. end (); stackiter++, i++) {

printf ("\t\tstek [%d] %d\n", i, *stackiter);

}

printf ("\tmemory: \n");

for (i=0; i<statePtr->numMemory; i++) {

printf ("\t\tmem [%d] %d\n", i, statePtr->mem [i]);

}

printf ("\tregisters: \n");

for (i=0; i<NUMREGS; i++) {

printf ("\t\treg [%d] %d\n", i, statePtr->reg [i]);

}

printf ("end state\n");

}

int convertNum (int num)

{

/* convert a 16-bit number into a 32-bit Sun integer */

if (num & (1<<15)) {

num - = (1<<16);

}

return (num);

}


Информация о работе «Проектування комп'ютера»
Раздел: Информатика, программирование
Количество знаков с пробелами: 41548
Количество таблиц: 5
Количество изображений: 4

Похожие работы

Скачать
38628
2
3

... і використання вже розроблених форм застосування НІТ, що пройшли певну апробацію на практиці. Розділ 2. Методичні рекомендації щодо використання НІТ в роботі вчителя початкових класів   В цьому розділі ми запропонували розробку Першого уроку та виховного заходу із використанням комп’ютера, в яких якнайповніше намагались розкрити і використати всі форми застосування НІТ в роботі вчителя, а саме ...

Скачать
119662
8
4

... ролі різних видів програмних засобів навчального призначення в навчанні предметам початкової школи. ·          виділення місця ІКТ на уроках художньо-естетичного циклу в початковій школі. Використання комп’ютера як засобу навчання у навчальному процесі початкової школи вносить зміни й у інші елементи педагогічної технології (процес навчання, організацію навчання, засоби навчання тощо). Це, на ...

Скачать
26585
0
0

... дисковода для гнучких дисків, який використовувався в базисному комп'ютері PC для зберігання інформації, був встановлений жорсткий диск. В цих комп'ютерах використовувалися 8-розрядні процесори 8088 і 8-розрядна шина ISA (Industry Standard Architecture — архітектура промислового стандарту) для розширення системи. Шина — ім'я, дане роз’ємом розширення, в які можна встановити додаткову плату. Шина ...

Скачать
44324
0
8

... програмування машин с числовим програмним керуванням (ЧПК), контроль якості і упаковку. 3.     Основні поняття про системи автоматизованого виробництва САМ Автоматизоване проектування (computer-aided design — CAD) представляє собою технологію, що полягає в використанні комп’ютерних систем для полегшення створення, зміни, аналізу і оптимізації проектів. Таким чином, будь-яка програма, що ...

0 комментариев


Наверх