рефераты рефераты
Главная страница > Курсовая работа: Проектування комп'ютера  
Курсовая работа: Проектування комп'ютера
Главная страница
Банковское дело
Безопасность жизнедеятельности
Биология
Биржевое дело
Ботаника и сельское хоз-во
Бухгалтерский учет и аудит
География экономическая география
Геодезия
Геология
Госслужба
Гражданский процесс
Гражданское право
Иностранные языки лингвистика
Искусство
Историческая личность
История
История государства и права
История отечественного государства и права
История политичиских учений
История техники
История экономических учений
Биографии
Биология и химия
Издательское дело и полиграфия
Исторические личности
Краткое содержание произведений
Новейшая история политология
Остальные рефераты
Промышленность производство
психология педагогика
Коммуникации связь цифровые приборы и радиоэлектроника
Краеведение и этнография
Кулинария и продукты питания
Культура и искусство
Литература
Маркетинг реклама и торговля
Математика
Медицина
Реклама
Физика
Финансы
Химия
Экономическая теория
Юриспруденция
Юридическая наука
Компьютерные науки
Финансовые науки
Управленческие науки
Информатика программирование
Экономика
Архитектура
Банковское дело
Биржевое дело
Бухгалтерский учет и аудит
Валютные отношения
География
Кредитование
Инвестиции
Информатика
Кибернетика
Косметология
Наука и техника
Маркетинг
Культура и искусство
Менеджмент
Металлургия
Налогообложение
Предпринимательство
Радиоэлектроника
Страхование
Строительство
Схемотехника
Таможенная система
Сочинения по литературе и русскому языку
Теория организация
Теплотехника
Туризм
Управление
Форма поиска
Авторизация




 
Статистика
рефераты
Последние новости

Курсовая работа: Проектування комп'ютера

! 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 << else if (! strcmp (opcode, "nand"))

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

num = (div << else if (! strcmp (opcode, "imul")) (atoi (arg1) << 16) else if (! strcmp (opcode, "xidiv"))

else if (! strcmp (opcode, "andf")) else if (! strcmp (opcode, "xorf")) else if (! strcmp (opcode, "cmpge"))

else if (! strcmp (opcode, "jalr")) (atoi (arg1) << 16);

else if (! strcmp (opcode, "bsf")) 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"))

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")) addressField;

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

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

num = (jmnae << else if (! strcmp (opcode, "jne"))

else {

/* lw or sw */

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

(atoi (arg1) << else

}

} 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 */

Страницы: 1, 2, 3, 4, 5, 6, 7, 8

рефераты
Новости