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

    if (strstr(str,"dw") || strstr(str,"db"))   // -/- dw, db

                    {

                      n=LoadName(str); }

                   if (strstr(str,":") || strstr(str,"segment"))

                    {

                      AnalizSegment(str); }       }

     prohod++; nstr=1;

     fclose(file_r);

}

// проход 2

if (prohod==1)

 {

   int gd=0;

   unsigned char w;

   k=LoadCode();   //возвращает список k с командами и их кодами

   k1=k;   ret=n;   qw=n;   disp=n1->smesh;

   LoadByte2();

   dir[1]="segment";        dir[3]="ends";

   dir[2]="end";            dir[4]="assume";

   dir[5]="dw";             dir[6]="db";

if ((file_r=fopen(oldname,"r"))==NULL) {

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

                exit(0); }

       while (!feof(file_r))

                  {     fgets(str,40,file_r);

                    sd=0;

                    clearbuf;

                    s=0;

                    flag=0; //1-если команда найдена

                    i=0; zt=0; //счетчики

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

                     {  int sw=12;

                      print(sw,str,k1,w);      }

                   while (s!='\n') {       k1=k;  // списки с командами, операндами, кодами

                      s=str[i];       i++;       if (s==';')

                      break;

                      if ((s!='\t')&&(s!=' ')&& (s!='\n')&&(s!=',')&&(s!=':'))

                              { buf[zt]=s;

                               zt++;     //счетчик }

       else {  // перемещение по списку k1 и

       // сравнивание buf с k1->com, тип loadcode

                      if (flag==0 && buf[0]!=0)

                               {   int rt=0;

                                 while (k1->next!=NULL) {

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

                                 if (rt==1) rt++;

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

                 flag=1;  //если в buf команда(k1->com)

                                               break;  }

                                if (rt==0) {

                                                 k1=k1->next;

                                                 rt++; }

                              } }

      // сравнивание с директивами (массив dir[7])

                      if (flag==0 && buf[0]!=0) {

                                for (int d=1;d<7;d++) {

                                  if (strcmp(buf,dir[d])==0) {

                      flag=2;  //если buf-это директива

                                     break;

                              } } }

      // если это метка (@)

                      if (strstr(buf,"@")) {

                                 lab1=lab1->next;

                                 offset=lab1->labdisp=disp;   }

      // сравнивание buf с именами меток

                      if (flag==0 && buf[0]!=0) {

                                  lab1=lab;q=0;

                                  while (lab1->next!=NULL) {

                                    if (q==1) lab1=lab1->next;

                     if (strcmp(lab1->label,buf)==0) {

                                                 gd++;

    if (q==0) {int sw=6;print(sw,str,k1,w); }

                                                 break; }

                                                 q++;

                                   }}

// сравнивание buf с переменными с n, тип namek

                      if (flag==0 && buf[0]!=0 && gd==0) {

                                  n1=n;q=0;

                                  while (n1->next!=NULL) {

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

                                    if (q==1) q++;

                     int rez=strcmp(n1->name,buf);

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

                                    if (rez==0){gd++;break;

                              } } }