Асемблери. Принципи компіляції програм і методів написання компіляторів (Звіт з лабораторної роботи № 7)

Страницы работы

12 страниц (Word-файл)

Содержание работы

Національний Технічний Університет

«Харківський Політехнічний Інститут»

Звіт

з лабораторної роботи № 7

з дисципліни «системного програмування»

Виконав:  студент

групи КІТ-14в     

Богачов О. С.      

Викладачі:           

Межерицький С. Г.

Харків-2006 р.

Асемблери.

Ціль роботи: засвоїти принципи написання та функціонування компіляторів програм та придбати практичні навички в розробці програм компіляції (асемблювання) на прикладі написання компілятора початкового модулю (файла), написаного на мові асемблера.

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define PT_EOST 0

#define PT_SIGN 1

#define PT_WORD 2

#define PT_LABEL 3

#define MAXSTR 64

#define DIR_SEG  0

#define DIR_DB   1

#define DIR_DW   2

#define DIR_ENDS 3

#define DIR_DD   8      //new

#define DIR_ASSUME 4    //new

#define OP_DEC   1

#define OP_JL   11 //new

#define OP_JB   12 //new

char *directives[] = {"SEGMENT","DB","DW","ENDS","ASSUME","","","","DD"} ;/*Директивы */

char *registers[] = {

"AX","CX","DX","BX","SP","BP","SI","DI",

};                /*Регистры */

char *mnemonics[] = {

   "MOV" , "DEC" , "INC",

   "ADD" , "SUB" , "CMP",

   "OR"  , "XOR" , "AND",

   "IN"  , "OUT" , "JB", "JL" ,    //new

   "END"

}; /*Мнемоники команд */

struct seg_tab     /*Таблица сегментов */

{

 char name[MAXSTR]; /*Имя*/

 int length;        /*Длина*/

};

struct sym_tab         /* Таблица символов*/

{

 char mnem[MAXSTR];  /*Имя символа*/

 char type[MAXSTR];  /*Тип*/

 char atrib[MAXSTR]; /*Базовый адрес*/

 int ef_adr;         /* Смещение */

};

struct label_tab

{

 char mnem[MAXSTR];  /* Имя метки */

 char type[MAXSTR];  /* Тип */

 char atrib[MAXSTR]; /* Базовый адрес */

 int ef_adr;         /* Смещение */

} ;

struct seg_tab segtab[20];

struct sym_tab symtab[20];

struct label_tab labeltab[20];

/* Объектные коды команд */

char *mnem[]={"8B","04","04","03","2B","3D","OB","33","23","ED","EF","72","7C"};

/* Объектные коды первых операндов команд */

char cop1[]={'C','C','D','D','E','E','F','F'};

/* Объектные коды вторых операндов команд */

char cop2[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

/* Тип операции

   0 - команда без операндов

   1 - команда имеет один операнд

   2 - команда имеет два операнда */

int  operandcount[]={2,1,1,2,2,2,2,2,2,2,2,1,1,0};

/* Разделители */

char signs[]  = "~!@#$%^&*()_)+|`\\=,./<>?;':\"";

char signs1[] = "~!@#$%^&*()_)+|`\\=,./<>?;'\"";

/* Тип символа */

char *sym[]={"NEAR","BYTE","WORD","NEAR","","","","","DWORD"};

/* Конец строки и табуляция */

char separators[] = "\t \r\n";

char parsetyp = 0;    /* Тип выделеной лексемы */

char lexbuf[MAXSTR];  /* Сюда считывается лексема */

char cmdbuf[MAXSTR];  /* Сюда считывается строка из файла */

int j=0;

int n,number=0,offs;

FILE *F,*F1;

/* Функция сравнения лексемы с десятичным числом */

int strtoi(char *s, int *i)   /* В случае равенства

                                                принимает значение  0   */

{

 int sign;

 int val;

 val = 0;

 if(!*s)

  return -1;

 if(*s == '-')

 {

  sign = -1;

  s++;

 }

 else

  sign = 1;

 while(*s)

 {

  if(*s < '0') return -1;

  if(*s > '9') return -1;

  val *= 10;

  val += *s - '0';

  *s++;

 }

 *i = val * sign;

 return 0;

}

/* Функция преобразования прописных символов в строчные */

void strupcase(char *s)

{

 while(*s)

 {

  if((*s > ('a' - 1)) && (*s < ('z'+1)))

   *s -= ('z' - 'Z');

  s++;

 }

}

/* Функция сравнения двух строк :

   если стоки не равны,принимает значение 0

   если равны , то  1 */

char strcomp(char *s1, char *s2)

{

 while(*s1)

 {

  if(*s1 != *s2)

   return 0;

  s1++;

  s2++;

 }

 if(*s2)

  return 0;

 return 1;

}

/* Функция поиска символа в массиве символов :

   если символ найден, то 1, иначе 0 */

int strconsist(char *s, char c)

{

 while(*s)

 if(*s++ == c)

  return 1;

 return 0;

}

/* Функция выделения лексемы из строки str

   parsetype=PT_EOST  -символ конца строки или табуляции,либо пробел

                   PT_SIGN  -разделитель

                   PT_LABEL -метка          */

char *parse(char *buf, char *str)

{

 char c;

 while(*str)

 {

  c=*str;

  if(!strconsist(separators,c))

  {

   if(strconsist(signs,c))

   {

Похожие материалы

Информация о работе