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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.

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

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

Ціль роботи: розробити програму-інтерпритатор, виконуючий розбір тексту .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'){

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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.