Асемблери. Принципи написання та функціонування компіляторів програм

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

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

Лабораторна робота №1

Асемблери.

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

Постановка задачі: необхідно розробити програму, формуючу розширений листинг фрагменту програми на мові асемблера.

 

 


пока ((s!='\t')&&(s!=' ')&&(s!='\n') &&(s!=',')&&(s!=':'))

 




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

#incl ude <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <string.h>

#include <dos.h>

#define dw int

#define db char

#define clearbuf {\  //очищение переменной buf

                                for (int t=0;t<10;t++)\

                                buf[t]=0;}

#define loadreg char  *reg[18];\

                                 reg[5]="ax";\

                                 reg[6]="bx";\

                                 reg[7]="cx";\

                                 reg[8]="dx";\

                                 reg[9]="ds";\

                                 reg[10]="al";\

                                 reg[11]="ah";\

                                 reg[12]="bl";\

                                 reg[13]="bh";\

                                 reg[14]="cl";\

                                 reg[15]="ch";\

                                 reg[16]="dl";\

                                 reg[17]="dh";\

FILE *file_r,*file_w; //файлы для чтения, записи

char *label[5],oldname[12]; //oldname хранит начальный argv[1]

int r=1,t=1,z=0,as=0,t1=1,t2=1,t3=0,q=0,y=0, xc=0,b=0,offset=0,disp=0,sa=0,sb=0,f1=0,f2=0,f3=0,dis=0,nstr=0,sd=0,prohod=0;

struct namek  {  //хранит имена переменных, их тип, значение и смещение

                              char name[10];

                              char type[5];

                              int chislo;

                              int smesh;

                              namek *next;

                     } *n,*n1,*n2,*ret,*qw;

struct loadcode {  //хранит комманды, операнды(1,2), коды комманд

                                char com[6];

                                int op1;

                                int op2;

                                unsigned char code;

                                loadcode *next;

                              } *k,*k1,*k2;

struct byte2    {

                                char r[3];

                                char c;

                                char x;

                              } byte[15];

struct labels   { //хранит название меток

                                char label[10];

                                char labname[10];

                                int labdisp;

                                labels *next;

                              } *lab,*lab1,*lab2;

struct segnam  { //хранит назв. сегментов(data,code)

                                char segmname[10];

                                int segdisp;

                                segnam *next;

                      }  *u,*u1,*u2;

// prototypes

void ScanString(char *str);

void LoadDir(char *buf);

void AnalizDir(char *buf,char *str,char *dir[6]);

namek *LoadName(char *str);

loadcode *LoadCode();

void LoadByte2();

void cmp(char buf[5],char *str);

void print(int sw,char *str,loadcode *k1,unsigned char ws);

void CodeCmp(char *str);

char genbyte2(char *str);

void AnalizSegment(char *str);

void AnalizEnd(char *str);

void error(int er,char *buf,char *str);

void proverka(char *buf,char *str);

void progon(void);

void AnalizRegister(char *str);

void NamePrint(void);

char MakeList(char **argv);     //замена .asm или др. в argv[1] на .lst

int  segsearch(char *buf);

void timedat(void);

int main(int argc, char **argv)

{

   int zt=0,flag=0,i=0;

   char  buf[24],buf1[12],str[42],s,*dir[7];

   clrscr();

if (argc<2) {

      printf("Invalid parameter\n");

      return 1; }

   if ((file_r=fopen(argv[1],"rb"))==NULL){

      printf("Cannot open file 'code.asm'\n");

      return 1; }

   MakeList(argv);  // *.asm -> *.lst

   if ((file_w=fopen(argv[1],"wt"))==NULL){

      printf("Cannot open output file\n");

      exit(0); }

// проход 1

if (prohod==0) {

     while (!feof(file_r))

  {    fgets(str,40,file_r); //чтение с file_r в str

    nstr++;               //счетчик строк

    if (strstr(str,";")) continue;  //если в str есть ";"

                   //т.е. пропускаем строку

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

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