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

 y=0; as++;   // признак следующего элем списка, если >0, то созд нового эл

 return n;

}

void proverka(char *buf,char *str)

{

   int a=0,e=0;   n1=n;

   if (strcmp(n1->name,buf)==0) {

                 int er=3;                 error(er,buf,str);     e++;   }

    while(n1->next!=NULL) {

      if (e==1) break ;  if (a==2) n1=n1->next;

      if (a==1) a++;

      if (strcmp(n1->name,buf)==0) {

               int er=3; error(er,buf,str);

               break; } if (a==0) { n1=n1->next; a++; } }

}

loadcode *LoadCode()   //запись в список команд и их кодов с файла

{

  int e;  int i=0;  fpos_t filepos,newpos;

  char str[5],buf[5];  FILE *file_c;

  struct loadcode *k,*k1,*k2;

  if ((file_c = fopen("codes.txt", "r"))== NULL) {

   printf("Canot open file 'codes.txt'\n");

   exit(0);

  }

  clearbuf;  k=new loadcode; k1=k;

  while (!feof(file_c)) { // чтение с codes.txt команды в buf

                  e=strlen(fgets(str,10,file_c));

                  fgetpos(file_c, &filepos);

                  newpos=filepos-e-1;

                  fsetpos(file_c, &newpos);

                  fgets(buf,e,file_c);

if (i==0) {   //если 1-й эл списка

strcpy(k->com,buf);  // запись в эл списка

clearbuf; fgets(buf,5,file_c);  //чтение строки

               if (strcmp(buf,"\n")==0)

                    fgets(buf,5,file_c);

               k->op1=atoi(buf);clearbuf;

               fgets(buf,5,file_c);

               k->op2=atoi(buf);clearbuf;

               fgets(buf,5,file_c);

               k->code=atoi(buf);clearbuf;

               k->next=NULL;     i++;

      }

  else {

                k2=new loadcode;

                strcpy(k2->com,buf);clearbuf;

                fgets(buf,5,file_c);

                if (strcmp(buf,"\n")==0)

                     fgets(buf,5,file_c);

                k2->op1=atoi(buf);clearbuf;

                fgets(buf,5,file_c);

                k2->op2=atoi(buf);clearbuf;

                fgets(buf,5,file_c);

                k2->code=atoi(buf);clearbuf;

                k2->next=NULL;

                k1->next=k2;  // связать эл-ты списка

                k1=k2;       //указатель на текущий эл

                clearbuf; } }

  k1=k;  //установка текущ указателя на нач списка

  fclose(file_c); return k;  }

void LoadByte2()

{   strcpy(byte[0].r,"ax");

   byte[0].c=0;   byte[0].x=0;

   strcpy(byte[1].r,"bx");

   byte[1].c=24;   byte[1].x=6;

   strcpy(byte[2].r,"cx");

   byte[2].c=8;   byte[2].x=1;

   strcpy(byte[3].r,"dx");

   byte[3].c=16;   byte[3].x=2;

   strcpy(byte[4].r,"ds");

   byte[4].c=24;   byte[4].x=3;

   strcpy(byte[5].r,"al");

   byte[5].c=0;   byte[5].x=6;

   strcpy(byte[6].r,"ah");

   byte[6].c=32;   byte[6].x=6;

   strcpy(byte[7].r,"bl");

   byte[7].c=24;   byte[7].x=6;

   strcpy(byte[8].r,"bh");

   byte[8].c=56;   byte[8].x=6;

   strcpy(byte[9].r,"cl");

   byte[9].c=8;   byte[9].x=6;

   strcpy(byte[10].r,"ch");

   byte[10].c=40;   byte[10].x=6;

   strcpy(byte[11].r,"dl");

   byte[11].c=16;   byte[11].x=6;

   strcpy(byte[12].r,"dh");

   byte[12].c=48;   byte[12].x=6; }

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

{  int rez,az=0,i=0;

  loadreg;

  if (r==1) {    k1=k;

    while (k1->next!=NULL) {

                 if (az==2) k1=k1->next;

                 if (az==1) az++;i++;

                 if (strcmp(k1->com,buf)==0) {

                                f1=i;t2++;  break;   }

                 if (az==0) { k1=k1->next; az++; }

  } }

  if (r==2) {      n1=n;

      while (n1->next!=NULL) {

                  if (az==2) n1=n1->next;

                  if (az==1) az++; i++;

                  if (strcmp(n1->name,buf)==0) {

                                f2=i;break; }

                  if (az==0) { n1=n1->next;az++; }

   } }

   if (f2==0 && r==2) {

       for (int j=5;j<18;j++) {

                 if(strcmp(reg[j],buf)==0) {  f2=j;break; }

   } }

   if (r==3) {      n1=n;

      while (n1->next!=NULL) {