Препроцесор. Розробка програми-препроцеса, що виконує розбір тексту ASM файлу на рівні макросів та условної компіляції, страница 5

       eq->cons=atoi(pa);      // и значения в eq->const   eq->next=NULL;    eq1=eq;  p5++; }

    else                     //если не первый эл

      {eq2=new equ;          //новый эл

strcpy(eq2->name,p);  //запись в список имени eq2->name=p

               eq2->cons=atoi(pa);   // и значения в eq2->const

               eq2->next=NULL;

               eq1->next=eq2;        //связывание элементов

               eq1=eq2;              //текущий эл eq1

      }}

void AnalisIF(char *str) //поиск в списке нужной переменной и её значения и определение выполняется ли условная директива

{  eq1=eq;     //указатель списка перемещаем в начало

   int i=0;  char *p,*pa;

                                  // str="IF w EQ 2"

   p=pa=strtok(str," ");      // p=str="IF"

   p=strtok(NULL," ");      // p="w"

   pa=strtok(NULL,strtok(NULL," ")); //pa="2"

   while (eq1->next!=NULL)    //поиск в списке нужной переменной

     {  if (i>0) eq1=eq1->next;

       if (strcmp(eq1->name,p)==0) //если нашли её имя        {  if (eq1->cons==atoi(pa)) //и значения сходятся, т.е.  {   //условие директивы выполняется то устанавл. признак компиляции

     u=true;       break;   }}  i++; }}

void ObrIF() //если условная директива выполн., то чтение команд

{            // и запись их в выходной файл

  char str[80];

  if (u==false)        //если условная директива (???не) выполняется

   {  do {               //то чтение команд и запись их в выходной файл

 fgets(str,40,file_r); fprintf(file_w,str);     }

    while (!strstr(str,"ENDIF")); //чтение, пока не конец условной директивы

   }}

Підключаємий файл code.asm:

data segment

a   db   55

b   dw   44

c   db   33

data ends

code segment

assume ds:data,cs:code

begin:

                   mov         ax,data

                   mov         ds,ax

                   mov         cl,a

                   xor         bx,bx

@a:         add         bx,b

                   sub         bh,c

                   loop        @a

                   mov         c,bh

code ends

   end begin



Текст вхідного файлу:


INCLUDE code.asm

  w equ 2

  z equ 5

data segment

  a  dw  200

data ends

mac1 MACRO  b1,b2

      mov b1,04ch

      mov b2,3

      int 21h

ENDM mac1

mac2 MACRO d1,d3

      mov d1,35

      xor d3,a

      int 21h

ENDM mac2

code segment

    assume ds:data,cs:code

    begin:

           mov ax,data

           mov ds,ax

           sub a,10

IF w EQ 2

           mac1 dh,dl

           mac2 ax,bx

ENDIF

code ends

    end begin


Вихідні дані:формується той же файл (з ім’ям, заданим користувачем):


INCLUDE code.asm

data segment

a   db   55

b   dw   44

c   db   33

data ends

code segment

assume ds:data,cs:code

begin:

                mov         ax,data

                mov         ds,ax

                mov         cl,a

                xor         bx,bx

@a:         add         bx,b

                sub         bh,c

                loop        @a

                mov         c,bh

code ends

   end begin

  w equ 2

  z equ 5

data segment

  a  dw  200

data ends

mac1 MACRO  b1,b2

      mov b1,04ch

      mov b2,3

      int 21h

ENDM mac1

mac2 MACRO d1,d3

      mov d1,35

      xor d3,a

      int 21h

ENDM mac2

code segment

    assume ds:data,cs:code

    begin:

           mov ax,data

           mov ds,ax

           sub a,10

IF w EQ 2

           mac1 dh,dl

           mac2 ax,bx

ENDIF

code ends

    end begin


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