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

puts("Wrong insruction");  scroll(); continue;  }

   if (Search(op1)!=NULL){

  *Search(op1)=~*Search(op1);     }

 else puts("Wrong insruction");scroll();continue;}

             if (!strcmp(com,"and")){

                 if (!strcmp(op1,"")){

 puts("Wrong parameter"); scroll();continue;  }

                if (zn(op1)){

puts("Wrong insruction");  scroll(); continue; }

      if (zn(op2)){

 *Search(op1)&=atoi(op2); scroll(); continue; }

      if (Search(op1)!=NULL && Search(op2)!=NULL){

*Search(op1)&=*Search(op2);   }

else puts("Wrong insruction"); scroll();continue;}

             if (!strcmp(com,"or")){

                 if (!strcmp(op1,"")){

puts("Wrong parameter"); scroll(); continue;  }

    if (zn(op1)){  puts("Wrong insruction");

 scroll();         continue;    }

      if (zn(op2)){

  *Search(op1)|=atoi(op2); scroll();  continue;  }

      if (Search(op1)!=NULL && Search(op2)!=NULL){

  *Search(op1)|=*Search(op2);    }

 else puts("Wrong insruction");scroll();continue;}

   if (!strcmp(com,"push")){

       if (!strcmp(op1,"")){

puts("Wrong parameter"); scroll();continue;   }

      if (strcmp(op2,"")){

puts("Extra parameter");scroll(); continue; }

    if (zn(op1)){

  i=0; while (i!=STACK_KOL){ //эл стека передвигаются на 1 позицию вниз

 stack[i]=stack[i+1]; i++;  }

  stack[STACK_KOL-1]=atoi(op1);

  *Search("SP")-=2; scroll(); continue;   }

   if (*Search("SP")!=(int) 0xfffe){

       int i=0;

       while (i!=STACK_KOL){ //эл стека передвигаются на 1 позицию вниз

      stack[i]=stack[i+1];     i++;  }

          if ((*Search("SP"))>((STACK_KOL-1)*2)){  //если sp>8

stack[(*Search("SP")/2)]=*Search(op1); //запись в стек      }

     else stack[STACK_KOL-1]=*Search(op1); //запись в вершину стека

   *Search("SP")-=2;    //sp=sp-2  }

  else{    puts("Stack overflowing");   }

   scroll();  continue;  }

   if (!strcmp(com,"pop")){

       if (!strcmp(op1,"")){

puts("Wrong parameter"); scroll(); continue; }

      if (zn(op1)){

 puts("Wrong insruction"); scroll();continue;  }

      if (strcmp(op2,"")){

 puts("Extra parameter"); scroll(); continue; }

      int k;     int i=0;

 *Search(op1)=stack[(*Search("SP")-2)];

      i=STACK_KOL;

      while (i!=0){    //pop, перемещение эл-ов стека на 1 позицию вверх

     stack[i]=stack[i-1]; i--;  }

  *Search("SP")+=2; //sp+2  scroll(); continue; }

 puts("Unknown instruction"); scroll();   }

    while (current){

   head=current->next;  delete current;

              current=head;   }

}

Результатвиконання (фрагмент):

AX=0000  BX=0000  CX=0000  DX=0000  SP=0008  BP=0000  SI=0000  DI=0000

0000  0000  0000  0000  0000

-mov ax,7

AX=0007  BX=0000  CX=0000  DX=0000  SP=0008  BP=0000  SI=0000  DI=0000

0000  0000  0000  0000  0000

-push ax

AX=0007  BX=0000  CX=0000  DX=0000  SP=0006  BP=0000  SI=0000  DI=0000

0000  0000  0000  0000  0007

-pop bx

AX=0007  BX=0007  CX=0000  DX=0000  SP=0008  BP=0000  SI=0000  DI=0000

0000  0000  0000  0000  0000

-add bx,3

AX=0007  BX=000A  CX=0000  DX=0000  SP=0008  BP=0000  SI=0000  DI=0000

0000  0000  0000  0000  0000

Висновок: вивчені основні принипи роботи інтерпритаторів (інтерпритатор команд, емулятор пам’яті, процесора)