Розробка програми-інтерпритатора, виконуючий розбір тексту ASM файлу на рівні команд

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

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

Інтерпритатор

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

Індивідуальне завдання: розробити програму - інтерпритатор команд мови assemblera. Виконати симантичний та синтаксичний аналіз тексту вхідного файлу.

Розробка алгоритму:

-ініціалізація об’єктів, використовуючи масив регістрів

-читання команди користувача

-визначення недопустимих операндів та невірних записів команд

-вибір вказаної команди та виконання запису в список класів

-виведення отриманих даних

Типи даних:

struct Reg {//список классов с констр и деструк

      char* name;

      int z;

      Reg *next;

      Reg(char *nam,int y,Reg *hea);

      ~Reg();

};

struct Reg *head,*current,*list;

struct Reg *currents;

Reg::Reg(char *nam,int y,Reg *hea){//констр

   name=new char[strlen(nam)]; //новый эл на кот выдел заданая память

   strcpy(name,nam);//запись в поле name класса

   z=y;

   next=hea; //голова

Текст програми:

#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <stdlib.h>

#define STACK_KOL  5

#define REG_KOL    8

int *Search(char *nam);//поиск в классе заданого регистра(nam) и возврат

           // указ на его значение

int  SearchPer(char *nam);

int  zn(char *str); //определение числа в операнде

void convert(char *str); //преобр в верх регистр

void scroll();       //переход на позицию для вывода текста

void PutsReg();  //вывод всех регистров и их содержимого

void PrintPer();    //вывод переменных

void PrintStack();    //вывод содержимого стека

struct Reg {//список классов с констр и деструк

              char* name;

              int z;

              Reg *next;

              Reg(char *nam,int y,Reg *hea);

              ~Reg();

};

struct Reg *head,*current,*list;

struct Reg *currents;

Reg::Reg(char *nam,int y,Reg *hea){//констр

           name=new char[strlen(nam)]; //новый эл на кот выдел заданая память

 strcpy(name,nam);//запись в поле name класса

           z=y;

           next=hea;}

Reg::~Reg(){                    //деструк

       delete current->name;}

char mas[REG_KOL][3]={"AX","BX","CX","DX","SP","BP","SI","DI"};

int stack[STACK_KOL]; int dlina;

int *Search(char *nam){ //поиск в классе заданого регистра(nam) и возврат

     list=current;           // указ на его значение

     Reg *dop;   //объект

     while (current){

              if (!strcmp(nam,current->name)){

                    dop=current;

                    current=list;

                    return &dop->z;   }

             current=current->next;     }

     current=list;    return NULL;

}

int SearchPer(char *nam){

     list=current;

     while (current){

              if (!strcmp(nam,current->name)){

                     current=list; return 1;   }

              current=current->next;    }

     current=list;   return 0;

}

void PutsReg(){    //вывод всех регистров и их содержимого

     int k=64;    list=currents;

     while (currents){

              gotoxy(k,20);

              printf("%s=",currents->name);

              currents=currents->next;    k-=9;  }

     currents=list;k=67;

     while (currents){

              gotoxy(k,20);

              printf("%04X",currents->z);

              currents=currents->next;    k-=9;   }

     currents=list;  PrintStack();  //вывод стека

}

int zn(char *str){  //число ли это

       int i=0;

       while (str[i]!='\0'){

                if(str[i]<'0' || str[i]>'9') return 0;

                i++;    }    return 1;}

void convert(char *str){  //преобр в апкейс

     int i=0;

     while (i!=2){

   if (str[i]>='a' && str[i]<='z') str[i]=str[i]-32;

             i++;   }}

void scroll(){  //переход на позицию для вывода текста

       int i=0;    gotoxy(1,24);

       while (i!=5){  puts("");  i++;  }}

void PrintPer(){    //вывод переменных

     Reg *lists;   int i=1;

     lists=current;

     while (current!=currents){

              gotoxy(74,i);

              printf("%s ",current->name);

              printf("%04X",current->z);  i++;

              current=current->next;   }

     current=lists;}

void PrintStack(){  //вывод содержимого стека

int i=0;    gotoxy(1,21);

     while (i!=STACK_KOL){

              printf("%04X  ",stack[i]);  i++; }}

void main(void){

     clrscr();  char buff[255]; char com[20];

     char op1[20];  char op2[20]; char *pbuff;

     int i=0,k=0,per;

     while (i!=REG_KOL){

              current=new Reg(mas[i],0,head); //создание списка классов из mas[]

              head=current; //голова    i++;   }

     currents=current;

     *Search("SP")=(STACK_KOL-1)*2;

     while(1){

             PrintPer();

             PutsReg();     //вывод регистров

             printf("\n-");

             gets(buff);   //чтение команды

             pbuff=buff;

   while (*pbuff != '\0'){ //отделение табов

  if (*pbuff == '\t') *pbuff = ' '; pbuff++; }

             if (!strcmp(buff,"q")) break; //q-выход

             i=0;k=0;

             strcpy(op1,"");  //операнды 1 и 2

             strcpy(op2,"");

             while (buff[i]!=' ' && buff[i]!='\0'){

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

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